多表代换密码playfair的实现

上传人:小** 文档编号:89501280 上传时间:2019-05-26 格式:DOC 页数:11 大小:46KB
返回 下载 相关 举报
多表代换密码playfair的实现_第1页
第1页 / 共11页
多表代换密码playfair的实现_第2页
第2页 / 共11页
多表代换密码playfair的实现_第3页
第3页 / 共11页
多表代换密码playfair的实现_第4页
第4页 / 共11页
多表代换密码playfair的实现_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《多表代换密码playfair的实现》由会员分享,可在线阅读,更多相关《多表代换密码playfair的实现(11页珍藏版)》请在金锄头文库上搜索。

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成为IM(或JM,这可根据加密者的意愿而定)。 基本要求:二.

3、基本要求:根据多表代换密码的特点,编写playfair软件,并以monarchy密钥进行测试,验证加密结果。三. 实验代码:#include#includeusing namespace std;void decrypt();/解密函数void encrypt();/加密函数void main() cout _endl;cout| |endl;cout| 多表代换密码Playfair的实现 |endl;cout| 欢迎使用本程序 |endl;cout|_|endl;int n=0;for(;n!=3;) cout _endl;cout | 选择你所需要的操作: |endl;cout | 1.为

4、字符串加密 |endl;cout | 2.为字符串解密 |endl;cout | 3.结 束 程 序 |endl;cout |_|endl;coutn;if(n3)cout无该项操作,请重来:endl;switch(n)case 1:cout_endl;cout| 加密结束 |endl;cout|_|endl;encrypt();break;case 2:cout_endl;cout| 解密结束 |endl;cout|_|endl;decrypt();break;case 3:cout_endl;cout| 程序结束,谢谢您的使用! _ |endl;cout|_|endl;coutendl;b

5、reak;default:break;system(pause);void encrypt()const int N=100;char letters26=ABCDEFGHIKLMNOPQRSTUVWXYZ;/用于填充矩阵int flag25=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;/字母是否已在矩阵中,与letters数组对应char ch55;/5X5矩阵char ch1N;/密钥char ch2N;/明文char ch4;/无关字符int len=a-A;coutch1;int flg=1;while(flg=1)for(int

6、 i=0;iz|ch1ia)cout请重新选择操作:endl; flg=0;break;elsech1i=ch1i-len; if(flg=1)for(i=0;istrlen(ch1);i+)/把密钥中的J都变为Iif(ch1i=J)ch1i=I;i=0;int j=0;/把密钥中的字母填入到矩阵中,并把该字母标记为已用for(int k=0;kstrlen(ch1);k+)for(int t=0;t25;t+)if(ch1k=letterst&flagt=0)chij=letterst;flagt=1;if(j4)j+;else i+;j=0;for( k=0;k25;k+)/按字母表顺序把

7、未用字母依次填入到矩阵中if(flagk=0)chij=lettersk;flagk=1;if(j4)j+;elsei+;j=0;cout密钥填充后的矩阵为: endl;for(i=0;i5;i+)for(j=0;j5;j+)coutchij;cout ;if(j=4) coutendl;coutendl;coutch2;coutch4;if(ch4=a)ch4=ch4-len;for(k=0;k=a)ch2k=ch2k-len;for(k=0;kstrlen(ch2);k+)/把明文中的J都变为Iif(ch2k=J)ch2k=I;/为明文添加必要的无关字符以防止同一组的两个字符相同for(

8、k=0;kk;t-)ch2t+1=ch2t;ch2k+1=ch4;/若明文有奇数个字符,则添加一个无关字符以凑够偶数个if(strlen(ch2)%2!=0)ch2strlen(ch2)+1=ch2strlen(ch2);/字符串结尾赋0ch2strlen(ch2)=ch4;/明文串尾插入无关字符cout经过处理后的明文为:;for(k=0;kstrlen(ch2);k+=2)coutch2kch2k+1 ;coutendl;cout其最终长度为:strlen(ch2)endl;/明文输入并整理完毕/for(k=0;kstrlen(ch2);k+=2)int m1,m2,n1,n2;for(m1=0;m1=4;m1+)for(n1=0;n1=4;n1+)if(ch2k=chm1n1)break;if(ch2k=chm1n1)break;for(m2=0;m2=4;m2+)for(n2=0;n24)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;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号