多表代换密码playfair的实现

更新时间:2024-07-10 05:53:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一. 问题描述:

著名的多表古典加密体制使Playfair,它将明文中的双字母组合作为一个单元对待,并将这些单元转换为密文双字母组合。Playfair算法基于使用一个5×5字母矩阵,该矩阵使用一个关键词构造。这里有一个例子,是由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。该矩阵该矩阵是这样构造的;从左至右、从上至下填入该关键词的字母(去除重复字母),然后再以字母表顺序将余下的字母填入矩阵剩余空间。字母I和J 被算作一个字母。Playfair根据下列规则一次对明文的两个字母加密: (1)、属于相同对中的重复的明文字母将用一个填充字母进行分隔,因此,词balloon将被加密为ba lx lo on。 (2)、属于该矩阵相同行的明文字母将由其右边的字母替代,而行的最后一个字母由行的第一个字母代替。例如,ar被加密为RM。 (3)、属于相同列的明文字母将由它下面的字母代替,而列的最后一个字母由列的第一个字母代替。例如,mu被加密为CM。 (4)、否则,明文的其他字母将由与其同行,且与下一个同列的字母代替。因此,hs成为BP,ea成为IM(或JM,这可根据加密者的意愿而定)。 基本要求: 二. 基本要求:

根据多表代换密码的特点,编写playfair软件,并以monarchy密钥进行测试,验证加密结果。 三. 实验代码:

#include #include using namespace std;

void decrypt();//解密函数 void encrypt();//加密函数 void main() {

cout<<\ cout<<\ |\ cout<<\ 多表代换密码Playfair的实现 |\ cout<<\ 欢迎使用本程序 |\ cout<<\

- 1 -

int n=0; for(;n!=3;) { cout<<\ ____________________________\ cout<<\ | 选择你所需要的操作: |\ cout<<\ | 1.为字符串加密 |\ cout<<\ | 2.为字符串解密 |\ cout<<\ | 3.结 束 程 序 |\ cout<<\ |___________________________|\ cout<<\ 选择操作:\ cin>>n; if(n<1||n>3)cout<<\无该项操作,请重来:\ switch(n) { case 1: cout<<\ cout<<\ 加密结束 |\ cout<<\ encrypt(); break; case 2: cout<<\ cout<<\ 解密结束 |\ cout<<\ decrypt(); break; case 3: cout<<\ cout<<\ 程序结束,谢谢您的使用! ^_^ |\ cout<<\ cout<

void encrypt() { const int N=100; char letters[26]=\用于填充矩阵 int flag[25]={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数组对应

- 2 -

char ch[5][5];//5X5矩阵 char ch1[N];//密钥 char ch2[N];//明文 char ch4;//无关字符 int len='a'-'A'; cout<<\输入密钥:\ cin>>ch1; int flg=1; while(flg==1) { for(int i=0;i'z'||ch1[i]<'a') { cout<<\请重新选择操作:\ flg=0;break; } else ch1[i]=ch1[i]-len; }

if(flg==1) { for(i=0;i

//把密钥中的字母填入到矩阵中,并把该字母标记为已用

for(int k=0;k

- 3 -

ch[i][j]=letters[k]; flag[k]=1; if(j<4)j++; else{i++;j=0;} } }

cout<<\密钥填充后的矩阵为: \for(i=0;i<5;i++) for(j=0;j<5;j++) { cout<>ch2; cout<<\输入一个无关字符:\ cin>>ch4; if(ch4>='a') ch4=ch4-len; for(k=0;k='a') ch2[k]=ch2[k]-len; } for(k=0;k

//为明文添加必要的无关字符以防止同一组的两个字符相同 for( k=0;kk;t--) ch2[t+1]=ch2[t]; ch2[k+1]=ch4; } }

//若明文有奇数个字符,则添加一个无关字符以凑够偶数个 if(strlen(ch2)%2!=0)

- 4 -

{ ch2[strlen(ch2)+1]=ch2[strlen(ch2)];//字符串结尾赋'\\0' ch2[strlen(ch2)]=ch4;//明文串尾插入无关字符 }

cout<<\经过处理后的明文为:\for(k=0;k

cout<<\其最终长度为:\

//////////////////明文输入并整理完毕/////////////////////////////// for(k=0;k4){n1=n1%5;m1=m1+1;} if(n2>4){n2=n2%5;m2=m2+1;} if(m1==m2) { ch2[k]=ch[m1][(n1+1)%5]; ch2[k+1]=ch[m2][(n2+1)%5]; } else { if(n1==n2) { ch2[k]=ch[(m1+1)%5][n1]; ch2[k+1]=ch[(m2+1)%5][n2]; }

- 5 -

else {ch2[k]=ch[m1][n2]; ch2[k+1]=ch[m2][n1]; } } } cout<<\加密后所得到的密文是:\ for(k=0;k

//解密算法 void decrypt() { const int N=100; char letters[26]=\用于填充矩阵 int flag[25]={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 ch[5][5];//5X5矩阵 char ch1[N];//密钥 char ch2[N];//密文 int len='a'-'A'; int flg=1; cout<<\输入密钥:\ cin>>ch1; while(flg==1) { for(int i=0;i'z'||ch1[i]<'a') { cout<<\请重新选择操作:\ flg=0;break; } else ch1[i]=ch1[i]-len; }

if(flg==1) { for(i=0;i

{

if(ch1[i]=='J')ch1[i]='I'; }

- 6 -

i=0;int j=0;

//把密钥中的字母填入到矩阵中,并把该字母标记为已用 for(int k=0;k

for( k=0;k<25;k++)//按字母表顺序把未用字母依次填入到矩阵中 { if(flag[k]==0) { ch[i][j]=letters[k]; flag[k]=1; if(j<4)j++; else{i++;j=0;} } }

cout<<\密钥填充后的矩阵为: \for(i=0;i<5;i++) for(j=0;j<5;j++) { cout<>ch2; for(int k=0;k='a')

- 7 -

ch2[k]=ch2[k]-len; } for( k=0;k

for( k=0;k

- 8 -

m2=m2%5; if(n1>4){n1=n1%5;m1=m1+1;} if(n2>4){n2=n2%5;m2=m2+1;} if(m1==m2) {ch2[k]=ch[m1][(n1+4)%5]; ch2[k+1]=ch[m2][(n2+4)%5]; } else { if(n1==n2) { ch2[k]=ch[(m1+4)%5][n1]; ch2[k+1]=ch[(m2+4)%5][n2]; } else { ch2[k]=ch[m1][n2]; ch2[k+1]=ch[m2][n1]; } } } cout<<\解密后所得到的明文是:\ for(k=0;k

else break; } }

四. 测试情况:

____________________________________________ | | | 多表代换密码Playfair的实现 | | 欢迎使用本程序 | |____________________________________________| ____________________________ | 选择你所需要的操作: | | 1.为字符串加密 | | 2.为字符串解密 | | 3.结 束 程 序 | |___________________________| 选择操作:1

- 9 -

__________________________________________ | 加密结束 | |_________________________________________| 输入密钥:123 请重新选择操作:

____________________________ | 选择你所需要的操作: | | 1.为字符串加密 | | 2.为字符串解密 | | 3.结 束 程 序 | |___________________________| 选择操作:1

__________________________________________ | 加密结束 | |_________________________________________| 输入密钥:monarchy 密钥填充后的矩阵为: M O N A R C H Y B D E F G I K L P Q S T U 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 R C H Y B D E F G I K L P Q S T U V W X Z

- 10 -

请输入密文:sun

字符串不能为奇数个!请重新输入。 请输入密文:sunhongg

同一分组中不能出现相同字符!请重新输入。 请输入密文:lxoynaiwewav

解密后所得到的明文是:SU NH ON GX GU OX ____________________________ | 选择你所需要的操作: | | 1.为字符串加密 | | 2.为字符串解密 | | 3.结 束 程 序 | |___________________________| 选择操作:9 无该项操作,请重来:

____________________________ | 选择你所需要的操作: | | 1.为字符串加密 | | 2.为字符串解密 | | 3.结 束 程 序 | |___________________________| 选择操作:rytery 无该项操作,请重来:

____________________________ | 选择你所需要的操作: | | 1.为字符串加密 | | 2.为字符串解密 | | 3.结 束 程 序 | |___________________________| 选择操作:3

__________________________________________ | 程序结束,谢谢您的使用! ^_^ | |_________________________________________| 请按任意键继续. . . 五. 总结

Playfair加密与解密过程是一样的,本程序在最初设计时未考虑容错能力,经老师指导,做简单修改后,已经具备容错能力,详细测试情况见四。

- 11 -

请输入密文:sun

字符串不能为奇数个!请重新输入。 请输入密文:sunhongg

同一分组中不能出现相同字符!请重新输入。 请输入密文:lxoynaiwewav

解密后所得到的明文是:SU NH ON GX GU OX ____________________________ | 选择你所需要的操作: | | 1.为字符串加密 | | 2.为字符串解密 | | 3.结 束 程 序 | |___________________________| 选择操作:9 无该项操作,请重来:

____________________________ | 选择你所需要的操作: | | 1.为字符串加密 | | 2.为字符串解密 | | 3.结 束 程 序 | |___________________________| 选择操作:rytery 无该项操作,请重来:

____________________________ | 选择你所需要的操作: | | 1.为字符串加密 | | 2.为字符串解密 | | 3.结 束 程 序 | |___________________________| 选择操作:3

__________________________________________ | 程序结束,谢谢您的使用! ^_^ | |_________________________________________| 请按任意键继续. . . 五. 总结

Playfair加密与解密过程是一样的,本程序在最初设计时未考虑容错能力,经老师指导,做简单修改后,已经具备容错能力,详细测试情况见四。

- 11 -

本文来源:https://www.bwwdw.com/article/x7v.html

Top