⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playfair.cpp

📁 一个用古典密码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 + -