Playfair密码

编制密码表

第一步是编制密码表。在这个5*5的密码表中,共有5行5列字母。第一行(或第一列)是密钥,其余按照字母顺序。密钥是一个单词或词组,若有重复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉。如:密钥是Live and learn,去掉后则为liveandr。如果密钥过长可占用第二列或行。j和i用i来替换
如密钥crazy dog,可编制成

[ c r a z y d o g b e f h i ( j ) k l m n p q s t u v w x ]

整理明文

第二步整理明文。将明文每两个字母组成一对。如果成对后有两个相同字母紧挨或最后一个字母是单个的,就插入一个字母q(或者其他双方约定好的)。
如,communist,应成为co mq mu ni st

编写密文

最后编写密文。对明文加密规则如下:
1 若p1 p2在同一行,对应密文c1 c2分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,ct对应dc(解密时反向)
2 若p1 p2在同一列,对应密文c1 c2分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。(解密时反向)
3 若p1 p2不在同一行,不在同一列,则c1 c2是由p1 p2确定的矩形的其他两角的字母(至于横向替换还是纵向替换要事先约好,或自行尝试)。如,按照前表,wh对应ku或uk。(解密时处理方法相同)

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
void CreateMatrix(char key[],char Matrix[5][5])
{
    bool vis[26]= {0};
    int len=strlen(key);
    int s=0;
    int w=0;
    for(int i=0; i<5; i++)
        for(int j=0; j<5; j++)
        {
            if(s<len)
            {
                Matrix[i][j]=key[s];
                vis[key[s]-'a']=1;
                s++;
            }
            else
            {
                while(vis[w]==1) w++;
                if(w+'a'=='j') w++;
                Matrix[i][j]='a'+w;
                vis[w]=1;
                w++;
            }
        }
}
void Encode(char str[],char Matrix[5][5])
{
    char code[100];
    int len=strlen(str);
    int len2=0;
    for(int i=0; i<len; i++)
    {
        if(str[i]==' ')
            continue;
        code[len2++]=str[i];
        if(str[i]==str[i+1])
            code[len2++]='q';
    }
    if(len2%2==1)
        code[len2++]='q';
    code[len2+1]='\0';
    printf("密文为:");
    for(int i=0; i<len2; i+=2)
    {
        int x1,y1,x2,y2;
        for(int j=0; j<5; j++)
            for(int k=0; k<5; k++)
                if(Matrix[j][k]==code[i])
                {
                    x1=j;
                    y1=k;
                }
                else if(Matrix[j][k]==code[i+1])
                {
                    x2=j;
                    y2=k;
                }
        if(x1==x2)
        printf("%c%c ",Matrix[x1][(y1+1)%5],Matrix[x2][(y2+1)%5]);
        else if(y1==y2)
        printf("%c%c ",Matrix[(x1+1)%5][y1],Matrix[(x2+1)%5][y2]);
        else
        printf("%c%c ",Matrix[x1][y2],Matrix[x2][y1]);
    }
    printf("\n");
}
void Decode(char str[],char Matrix[5][5])
{
    char code[100];
    int len=strlen(str);
    int len2=0;
    for(int i=0; i<len; i++)
    {
        if(str[i]==' ')
            continue;
        code[len2++]=str[i];
    }
    code[len2+1]='\0';
    printf("明文为:");
    for(int i=0; i<len2; i+=2)
    {
        int x1,y1,x2,y2;
        for(int j=0; j<5; j++)
            for(int k=0; k<5; k++)
                if(Matrix[j][k]==code[i])
                {
                    x1=j;
                    y1=k;
                }
                else if(Matrix[j][k]==code[i+1])
                {
                    x2=j;
                    y2=k;
                }
        if(x1==x2)
        printf("%c%c ",Matrix[x1][(y1-1+5)%5],Matrix[x2][(y2-1+5)%5]);
        else if(y1==y2)
        printf("%c%c ",Matrix[(x1-1+5)%5][y1],Matrix[(x2-1+5)%5][y2]);
        else
        printf("%c%c ",Matrix[x1][y2],Matrix[x2][y1]);
    }
    printf("\n");
}
int main()
{
    char key[26],Matrix[5][5],str[100];
    printf("请输入密钥:");
    gets(key);
    CreateMatrix(key,Matrix);
    printf("请输入明文:");
    gets(str);
    Encode(str,Matrix);
    printf("请输入密文:");
    gets(str);
    Decode(str,Matrix);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ftx456789/article/details/80512461