发新话题
打印

[原创]Playfair加密解密算法(C语言)

[原创]Playfair加密解密算法(C语言)

文章作者:侠客行
include<stdio.h>
#include<string.h>

int fenlei(char h)//字符分类
{
        int i;
        if(h=='i'||h=='j')
                i=1;
        else if(h=='I'||h=='J')
                i=2;
        else if(h>='a'&&h<='z')
                i=3;
        else if(h>='A'&&h<='Z')
                i=4;
        else
                i=5;
        return i;
}
void tongyi(char p[],char c[])//密钥字符统一化为小写字母,并将j转换为i
{
        int i,j;
        for(i=j=0;p!='';i++)
        {
                if(fenlei(p)==1||fenlei(p)==2){
                        c[j]='i';
                        j++;
                }
                else if(fenlei(p)==3){
                        c[j]=p;
                        j++;
                }
                else if(fenlei(p)==4){
                        c[j]=p+32;
                        j++;
                }
        }
        c[j]='';
}
void  quchu(char p[],char c[])//去除密钥里的重复字符
{
        int flag=0,v,i,j;
        for(i=j=0;c!='';i++){
                for(v=0;v<j;v++){
                        flag=0;
                        if(p[v]==c){
                                flag=1;
                                break;
                        }
                }
                if(flag==1)
                        continue;
                p[j]=c;
                j++;
        }
        p[j]='';
}
void juzhen(char p[],char k[5][5])//矩阵
{
        int flag,i,j,v,m=0;
        for(i=0,v=0;i<5;i++)
                for(j=0;j<5;j++){
                        if(p[v]!='')
                                k[j]=p[v++];
                        else{
                                for(int c=m;c<26;c++){
                                        flag=0;
                                        for(int n=0;p[n]!='';n++)
                                                if(p[n]=='a'+c||'a'+c=='j'){
                                                        flag=1;
                                                        break;
                                                }
                                        if(0==flag){
                                                k[j]='a'+c;
                                                m=++c;
                                                break;
                                        }
                                }
                        }
        }
}
void xiushi(char t[],char r[])//输入修饰
{
        int i,j;
        for(i=j=0;r!='';i++){             //明文或者密文统一化为小写字母,并将j转换为i
                if(fenlei(r)==1||fenlei(r)==2){
                        t[j]='i';
                    j++;
                }
            else if(fenlei(r)==3){
                    t[j]=r;
                    j++;
                }
            else if(fenlei(r)==4){
                    t[j]=r+32;
                    j++;
                }
        }
        t[j]='';
        for(i=j=0;t!='';i++){
                if(t==r[j-1]&&t!='a'){        //当输入有两个一样时,且相同字母不为a或输入为奇数,最后一位不为a时,添加a
                        r[j]='a';
                        j++;
                        r[j]=t;
                        j++;
                }
                else if(t==r[j-1]&&t=='a'){     //当输入有两个一样时,且相同字母为a或输入为奇数,最后一位为a时,添加b
                        r[j]='b';
                        j++;
                        r[j]=t;
                        j++;
                }
                else{
                        r[j]=t;
                        j++;
                }
        }
                if(j%2!=0){
                        r[j]='a';
                        r[++j]='';
                }
        else r[j]='';
                for(i=0;r!='';i++)
                        printf("%c",r);
                printf("n");
}
void shuchu(char t[],char r[],char p[],char c[],char k[5][5])//输入明文或者密文和密钥
{
        gets(p);
    tongyi(p,c);
        quchu(p,c);
    juzhen(p,k);
        gets(r);
        xiushi(t,r);       
}
void jieguo(char r[],char k[5][5])//结果输出
{
        int i,j;
       
        for(i=0;i<5;i++){
                for(j=0;j<5;j++)
                        printf("%c " ,k[j]);
                printf("n");
        }
        printf("n");
    for(i=0;r!='';i++)
                        printf("%c",r);
                printf("n");
}
void huoquweizhi(int &xloc,int &yloc,char h,char k[5][5])//获得要加密明文在密钥矩阵里的位置
{
        int i,j;
        for(i=0;i<5;i++)
                for(j=0;j<5;j++)
                        if(h==k[j]){
                                xloc=i;
                yloc=j;
                        }
}
void jiami(char r[],char k[5][5])//加密算法
{
        int xloc1,yloc1,xloc2,yloc2;
        for(int i=0;r!='';i=i+2){
                huoquweizhi(xloc1,yloc1,r,k);
            huoquweizhi(xloc2,yloc2,r[i+1],k);
            if(xloc1==xloc2){
                        r=k[xloc1][(yloc1+1)%5];
                        r[i+1]=k[xloc2][(yloc2+1)%5];
                }
                else if(yloc1==yloc2){
                        r=k[(xloc1+1)%5][yloc1];
                        r[i+1]=k[(xloc2+1)%5][yloc2];
                }
                else{
                        r=k[xloc1][yloc2];
                        r[i+1]=k[xloc2][yloc1];
                }
        }
}
void jiemi(char r[],char k[5][5])//解密算法
{
        int xloc1,yloc1,xloc2,yloc2;
        for(int i=0;r!='';i=i+2){
                huoquweizhi(xloc1,yloc1,r,k);
            huoquweizhi(xloc2,yloc2,r[i+1],k);
            if(xloc1==xloc2){
                        r=k[xloc1][(yloc1+4)%5];
                        r[i+1]=k[xloc2][(yloc2+4)%5];
                }
                else if(yloc1==yloc2){
                        r=k[(xloc1+4)%5][yloc1];
                        r[i+1]=k[(xloc2+4)%5][yloc2];
                }
                else{
                        r=k[xloc1][yloc2];
                        r[i+1]=k[xloc2][yloc1];
                }
        }
}
void main()
{
        char num;
        while(1){
                char t[200],r[200],p[26],c[26];
            char k[5][5];
                printf("1、加密 2、解密 n");
                num=getchar();
                getchar();
                if(num=='1'){
                        printf("输入密钥和明文:n");
                shuchu(t,r,p,c,k);
                        jiami(r,k);
                       
                printf("加密矩阵和密文:n");
                jieguo(r,k);
                }
                else if (num=='2'){
                        printf("输入密钥和密文:n");
                        shuchu(t,r,p,c,k);
                        jiemi(r,k);
               
                printf("解密矩阵和明文:n");
                jieguo(r,k);
                }
       
        }
}

附件

1.png (21.44 KB)

2011-4-21 08:45

运行结果

1.png

TOP

发新话题