1、- 1 -一.问题描述:著名的多表古典加密体制使 Playfair,它将明文中的双字母组合作为一个单元对待,并将这些单元转换为密文双字母组合。Playfair 算法基于使用一个 55 字母矩阵,该矩阵使用一个关键词构造。这里有一个例子,是由 Lord Peter Wimsey 在 Dorothy Sayer 的书Have His Carcase中解答的。 M O N A R C H Y B D E F G I/J K L P Q S T U V W X Z 在这里,该关键词是 monarchy。该矩阵该矩阵是这样构造的;从左至右、从上至下填入该关键词的字母(去除重复字母) ,然后再以字母表顺序
2、将余下的字母填入矩阵剩余空间。字母 I 和 J 被算作一个字母。Playfair 根据下列规则一次对明文的两个字母加密: (1) 、属于相同对中的重复的明文字母将用一个填充字母进行分隔,因此,词balloon 将被加密为 ba lx lo on。 (2) 、属于该矩阵相同行的明文字母将由其右边的字母替代,而行的最后一个字母由行的第一个字母代替。例如,ar 被加密为 RM。 (3) 、属于相同列的明文字母将由它下面的字母代替,而列的最后一个字母由列的第一个字母代替。例如,mu 被加密为 CM。 (4) 、否则,明文的其他字母将由与其同行,且与下一个同列的字母代替。因此,hs 成为 BP,ea 成
3、为 IM(或 JM,这可根据加密者的意愿而定) 。 基本要求:二.基本要求:根据多表代换密码的特点,编写 playfair 软件,并以 monarchy 密钥进行测试,验证加密结果。三.实验代码:#include#includeusing namespace std;void decrypt();/解密函数void encrypt();/加密函数void main() coutn;if(n3)coutch1;int flg=1;while(flg=1)for(int i=0;iz|ch1ich2;coutch4;if(ch4=a)ch4=ch4-len;for(k=0;k=a)ch2k=ch2
4、k-len;for(k=0;kk;t-)ch2t+1=ch2t;ch2k+1=ch4;/若明文有奇数个字符,则添加一个无关字符以凑够偶数个if(strlen(ch2)%2!=0)- 5 -ch2strlen(ch2)+1=ch2strlen(ch2);/字符串结尾赋0ch2strlen(ch2)=ch4;/明文串尾插入无关字符cout4)n1=n1%5;m1=m1+1;if(n24)n2=n2%5;m2=m2+1;if(m1=m2)ch2k=chm1(n1+1)%5;ch2k+1=chm2(n2+1)%5;else if(n1=n2)ch2k=ch(m1+1)%5n1;ch2k+1=ch(m2
5、+1)%5n2;- 6 -elsech2k=chm1n2;ch2k+1=chm2n1;coutch1;while(flg=1)for(int i=0;iz|ch1ich2;for(int k=0;k=a)- 8 -ch2k=ch2k-len;for( k=0;k4)n1=n1%5;m1=m1+1;if(n24)n2=n2%5;m2=m2+1;if(m1=m2)ch2k=chm1(n1+4)%5;ch2k+1=chm2(n2+4)%5;else if(n1=n2)ch2k=ch(m1+4)%5n1;ch2k+1=ch(m2+4)%5n2;elsech2k=chm1n2;ch2k+1=chm2n1
6、;cout“解密后所得到的明文是:“;for(k=0;kstrlen(ch2);k+=2)coutch2kch2k+1“ “;coutendl;else break;四.测试情况:_| | 多表代换密码 Playfair 的实现 | 欢迎使用本程序 |_|_| 选择你所需要的操作: | 1.为字符串加密 | 2.为字符串解密 | 3.结 束 程 序 |_|选择操作:1- 10 -_| 加密结束 |_|输入密钥:123请重新选择操作:_| 选择你所需要的操作: | 1.为字符串加密 | 2.为字符串解密 | 3.结 束 程 序 |_|选择操作:1_| 加密结束 |_|输入密钥:monarchy密
7、钥填充后的矩阵为:M O N A RC H Y B DE F G I KL P Q S TU V W X Z请输入明文:sunhongguo输入无关字符:x经过处理后的明文为:SU NH ON GX GU OX其最终长度为:12加密后所得到的密文是:LX OY NA IW EW AV_| 选择你所需要的操作: | 1.为字符串加密 | 2.为字符串解密 | 3.结 束 程 序 |_|选择操作:2_| 解密结束 |_|输入密钥:monarchy密钥填充后的矩阵为:M O N A RC H Y B DE F G I KL P Q S TU V W X Z- 11 -请输入密文:sun字符串不能为奇
8、数个!请重新输入。请输入密文:sunhongg同一分组中不能出现相同字符!请重新输入。请输入密文:lxoynaiwewav解密后所得到的明文是:SU NH ON GX GU OX_| 选择你所需要的操作: | 1.为字符串加密 | 2.为字符串解密 | 3.结 束 程 序 |_|选择操作:9无该项操作,请重来:_| 选择你所需要的操作: | 1.为字符串加密 | 2.为字符串解密 | 3.结 束 程 序 |_|选择操作:rytery无该项操作,请重来:_| 选择你所需要的操作: | 1.为字符串加密 | 2.为字符串解密 | 3.结 束 程 序 |_|选择操作:3_| 程序结束,谢谢您的使用 ! _ |_|请按任意键继续. . .五.总结Playfair 加密与解密过程是一样的,本程序在最初设计时未考虑容错能力,经老师指导,做简单修改后,已经具备容错能力,详细测试情况见四。