古典密码之维吉尼亚密码实验

article/2025/9/24 15:02:36

学习目标:

维吉尼亚密码是古典密码中非常具有代表的例子。本实验要求用高级语言编写和调试一个简单的维吉尼亚密码实现及解密程序,通过本实验可以加深理解维吉尼亚密码原理。


预备知识:

人们在单一恺撒密码的基础上扩展出多表密码,称为“维吉尼亚”密码。它是由16世纪法国亨利三世王朝的布莱瑟•维吉尼亚发明的。维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。维吉尼亚密码的密钥空间大小为26m,所以即使m的值很小,使用穷尽密钥搜索方法也需要很长的时间。例如,当m=5时,密钥空间大小超过1.1*107,这样的密钥量已经超出了使用手算进行穷尽搜索的能力范围。

维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密:

TO BE OR NOT TO BE THAT IS THE QUESTION

当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:

密钥:RELAT IONSR ELATI ONSRE LATIO NSREL

明文:TOBEO RNOTT OBETH ATIST HEQUE STION

密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY

历史上以维吉尼亚密表为基础又演变出很多种加密方法,其基本元素无非是密表与密钥,并一直沿用到二战以后的初级电子密码机上。

加密流程:

(1)编号。将A-Z以编号0-25编号;

(2)选取密钥。举例:wangyuhang;

(3)明文处理。去掉所有空格;举例:明文为we are discovered save yourself;处理后:wearediscoveredsaveyourself;

(4)密钥处理。将密钥重复排列;处理后:wangyuhangwangyuhangwangyuh;

(5)加密。举例:明文第一个字母W编码为22,密钥第一个字母为W编码为22;22+22=44,因为44>26,所以44-26=18;18对应字母为Q,故将W加密为Q;明文第二个字母E编码为4,密钥第二个字母为A编码为0;4+0=4,4对应字母为E,故将E加密为E;以此类推;

(6)输出密文。举例:senxadvyyoikneqywvrekueyals。

解密流程:

(1)编号。将A-Z以编号0-25编号;

(2)获取密钥。举例:wangyuhang;

(3)密文处理。去掉所有空格;处理后:senxadvyyoikneqywvrekueyals;

(4)密钥处理。将密钥重复排列;处理后:wangyuhangwangyuhangwangyuh;

(5)解密。举例:密文第一个字母Q编码为18,密钥第一个字母为W编码为22;18-22=-4,因为-4<0,所以-4+26=22;22对应字母为W,故将Q解密为W;密文第二个字母E编码为4,密钥第二个字母为A编码为0;4-0=4,4对应字母为E,故将E解密为E,以此类推;

(6)明文处理。根据相关语言释读,按照正确的语言格式整理明文;举例:we are discovered save yourself。


实验代码:

#include <iostream> 
#include <cstring> 
using namespace std;
#define MINCHAR 97
#define CHARSUM 26
char table[CHARSUM][CHARSUM];
bool Init();
bool Encode(char* key, char* source, char* dest);
bool Dncode(char* key, char* source, char* dest);
int main()
{if(!Init()){cout << "初始化错误!" << endl;return 1;}char key[256];char str1[256];char str2[256];int operation;while(1){do{cout << "请选择一个操作:1. 加密;2. 解密;-1. 退出\n";cin >> operation;}while(operation != -1 && operation != 1 && operation != 2);if(operation == -1)return 0;else if(operation == 1)//加密{cout << "请输入密钥:";cin >> key;cout << "请输入待加密字符串:";cin >> str1;Encode(key, str1, str2);cout << "加密后的字符串:" << str2 << endl;}else if(operation == 2)//解密{cout << "请输入密钥:";cin >> key;cout << "请输入待解密字符串:";cin >> str1;Dncode(key, str1, str2);cout << "解密后的字符串:" << str2 << endl;}cout << endl;}return 0;
}
// 初始化维吉尼亚方阵
bool Init()
{int i, j;for(i = 0; i < CHARSUM; i++){for(j = 0; j < CHARSUM; j++){table[i][j] = 65 + (i + j) % CHARSUM;}}return true;
}
// 加密
// key:密钥
// source:待加密的字符串
// dest:经过加密后的字符串
bool Encode(char* key, char* source, char* dest)
{char* tempSource = source;char* tempKey = key;char* tempDest = dest;do{*tempDest = table[(*tempKey) - MINCHAR][(*tempSource) - MINCHAR];tempDest++;if(!(*(++tempKey)))tempKey = key;}while(*tempSource++);dest[strlen(source)] = 0;return true;
}
// 解密
// key:密钥
// source:待解密的字符串
// dest:经过解密后的字符串
bool Dncode(char* key, char* source, char* dest)
{char* tempSource = source;char* tempKey = key;char* tempDest = dest;char offset;do{offset = (*tempSource) - (*tempKey);offset = offset >= 0 ? offset : offset + CHARSUM;*tempDest = MINCHAR + offset;tempDest++;if(!(*(++tempKey)))tempKey = key;}while(*++tempSource);dest[strlen(source)] = 0;return true;
}

实验结果:

实验截图

思考:

1.维吉尼亚密码属于单表密码还是多表密码?

2.维吉尼亚密码中加密密钥和解密密钥相同吗?

答案:

1.多表密码。

2.相同。


http://chatgpt.dhexx.cn/article/2tFfcPQv.shtml

相关文章

【密码学算法实现】古典密码

文章目录 2.1 代替技术2.1.1 仿射密码2.1.2 单表代替密码2.1.3 Hill密码Hill密码的已知明文攻击 2.1.4 Vigenere密码 2.2 置换技术2.2.1 栅栏密码2.2.2 矩阵密码 作为较为朴素的密码体系&#xff0c;古典密码通常都是对称的。如下图所示&#xff0c;对称密码通常是加密方与解密…

密码学-古典密码学习笔记

文章目录 参考资料替代技术单字母表替代密码凯撒密码移位密码仿射密码针对单字母表替代密码的攻击 多字母表替代密码Vigenere密码Hill密码(希尔密码) 置换技术置换密码的定义案例 本文作为一篇学习笔记&#xff0c;在图片和文字上大量参考了各种密码学书籍&#xff0c;并添加了…

古典密码算法实验c语言,古典密码实验报告.doc

古典密码实验报告.doc 哈尔滨工程大学实验报告实验名称古典密码算法班级学号姓名实验时间2014年4月成绩指导教师实验室名称哈尔滨工程大学实验室与资产管理处制一、实验名称古典密码算法2、实验目的通过编程实现经典的代替密码算法和置换密码&#xff0c;包括移位密码、维吉尼…

古典密码学学习笔记

1.历史 古典密码阶段&#xff1a;1949年以前 近代密码阶段&#xff1a;1949-1975年 现代密码阶段&#xff1a;1976年至今 2.加密方法 古典密码学的加密方法主要有两大类&#xff1a;替代和置换&#xff0c;或者是两者的结合 3.基本密码 1.键盘布局加密 这是一种比较简单也…

古典密码

古典密码将明文的每一个字母代换为字母表中的另一个字母&#xff0c;代换前现将明文字母用等价的十进制数字代替&#xff0c;使用十进制进行运算。 字母abcdefghijklm数字0123456789101112 字母nopqrstuvwxyz数字13141516171819202122232425 根据代换是对每个字母逐个进行还是…

初学古典密码

古典密码 目录 古典密码 Wiki篇 二&#xff0c;凯撒密码Caesar&#xff1a; 三&#xff0c;移位密码 四&#xff0c;Atbash Cipher&#xff08;埃特巴什码&#xff09;&#xff1a; 五&#xff0c;简单替换密码 六&#xff0c;仿射密码(affine cipher&#xff09; 多表…

简单古典密码

1. 简单移位密码 m "{easy_easy_crypto}" k 3124 明文所在位置1234密文所在位置3124 flag{easy_easy_crypto}lafgea{s_eyay_scyprt}o 攻击方法:肉眼识别/爆破秘钥/根据flag字符串逆推 2. 曲路密码 明文填入一个表中&#xff0c;并按照一定的曲路遍历攻击方法…

古典密码技术

古典密码技术 古典密码是密码学中的其中一个类型&#xff0c;其大部分加密方式都是利用替换式密码或移项式密码&#xff0c;有时则是两者的混合。其于历史中经常使用&#xff0c;但在现代由于计算机的出现&#xff0c;使得古典密码解密已经不再困难&#xff0c;已经很少使用&a…

古典密码简记

目录 概述 传统隐写 替换密码技术 换位密码技术&#xff1a; 安全性分析 概述 古典密码只是对字母进行变换&#xff0c;而现代密码算法是对比特流进行变换。 古典密码技术比较简单&#xff0c;通常 采用手工或机械操作来对明文进行加密和解密的。&#xff08;例&#xf…

常见古典密码

古典密码 文章目录 古典密码前言1.Affine(仿射加密)2.Bacon(培根加密)3.Brainfuck4.Caesar(凯撒加密)5.Fence(栅栏加密)6.Fenham(费纳姆加密)7.Morse(摩斯密码)8.Pigen(猪圈加密)9.Vigenere(维吉尼亚加密) 前言 系统的学习了一下古典密码&#xff0c;这里大概整理一下主要的加…

古典密码学

主要划分方式及其分类 按密钥方式划分&#xff1a;对称&#xff0c;非对称 按明文处理方式分&#xff1a;块密码&#xff0c;流密码 按编制原理划分&#xff1a;代换&#xff0c;置乱 对称加密算法 对称加密算法 对称加密算法&#xff08;synmetric algorithm&#xff09;&…

古典密码总结

古典密码 凯撒密码凯撒位移&#xff08;中文版&#xff09; 栅栏密码棋盘密码乘法密码仿射密码希尔密码摩斯电码猪圈密码键盘密码参考 凯撒密码 加密公式&#xff1a;密文 (明文 位移数) Mod 26 解密公式&#xff1a;明文 (密文 - 位移数) Mod 26 凯撒位移&#xff08;中…

古典密码(部分合集)

古典密码 一. 移位密码1. 简单移位密码2. 曲路密码3. 云影密码4. 栅栏密码 二. 代替密码单表代替密码1.凯撒密码2.ROT133.埃特巴什密码4.经典单表替代密码5.摩斯密码6.培根密码7.图形替换密码猪圈密码圣堂武士密码标准银河密码 8.仿射密码 多表代替密码1.棋盘密码PlayfairPolyb…

密码学:古典密码.

密码学&#xff1a;古典密码. 古典密码是密码学的一个类型&#xff0c;大部分加密方式是利用替换式密码或移项式密码&#xff0c;有时是两者的混合。古典密码在历史上普遍被使用&#xff0c;但到现代已经渐渐不常用了。一般来说&#xff0c;一种古典密码体制包含一个字母表(如…

古典密码汇总。

一、密码类型汇总 23、维吉尼亚密码&#xff08;Vigenre Cipher&#xff09; 【Vigenre Cipher】 由于频率分析法可以有效的破解单表替换密码&#xff0c;法国密码学家维吉尼亚于1586年提出一种多表替换密码&#xff0c;   即维吉尼亚密码&#xff0c;也称维热纳尔密码。维…

SourceTree的使用

SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端&#xff0c;拥有可视化界面&#xff0c;容易上手操作。同时它也是Mercurial和Subversion版本控制系统工具。支持创建、提交、clone、push、pull 和merge等操作。 二、下载安装SourceTree步骤 1、下载地址&#xf…

SourceTree使用教程图文详解

作者的其他平台&#xff1a; | CSDN&#xff1a;https://blog.csdn.net/qq_41153943 | 掘金&#xff1a;https://juejin.cn/user/651387938290686 | 知乎&#xff1a;https://www.zhihu.com/people/1024-paper-96 | GitHub&#xff1a;https://github.com/JiangXia-1024?t…

Sourcetree打开之后,闪退,问题处理

1、环境&#xff1a;win11 Sourcetree版本3.4.7 2、处理办法&#xff0c;在资源管理器地址栏输入“%LocalAppData%\Atlassian”&#xff0c;删掉“SourceTree.exe_Url_ampbpf5kvqim4xxkhaykobjynfannkxz”&#xff08;非SourceTree目录&#xff09;&#xff0c;打开正常。

Sourcetree查看某个文件提交历史记录

1、在文件状态右上角搜索要查看的文件名 2、选择查看的文件名右键 点击变更历史即可

sourcetree使用

由于在工作中负责线上代码的部署和控制&#xff0c;所以对SourceTree的使用场景和使用技巧进行了全面系统的研究和实践&#xff0c;并以经验连载的形式进行了分享。该经验主要是对这些连载经验进行整体的概述&#xff0c;以方便大家的查阅和参考。 方法/步骤 SourceTree使用的…