一. 问题描述:
著名的多表古典加密体制使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
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 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< //为明文添加必要的无关字符以防止同一组的两个字符相同 for( k=0;k //若明文有奇数个字符,则添加一个无关字符以凑够偶数个 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;k - 5 -