playfair加密解密_第1页
playfair加密解密_第2页
playfair加密解密_第3页
playfair加密解密_第4页
playfair加密解密_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include<iostream>#include<cstring>using namespace std;/加密算法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;/无关字

2、符int len='a'-'a'cout<<"输入密钥(a-z):"cin>>ch1;int flg=1;while(flg=1)for(int i=0;i<strlen(ch1);i+)/把所输入的密钥转化为大写字母if(ch1i>'z'|ch1i<'a')cout<<"请重新选择操作:"<<endl; flg=0;break;elsech1i=ch1i-len; if(flg=1)for(i=0;i<strlen(c

3、h1);i+)/把密钥中的j都变为iif(ch1i='j')ch1i='i'i=0;int j=0; /把密钥中的字母填入到矩阵中,并把该字母标记为已用for(int k=0;k<strlen(ch1);k+) for(int t=0;t<25;t+)if(ch1k=letterst&&flagt=0)chij=letterst;flagt=1;if(j<4)j+;else i+;j=0;for( k=0;k<25;k+)/按字母表顺序把未用字母依次填入到矩阵中if(flagk=0)chij=lettersk;flagk=

4、1;if(j<4)j+;elsei+;j=0;cout<<"密钥填充后的矩阵为: "<<endl;for(i=0;i<5;i+) for(j=0;j<5;j+)cout<<chij;cout<<" "if(j=4) cout<<endl;cout<<endl;cout<<"请输入明文(大写英文字符a-z):"cin>>ch2;cout<<"输入一个无关字符:"cin>>ch4;i

5、f(ch4>='a')ch4=ch4-len;for(k=0;k<strlen(ch2);k+)/把所输入的明文转化为大写字母if(ch2k>='a')ch2k=ch2k-len;for(k=0;k<strlen(ch2);k+)/把明文中的j都变为iif(ch2k='j')ch2k='i'/为明文添加必要的无关字符以防止同一组的两个字符相同for( k=0;k<strlen(ch2);k+=2) if(ch2k=ch2k+1)for(int t=strlen(ch2);t>k;t-)ch2t+

6、1=ch2t;ch2k+1=ch4; /若明文有奇数个字符,则添加一个无关字符以凑够偶数个if(strlen(ch2)%2!=0) ch2strlen(ch2)+1=ch2strlen(ch2);/字符串结尾赋'0'ch2strlen(ch2)=ch4;/明文串尾插入无关字符cout<<"经过处理后的明文为:"for(k=0;k<strlen(ch2);k+=2)cout<<ch2k<<ch2k+1<<" "cout<<endl;cout<<"其最终长

7、度为:"<<strlen(ch2)<<endl;for(k=0;k<strlen(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;n2<=4;n2+)if(ch2k+1=chm2n2)break;if(ch2k+1=chm2n2)break;m1=m1%5;m2=m2%5;if(n1>4

8、)n1=n1%5;m1=m1+1;if(n2>4)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+1)%5n2;elsech2k=chm1n2;ch2k+1=chm2n1;cout<<"加密后所得到的密文是:"for(k=0;k<strlen(ch2);k+=2)cout<<ch2k<<ch2k+1<<" "cout<<

9、;endl;else break;/解密算法void decrypt()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;/密文int len='a'-'a'int flg=1;cout<<"输入

10、密钥(a-z):"<<endl;cin>>ch1;while(flg=1)for(int i=0;i<strlen(ch1);i+)/把所输入的密钥转化为大写字母if(ch1i>'z'|ch1i<'a')cout<<"请重新选择操作:"<<endl; flg=0;break;elsech1i=ch1i-len; if(flg=1)for(i=0;i<strlen(ch1);i+)/把密钥中的j都变为iif(ch1i='j')ch1i='i

11、'i=0;int j=0;/把密钥中的字母填入到矩阵中,并把该字母标记为已用for(int k=0;k<strlen(ch1);k+) for( int t=0;t<25;t+)if(ch1k=letterst&&flagt=0)chij=letterst;flagt=1;if(j<4)j+;else i+;j=0;for( k=0;k<25;k+)/按字母表顺序把未用字母依次填入到矩阵中if(flagk=0)chij=lettersk;flagk=1;if(j<4)j+;elsei+;j=0;cout<<"密钥填充后

12、的矩阵为: "<<endl;for(i=0;i<5;i+)for(j=0;j<5;j+)cout<<chij;cout<<" "if(j=4) cout<<endl;cout<<endl;int f=0; /矩阵生成完毕/docout<<"请输入密文(大写英文字符a-z):"cin>>ch2;for(int k=0;k<strlen(ch2);k+)/把所输入的密文转化为大写字母if(ch2k>='a')ch2k=ch2k

13、-len;for( k=0;k<strlen(ch2);k+)/把密文中的j都变为iif(ch2k='j')ch2k='i'for( k=0;k<strlen(ch2);k+=2)if(ch2k=ch2k+1)cout<<"同一分组中不能出现相同字符!请重新输入。"<<endl;f=1;break;else f=2;if(f=1)continue;if(strlen(ch2)%2!=0)cout<<"字符串不能为奇数个!请重新输入。"<<endl;f=1;else

14、 f=2;while(f=1); /解密开始for( k=0;k<strlen(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;n2<=4;n2+)if(ch2k+1=chm2n2)break;if(ch2k+1=chm2n2)break;m1=m1%5;m2=m2%5;if(n1>4)n1=n1%5;m1=m1+1;if(n2>4)n

15、2=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;cout<<"解密后所得到的明文是:"for(k=0;k<strlen(ch2);k+=2)cout<<ch2k<<ch2k+1;cout<<endl; else break;void main() cout<<"*算法说明*"<<endl;cout<<"*由于playfair算法过程是将明文两两分组,因此需要保证明文个数为偶数*"<<endl; cout<<"* 当输入明文个数为奇数,则解密后的明文会出现你输入的无关字符 *"<<endl; cout<<"* 当输入明文个数为偶数,则不会出现你输入的无关字符 *"<<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论