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);  
} 

  

posted @ 2017-07-12 20:58  寂地沉  阅读(1040)  评论(0编辑  收藏  举报