2、周期换位密码把明文中的字母按给定的顺序排在一个矩阵中,然后用另一种顺序选出矩阵中的字母来产生密文。例如,给定一个置换F=2、4、1、3,即按第2列、第4列、第1列、第3列的次序排列。加密过程如下:第一步,排列1234guangzhouisabeautifulcity第二步,打断1234guangzhouisabeautifulcity###第三步,周期换位2413ungazoghiauseubaiutfctli##y#第四步,产生密文ungazoghiauseubaiutfctli##y#////////////////////////////////////#include <iostream.h>#include <string.h>#define N 4void main(){ int m,i,j; char p1[80],p2[20][N],p3[20][N]; char pstr[]="guangzhouisabeautifulcity"; //用符号'#'填充明文 m=(strlen(pstr)/N+1)*N; for(i=0;i<strlen(pstr);i++) p1[i]=pstr[i]; for(i=strlen(pstr);i<m;i++) p1[i]='#'; //打断 m=m/N; for(i=0;i<m;i++) for(j=0;j<N;j++) p2[i][j]=p1[i*N+j]; //2413周期换位,产生密文 for(i=0;i<m;i++) { p3[i][0]=p2[i][1]; p3[i][1]=p2[i][3]; p3[i][2]=p2[i][0]; p3[i][3]=p2[i][2]; } //输出 cout<<"\n明文:"; for(i=0;i<m*N;i++) cout<<p1[i]; cout<<"\n密文:"; for(i=0;i<m;i++) for(j=0;j<N;j++) cout<<p3[i][j]; cout<<endl;}
#include <iostream.h>#include <string.h>#define N 4 //密钥宏定义为4void main(){ int m,i,j; char p1[80],p2[20][N],p3[N][20]; char pstr[]="guangzhouisabeautifulcity"; //用符号'#'填充明文if(strlen(pstr)%N!=0) m=(strlen(pstr)/N+1)*N; //m是行数else m=(strlen(pstr)/N)*N; for(i=0;i<strlen(pstr);i++) p1[i]=pstr[i]; for(i=strlen(pstr);i<m;i++) p1[i]='#'; //打断 m=m/N; for(i=0;i<m;i++) for(j=0;j<N;j++) p2[i][j]=p1[i*N+j]; //一维数组存到二维数组 //列换位,产生密文 for(i=0;i<N;i++) for(j=0;j<m;j++) p3[i][j]=p2[j][i]; //输出 cout<<"\n明文:"; for(i=0;i<m*N;i++) cout<<p1[i]; cout<<"\n密文:"; for(i=0;i<N;i++) for(j=0;j<m;j++) cout<<p3[i][j]; cout<<endl;} 或者#include <iostream.h>#include <string.h>#define N 4void main(){ int m,i,j; char p1[80],p2[20][N],p3[20][N]; char pstr[]="guangzhouisabeautifulcity"; //用符号'#'填充明文 m=(strlen(pstr)/N+1)*N; for(i=0;i<strlen(pstr);i++) p1[i]=pstr[i]; for(i=strlen(pstr);i<m;i++) p1[i]='#'; //打断 m=m/N; for(i=0;i<m;i++) for(j=0;j<N;j++) p2[i][j]=p1[i*N+j]; //2413周期换位,产生密文 for(i=0;i<m;i++) { p3[i][0]=p2[i][1]; p3[i][1]=p2[i][3]; p3[i][2]=p2[i][0]; p3[i][3]=p2[i][2]; } //输出 cout<<"\n明文:"; for(i=0;i<m*N;i++) cout<<p1[i]; cout<<"\n密文:"; for(i=0;i<m;i++) for(j=0;j<N;j++) cout<<p3[i][j]; cout<<endl;}