📄 playfair.cpp
字号:
#include<stdio.h>
#include<process.h>
void usage(int argc );
void encry(char *, char *);
void descry(char *, char *);
int getx(char c);
int gety(char c);
char box[5][5]={'C' , 'I' , 'P' , 'H' , 'E',
'R' , 'A' , 'B' , 'D' , 'F',
'G' , 'K' , 'L' , 'M' , 'N',
'O' , 'Q' , 'S' , 'T' , 'U',
'V' , 'W' , 'X' , 'Y' , 'Z'
};
void main(int argc , char *argv[])
{
usage(argc);
encry(argv[1],argv[2]);
descry(argv[2],argv[3]);
}
void usage(int argc ) //判断参数个数
{ if(argc!=4)
{ printf("usage: playfair sourcefile destfile\n");
exit(0);
}
}
void encry(char *argv1 , char *argv2) //加密函数
{
FILE *fpyuan , *fpmi; //原文和密文的文件指针
char temp1 , temp2 , out1 , out2;
int firstx , firsty , secondx , secondy;
if((fpyuan=fopen(argv1,"rb"))==NULL) // 打开原文
{ printf("%s 打开原文失败!\n",argv1);
exit(0);
}
if((fpmi=fopen(argv2,"wb"))==NULL) //创建密文
{ printf("%s 创建密文失败!\n",argv2);
exit(0);
}
while(temp1=fgetc(fpyuan),!feof(fpyuan))
{ temp2=fgetc(fpyuan);
if(feof(fpyuan)) //如果最后一对只有一个字母用x补充
{ temp2= 'x';
}
if(temp1==temp2) //一对中是两一样的字母 中间加一个x隔开
{ fseek(fpyuan,-1L,1); //文件指针后退
temp2= 'x';
}
if(temp1=='j'||temp1=='J') //碰到字母j 当作i处理
temp1='i';
if(temp1=='j'||temp1=='J')
temp2='i';
firstx=getx(temp1);
firsty=gety(temp1);
secondx=getx(temp2);
secondy=gety(temp2);
if(firstx==secondx) //如果同行 取右
{ out1=box[firstx][((firsty+1)%5)];
out2=box[firstx][((secondy+1)%5)];
}
else if(firsty==secondy) //如果同列 取下
{ out1=box[((firstx+1)%5)][firsty];
out2=box[((secondx+1)%5)][firsty];
}
else //其他的交叉处理
{
out1=box[firstx][secondy];
out2=box[secondx][firsty];
}
fputc(out1,fpmi);
fputc(out2,fpmi);
}
fclose(fpyuan);
fclose(fpmi);
}
void descry(char *argv2 , char *argv3)//解密函数
{
FILE *fpmi , *fpjie;
char temp1 , temp2 , out1 , out2;
int firstx , firsty , secondx , secondy;
if((fpmi=fopen(argv2,"rb"))==NULL) //打开密文
{ printf("%s 密文打开失败!\n",argv2);
exit(0);
}
if((fpjie=fopen(argv3,"wb"))==NULL) //创建解密文档
{ printf("%s 解密文档创建失败!\n",argv3);
exit(0);
}
while(temp1=fgetc(fpmi),!feof(fpmi))
{ temp2=fgetc(fpmi);
firstx=getx(temp1);
firsty=gety(temp1);
secondx=getx(temp2);
secondy=gety(temp2);
if(firstx==secondx) //如果同行 取左
{ out1=box[firstx][((firsty+4)%5)]+32;
out2=box[firstx][((secondy+4)%5)]+32;
}
else if(firsty==secondy) //如果同列 取上
{ out1=box[((firstx+4)%5)][firsty]+32;
out2=box[((secondx+4)%5)][firsty]+32;
}
else //其他交叉处理
{
out1=box[firstx][secondy]+32;
out2=box[secondx][firsty]+32;
}
fputc(out1,fpjie);
fputc(out2,fpjie);
}
fclose(fpmi);
fclose(fpjie);
}
int getx(char c) //获取当前字母的横坐标
{ int i,j,k;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(box[i][j]==c||box[i][j]==c-32)k=i;
return k;
}
int gety(char c) //获取当前字母的纵坐标
{ int i,j,k;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(box[i][j]==c||box[i][j]==c-32)k=j;
return k;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -