} void
} else
s++;
/*s用来跳过明文中的空格字符*/
r[i] = m[i];
r[i] = 0;
/*密文字符串结束符*/
ISD_Vigenere_decrypt(char c[], char k[], char m[]) { }
void main(int argc, char *argv[]) {
char m[1024];
printf(\古典密码算法演示程序\); char command; printf(\);
cout << \输入v:维吉尼亚加密!\\n\; cout << \输入h:获得帮助!\\n\; cout << \输入e:退出程序!\\n\; cout << \请输入指令:\; switch {
case 'v': {
char k[] = \; (command) int i, j, s = 0; j = strlen(k); for (i = 0; c[i]; i++)
c[i] = tolower(c[i]); k[i] = tolower(k[i]); if (isalpha(c[i])) { } else
m[i] = c[i];
m[i] = (c[i] - k[s%j] + 26) % 26 + 'a'; s++;
for (i = 0; k[i]; i++) for (i = 0; c[i]; i++)
m[i] = 0;
loop: cin >> command;
}
}
}
cout<< \; cin>>m; char c[80]; char d[80];
ISD_Vigenere_crypt(m, k, c); ISD_Vigenere_decrypt(c, k, d); cout << \明文: \; puts(m);
cout << \密钥: \; puts(k);
cout << \加密结果: \; puts(c);
cout << \解密结果: \; puts(d); goto loop;
case 'e': { } case 'h':
; { }
cout << \输入v:维吉尼亚加密!\\n\; cout << \输入h:获得帮助!\\n\; cout << \输入e:退出程序!\\n\; goto loop;
return;
default:
goto loop;
九、 实验结果及分析:
测试程序,结果正确,如下图所示:
明文 nomo reco unti ngdo llar s 密钥 be s t best best best best b 加密 os eh siuh vrlb okvh mpsk t 解密nomo reco unti ngdo llar s 验证结果与输出一致,正确
十、 实验结论:
维吉尼亚密码加密方法是根据密钥内容,对输入的明文的字母进行替换,在密钥长度大于1的情况下,通常来说相同的字母也会由于对应的密钥字符不同而被不同的字符所替换,因此在一定程度上来说保证了加密技术的安全性,但是若已知密钥的长度且有足够多样本的情况下,同样也可以做词频分析从而破译密码。
十一、 总结及心得体会:
维吉尼亚密码作为古典密码中的一种,加密原理简单易懂,程序实现也没有太大的困难,并且在密钥长度较长时加密安全性也可以有一定保证,较难破译,但用频率分析法可以破译已知密钥长度的密文,因此对于现代技术来说容易破译,但通过学习维吉尼亚密码学到了其加密的原理和基于统计破译密码的思想,收获很大。
实 验 报 告
学生姓名 李昕宜 学号 201500130052 指导老师 实验地点 N3 实验时间 2018/3/20 班级 一班
一、 实验室名称:
SimpleSPC信息安全云实验系统
二、 实验项目名称:
古典密码——代换密码
三、 实验学时:
1学时
四、 实验原理:
1) 单表代换密码
a) 加法密码
A和B是有 n个字母的字母表。
定义一个由A到B的映射:f:A→B
f(ai )= bi=aj
j=i+k mod n
加法密码是用明文字母在字母表中后面第 k个字母来代替。
K=3 时是著名的凯撒密码。
恺撒密码——历史上第一个密码技术
“恺撒密码”是古罗马恺撒大帝在营救西塞罗战役时用来保护重要军情的加密系统(《高卢战记》)。
b) 乘法密码
A和B是有n个字母的字母表。?定义一个由A到B的映射:f:A→B f(ai )= bi= aj j=ik mod n 其中,(n,k)=1。注意:只有(n,k)=1,才能正确解密。
c) 密钥词组代替密码
随机选一个词语,去掉其中的重复字母,写到矩阵的第一行,从明文字母表中去掉这第一行的字母,其余字母顺序写入矩阵。然后按列取出字母构成密文字母表
2) 多表代换密码
单表代替密码的安全性不高,一个原因是一个明文字母只由一个密文字母代替。可以利用频率分析来破译。故产生了更为安全的多表代换密码,即构造多个密文字母表,在密钥的控制下用以一系列代换表依次对明文消息的字母序列进行代换。著名的多表代替密码有Vigenere密码等。
a) Vernam密码
明文、密文、密钥都表示为二进制位:
M=m1,m2,… ,mn K =k1,k2,… ,kn C =c1,c2,… ,cn
b) Playfair密码
用密钥控制生成矩阵,然后每两个字母为单位进行代换。
c) Hill密码(乘积密码)
建立在矩阵相乘的基础上,但不能抵抗已知明文攻击。
五、 实验目的:
1) 学习代换密码的原理
2) 学习代换密码的算法实现
六、 实验内容:
1.在虚拟机上运行代换密码.exe可执行文件,根据提示输入明文和密钥,同时输入之前得到的密文和密钥检查输出的解密后的结果是否与明文一致。