playfair加密算法

来源:互联网 发布:英语 荷兰语知乎 编辑:程序博客网 时间:2024/09/21 08:57
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream.h>#define NUM 1000 int main(){int i,j,k=0,m,n,temp=0,length,u1,v1,choice;char key[NUM],voa[26];char table[5][5];char word[NUM];//printf("%d",'z');cout<<"密钥: "<<endl;scanf("%s",key);            //输入密钥并生成密钥矩阵length=strlen(key);    for(i=0;i<length;i++){   if(key[i]=='j')    key[i]='i';}      for(i=0;i<length;i++){for(j=i+1;j<length;j++)   if(key[i]==key[j])   {    for(int t=j;t<length;t++)    {     key[t]=key[t+1];    }    j--;    length--;           //找到key中的重复部分,删去,减少长度。   }   if(j==1)   {    key[j]=0;    break;   }}   // printf("%d\n",length);for(i=0;i<26;i++){   voa[i]=65+i;            //输入是小写形式,转换成大写字母。}for(i=0;i<length;i++){   key[i]=key[i]-32;} char p;int count=0;for(i=0;i<26;i++){        p=voa[i];   for(j=0;j<length;j++)   {    if(p==key[j])    {     key[i+length]=p;     count+=1;     break;    }    //printf("%d",count);   }   if(j==length)   {    key[i+length-count]=p;   } }int u=0;for(i=0;i<26;i++){   if(key[i]=='J')   {      for(u=i;u<26;u++)    {     key[u]=key[u+1];    }   }   if(key[i]=='I')    key[i]='I';     //printf("%c",word[i]); }temp=0;for(i=0;i<5;i++){   for(j=0;j<5;j++)   {    table[i][j]=key[j+temp];    printf("%c ",table[i][j]);    if(j==4)    {     temp+=5;       printf("\n");    }   }}                  //以上部分用以得出置换表。 printf(“\n请选择操作\n1、已知明文求密文\n2、已知密文求明文\n”); scanf(“%d”,&choice);if(choice==1){ cout<<"明文(请省略空格): "<<endl;scanf("%s",word);length=strlen(word);//printf("%d\n",length); int counter=0;for(i=0;i<length;){   if(word[i]==word[i+1])   {    i+=1;    counter+=1;   }   else    i+=2; } //printf("1:%d\n",length+counter);for(i=0;i<length+counter;i+=2){   if(word[i]==word[i+1])          //如果相邻字母相同,在中间加上q   {     for(j=length+counter-1;j>i+1;j--)    {     word[j]=word[j-1];       }    word[i+1]='q';   }}  length=length+counter; if(length%2!=0)          //如果明文字母是奇数位,在末尾加上"q"{   word[length]='q';   length+=1;} for(k=0;k<length;k++){    word[k]=word[k]-32; }for(i=0;i<length;i++)            //如果明文是i和j,显示I {   if(word[i]=='I'||word[i]=='J')   {    word[i]='I';   }}  for(k=0;k<length;k++)     //查找明文中字母对应于置换表中的位置{ for(i=0;i<5;i++)     for(j=0;j<5;j++)         { if(word[k]==table[i][j])         {m=i;             n=j;             }           if(word[k+1]==table[i][j])           {u1=i;v1=j;           }         }            if((m==u1)&&(n!=v1))    //两字母同行不同列        {word[k]=table[m][(n+1)%5];         word[k+1]=table[u1][(v1+1)%5];        }        else if((m!=u1)&&(n==v1))  //两字母同列不同行        {word[k]=table[(m+1)%5][n];         word[k+1]=table[(u1+1)%5][v1];        }     else if((m!=u1)&&(n!=v1))   //两字母既不同行也不同列        { word[k]=table[m][v1];          word[k+1]=table[u1][n];        } k++;}         cout<<"密文: "<<endl;for(k=0;k<length;k++){   if(k%6==0)    printf("\n");    printf("% 4c ",word[k]);} }   if(choice==2){ cout<<"密文(请省略空格): "<<endl;scanf("%s",word);length=strlen(word);//printf("%d\n",length); for(k=0;k<length;k++)     //查找密文中字母对应于置换表中的位置{ for(i=0;i<5;i++)     for(j=0;j<5;j++)         { if(word[k]==table[i][j])         {m=i;             n=j;             }           if(word[k+1]==table[i][j])           {u1=i;v1=j;           }         }            if((m==u1)&&(n!=v1))    //两字母同行不同列        {word[k]=table[m][(n-1+5)%5];         word[k+1]=table[u1][(v1-1+5)%5];        }        else if((m!=u1)&&(n==v1))  //两字母同列不同行        {word[k]=table[(m-1+5)%5][n];         word[k+1]=table[(u1-1+5)%5][v1];        }     else if((m!=u1)&&(n!=v1))   //两字母既不同行也不同列        { word[k]=table[m][v1];          word[k+1]=table[u1][n];        } k++;}     cout<<"明文: "<<endl;for(k=0;k<length;k++){   if(k%6==0)    printf("\n");    printf("L ",word[k]);} }  printf("\n");        system("pause");return 0;}

0 0