密码学---PlayFair

                PlayFair百度百科  

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
char x[10][10];
void ff(char *a,char *b)///加密
{
    int x1,y1,x2,y2;
    for(int i=0; i<5; i++ )
    {
        for(int j=0; j<5; j++)
        {
            if(x[i][j]==*a)
                x1=i,y1=j;
            if(x[i][j]==*b)
                x2=i,y2=j;
        }
    }
    if(x1==x2)
    {
        *a=x[x1][(y1+1+5)%5];
        *b=x[x2][(y2+1+5)%5];
    }
    else if(y1==y2)
    {
        *a=x[(x1+1+5)%5][y1];
        *b=x[(x2+1+5)%5][y2];
    }
    else
    {
        *a=x[x1][y2];
        *b=x[x2][y1];
    }
}
void gg(char *a,char *b)///解密
{
    int x1,y1,x2,y2;
    for(int i=0; i<5; i++ )
    {
        for(int j=0; j<5; j++)
        {
            if(x[i][j]==*a)
                x1=i,y1=j;
            if(x[i][j]==*b)
                x2=i,y2=j;
        }
    }
    if(x1==x2)
    {
        *a=x[x1][(y1-1+5)%5];
        *b=x[x2][(y2-1+5)%5];
    }
    else if(y1==y2)
    {
        *a=x[(x1-1+5)%5][y1];
        *b=x[(x2-1+5)%5][y2];
    }
    else
    {
        *a=x[x1][y2];
        *b=x[x2][y1];
    }
}
int main()
{
    char f[15],m[50];
    char mw[50];
    char mingw[50];
    int vis[27];
    while(1)
    {
        memset(vis,0,sizeof(vis));
        cout<<"输入密钥:"<<endl;
        gets(f);
        int l=strlen(f);
        int tot=0,k=0;
        ///得到密码矩阵
        for(int i=0; i<5; i++)
        {
            for(int j=0; j<5; j++)
            {
                if(tot<l)
                {
                    if(f[tot]!=' ')
                        x[i][j]=f[tot];
                    vis[f[tot]-'a']=1;
                    tot++;
                }
                else
                {
                    for(; k<26; k++)
                    {
                        if(!vis[k]&&k!=9)
                        {
                            x[i][j]=(char)('a'+k);
                            vis[k]=1;
                            break;
                        }

                    }
                }
            }
        }
        /**输出密码矩阵
        for(int i=0; i<5; i++)
        {
            for(int j=0; j<5; j++)
            {
                cout<<x[i][j]<<" ";
            }
            cout<<endl;
        }*/
        
        cout<<"输入明文:"<<endl;
        gets(m);
        l=strlen(m);
        tot=0;
        char a,b;
        for(int i=0; i<l;)///加密
        {
            if(m[i]==' ')
            {
                mw[tot++]=' ';
                i++;
            }
            if(i+1<l&&m[i]==m[i+1])
            {
                a=m[i];
                b='q';
                i++;
                ff(&a,&b);
                mw[tot++]=a;
                mw[tot++]=b;
            }
            else if(i-1>=0&&m[i]==m[i-1])
            {
                b=m[i];
                a='q';
                ff(&a,&b);
                mw[tot++]=a;
                mw[tot++]=b;
                i++;
            }
            else if(i==l-1)
            {
                a=m[i];
                b='q';
                ff(&a,&b);
                mw[tot++]=a;
                mw[tot++]=b;
                i++;

            }
            else if(i+1<l&&m[i+1]==' ')
            {
                if(i+2<l)
                {
                    a=m[i];
                    b=m[i+2];
                    i+=2;
                    ff(&a,&b);
                    mw[tot++]=a;
                    mw[tot++]=b;
                }
                else
                {
                    a=m[i];
                    b='q';
                    ff(&a,&b);
                    mw[tot++]=a;
                    mw[tot++]=b;
                    break;
                }
            }
            else
            {
                a=m[i];
                b=m[i+1];
                ff(&a,&b);
                mw[tot++]=a;
                mw[tot++]=b;
                i+=2;
            }
        }
        cout<<endl;
        mw[tot]='\0';
        cout<<"密文:"<<mw<<endl;
        cout<<"解密:"<<endl;
        l=strlen(mw);
        for(int i=0; i<l;)///解密
        {
            if(mw[i]==' ')
            {
                mingw[i]=' ';
                i++;
            }
            else if(i+2<l&&mw[i+1]==' '&&isalpha(mw[i+2]))
            {
                a=mw[i];
                b=mw[i+2];
                gg(&a,&b);
                mingw[i]=a;
                mingw[i+1]=' ';
                mingw[i+2]=b;
                i+=3;
            }
            else if(i+1<l&&isalpha(mw[i+1]))
            {
                a=mw[i];
                b=mw[i+1];
                gg(&a,&b);
                mingw[i]=a;
                mingw[i+1]=b;
                i=i+2;
            }
        }
        mingw[l]='\0';
        for(int i=0; i<l; i++)
        {
            if(mingw[i]=='q')
            {
                for(int j=i; j<l; j++)
                    mingw[j]=mingw[j+1];
            }
        }
        cout<<"明文:"<<mingw<<endl;
    }
    return 0;
}


你可能感兴趣的:(密码学---PlayFair)