Playfire加密算法
#include<stdio.h> #include<string.h> //矩阵 char matrix[5][5]; //存储26个字母在矩阵中的行号和列号,不在矩阵中行列号均为-1 int charSite[26][2]; //填充matrix矩阵 void init() { int i,j,k=0,len; char str[26]; gets(str); len=(int)strlen(str); for(i=0;i<25;i++){ if(i<len) *(*matrix+i)=str[i]; else{ for(j=0;j<i;j++) if('a'+k==*(*matrix+j)){ k++; j=-1; } *(*matrix+i)='a'+k; } } } //计算各个字母在矩阵中的行号和列号 void calculateCharSite() { int i; for(i=0;i<26*2;i++) *(*charSite+i)=-1; for(i=0;i<25;i++){ charSite[*(*matrix+i)-'a'][0]=i/5; charSite[*(*matrix+i)-'a'][1]=i%5; } } //加密 void encrypt(char *str) { int i; char ch2,ch1,temp; int len=(int)strlen(str); for(i=1;i<len;i+=2){ //两个字母相等或其中一个字母不在矩阵中,不作改变 if(str[i-1]==str[i] || charSite[str[i-1]-'a'][0]<0 ||charSite[str[i]-'a'][0]<0) continue; //在同一行或同一列,交换位置 if(charSite[str[i-1]-'a'][0] == charSite[str[i]-'a'][0] ||charSite[str[i-1]-'a'][1] == charSite[str[i]-'a'][1]){ temp=str[i-1]; str[i-1]=str[i]; str[i]=temp; }else{//不同行,不同列,找对角矩形 ch1=matrix[charSite[str[i-1]-'a'][0]][charSite[str[i]-'a'][1]]; ch2=matrix[charSite[str[i]-'a'][0]][charSite[str[i-1]-'a'][1]]; str[i-1]=ch1; str[i]=ch2; } } } void main() { char str[100]; init(); calculateCharSite(); gets(str); encrypt(str); puts(str); }