?? 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 ) //判斷參數(shù)個數(shù)
{ if(argc!=4)
{ printf("usage: playfair sourcefile destfile\n");
exit(0);
}
}
void encry(char *argv1 , char *argv2) //加密函數(shù)
{
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) //創(chuàng)建密文
{ printf("%s 創(chuàng)建密文失敗!\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)//解密函數(shù)
{
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) //創(chuàng)建解密文檔
{ printf("%s 解密文檔創(chuàng)建失敗!\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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -