1、实 验 报 告一、 实验室名称:SimpleSPC 信息安全云实验系统二、 实验项目名称:古典密码置换密码三、 实验学时:1 学时四、 实验原理:1) 算法原理a) 置换密码算法是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据密钥给出的矩阵置换产生新的矩阵,从而恢复明文。b) 置换密码(Permutation Cipher) ,又称换位密码。算法实施时,明文的字母保持相同,但顺
2、序会被打乱。置换只不过是一个简单的换位,每个置换都可以用一个置换矩阵 Ek 来表示。每个置换都有一个与之对应的逆置换 Dk。置换密码的特点是仅有一个发送方和接受方知道的加密置换(用于加密)及对应的逆置换(用于解密) 。它是对明文 L 长字母组中的字母位置进行重新排列,而每个字母本身并不改变。c) 设 n 为一固定整数,P、C 和 K 分别为明文空间、密文空间和密钥空间。明 /密文是长度为 n 的字符序列,分别记为 X(x1,x2 ,,xn)属于 P 和Y(y1,y2,yn)属于 C ,K 是定义在1,2,n的所有置换组成的集合。对任何一个密钥(即一个置换) ,定义置换如下:加密置换为:解密置换
3、为:上式中,是的逆置换,密钥空间 K 的大小为 n!2) 算法参数置换密码算法主要有 c、m、k、n 四个参数。c 为密文,m 是明文,k 为密钥,n 为模数。3) 算法流程 算法流程。如图所示五、 实验目的:1) 学习置换密码的原理2) 学习置换密码的算法实现六、 实验内容: 1.在虚拟机上运行置换密码.exe 可执行文件,根据提示输入明文和密钥,同时检查输出的解密后的结果是否与明文一致。2.学习掌握置换密码的原理,并根据明文和密钥计算出对应的加密文,并与程序输出的结果进行比对,掌握其加密解密的过程。3.看懂实验程序代码,如有需要可在其上进行优化。七、 实验器材(设备、虚拟机名称):Wind
4、ows 7工具:C:tools密码学课程01 密码学算法02 古典密码01 置换密码八、 实验步骤:1、查看置换密码算法运行结果并学习其核心算法1.1 点击【置换密码.exe】 ,选择对明文【asdfgh】使用密钥【qwerty】进行加密,程序运行结果。如下图所示 但是在实验中发现,当密钥中包含相同字符时,加密和解密结果会出现问题,如下图所示:在观察程序代码后,发现应该是加密表生成出现问题,因此在实验中我重新修改了程序中计算加密表部分的代码,利用双层循环,对于每一个字符,计算比其小的字符或者和它一样但是出现在其左侧的字符个数,得到的序列便是加密表的内容,将程序按照上述思路修改后测试运行正确。1
5、.2 更新后的置换密码的核心算法如下所示。#include#includeusing namespace std;char a206, b206, c206, m102, key6, ky6, mw102, bb102;int zh6, zh16;int j, len, length, e, f;voidISD_zhihuan_zhihuan(int le)int i, s = 0;if (le % 6 = 0)/明文长度是6的倍数时for (j = 0; j key;for (int p = 0; p m;while (mk != 0)/计算明文长度k+; len = k;cout #inc
6、lude #include #include #include using namespace std;void ISD_Vigenere_crypt(char m, char k, char r)int i, j, s = 0;j = strlen(k);for (i = 0; mi; i+)mi = tolower(mi);for (i = 0; ki; i+)ki = tolower(ki);for (i = 0; mi; i+)if (isalpha(mi)ri = (mi - a + ks%j - a) % 26 + a;s+;/*s用来跳过明文中的空格字符*/elseri = mi
7、;ri = 0;/*密文字符串结束符*/voidISD_Vigenere_decrypt(char c, char k, char m)int i, j, s = 0;j = strlen(k);for (i = 0; ci; i+)ci = tolower(ci);for (i = 0; ki; i+)ki = tolower(ki);for (i = 0; ci; i+)if (isalpha(ci)mi = (ci - ks%j + 26) % 26 + a;s+;elsemi = ci;mi = 0;void main(int argc, char *argv)char m1024;p
8、rintf(“古典密码算法演示程序“);char command;printf(“n“);cout command;switch(command)case v:char k = “best“;coutm;char c80;char d80;ISD_Vigenere_crypt(m, k, c);ISD_Vigenere_decrypt(c, k, d);cout #include using namespace std;int main()cout m;cout k;int i = 0;for (; i com;cout k;cout #include “conio.h“#include us
9、ing namespace std;void ISD_yiwei_Secret(string for (i = 0; iz)codei = (codei + k) % z) + a - 1;elsecodei = codei + k;codei = codei - 32;void ISD_yiwei_Public(string for (i = 0; i n;switch (n)case 0:cout k;cout code;ISD_yiwei_Secret(code, k);cout code;cout k;ISD_yiwei_Public(code, k);cout “n原文为:n“ co
10、de endl;break;default:cerr “输入错误! n“;while (!_kbhit();return 0;九、 实验结果及分析:测试修改后的程序,结果正确,如下图所示:在加密过程中对于每个字符进行(ASCII 值+13)%26+A的计算,可证明加密结果正确。同样解密过程中上式加号变减号,且转换为对应字母的小写字母,可以验证结果正确。程序无误。十、 实验结论:移位密码实际上是代换密码的一个特例,其思想比较简单,密钥空间较小,属于单表代换密码,即每个字符对应的加密字符都是固定对应的,实现起来也比较简单,可对字符的 ASCII 码值进行操作得到加密的结果。十一、 总结及心得体会:移位密码中的凯撒密码是我们之前已熟悉的经典古典密码之一,移位密码的思想实在凯撒密码的基础上进行了扩展,但思想仍比较简单,其加密和解密都比较容易实现,通过读程序源码对算法的原理有了更深的理解。