普莱菲尔密码
来源:互联网 发布:java 实现syslog 编辑:程序博客网 时间:2024/06/06 19:05
根据普莱菲尔密码规则对明文进行加密。
分别有三个文件:明文、密码、密文,分别在文件中输入明文和密码,加密后将会储存在密文的文件中,
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int lenw,lenm;char mw[1000],mm[26];//明文,密码char clw[2000];//最终的密文int len;char a[6][6];//密码表char x[26];//密码替换表char b[1000][2];//明文表FILE *ch;bool start(){ int i; ch=fopen("明文.txt","r"); if(ch==NULL) { printf("明文打开出错\n"); return 0; } fgets(mw,1000,ch); lenw=strlen(mw); mw[lenw]=' '; ch=fopen("密码.txt","r"); if(ch==NULL) { printf("密码打开出错\n"); return 0; } fgets(mm,100,ch); lenm=strlen(mm); mm[lenm]=' '; char j='a'; int k=0; bool t[26];//字母是否出现过 memset(t,0,sizeof(t)); t[25]=1;//z默认标记为已用 for(i=0; i<lenm; i++) //去重 { if(!t[mm[i]-'a']) { mm[k]=mm[i]; t[mm[i]-'a']=1; k++; } } for(i=k; i<100; i++)//后面接字母 { while(t[j-'a'])//有重复的跳过 j++; mm[i]=j; j++; if(j=='z')//发现j=='z'重置 j='a'; } return 1;}void ps_list()//打二维表{ int i,j,k=0; for(j=0; j<5; j++)//mm数列里已经没有z { for(i=0; i<5; i++) { a[i][j]=mm[k]; k++; } }}void op_word(){ int i=0,j=0; if(mw[i]==mw[i+1]||(!j%2&&mw[i+1]==mw[i+2])) { clw[j]=mw[i]; j++; clw[j]='x'; j++,i++; } else { clw[j]=mw[i]; j++,i++; } for(; i<1000; ) { if(i>=lenw)//明文遍历结束 break; if(mw[i]==mw[i+1]||mw[i]==mw[i-1]||(!j%2&&mw[i+1]==mw[i+2]))//是否前后有相同,或者是单个字母 { clw[j]=mw[i]; j++; clw[j]='x'; j++,i++; } else { clw[j]=mw[i]; j++,i++; } } len=j; if(!j-1%2)//判断末端是否为单个字母 { clw[j]='x'; len=j+1; }}int x1,x2,y1,y2;void getw(char x,char y)//获取这两个字母在表中的坐标{ int i,j; for(i=0; i<5; i++) for(j=0; j<5; j++) { if(a[i][j]==x) { x1=i; y1=j; } if(a[i][j]==y) { x2=i; y2=j; } }}void end_word(){ int i,x,y; for(i=0; i<len; i+=2)//按规则两两替换处理后的明文 { getw(clw[i],clw[i+1]); if(x1!=x2&&y1!=y2) { clw[i]=a[x1][y2]; clw[i+1]=a[x2][y1]; } else if(x1==x2) { x=x1,y=y1+1; if(y==5) y=0; clw[i]=a[x][y]; x=x2,y=y2+1; if(y==5) y=0; clw[i+1]=a[x][y]; } else if(y1==y2) { x=x1+1,y=y1; if(y==5) y=0; clw[i]=a[x][y]; x=x2+1,y=y2; if(y==5) y=0; clw[i+1]=a[x][y]; } }}int main(){ int n,m,i,j; if(!start())//文本获取 return 0; ps_list();//编制密码表 op_word();//整理明文 end_word();//编写密文 for(i=0;i<len;i++) printf("%c",clw[i]); ch=fopen("密文.txt","w"); if(ch==NULL) { printf("密文打开出错\n"); return 0; } fwrite(clw,len,sizeof(char),ch); fclose(ch); printf("\n"); getchar(); return 0;}