编码谜算法,可以加密但不能解密

时间:2019-06-11 15:52:25

标签: c cryptography

我必须对纳粹德国使用的加密算法进行编码,以加密通过无线电发送的消息,您可以正确here阅读它的工作原理

截至目前,我只在编码转子,我还没有编码插件板或转子的初始位置,因为我似乎对此已经有问题。

这是我写的:

    for (int i=0; i<strlen(sentence);i++){

        sentence[i]=toupper(sentence[i]);

        temp=rs1[0];
        for(int s=0;s<26-1;s++)
        {
            rs1[s]=rs1[s+1];
        }
        rs1[26-1]=temp;
        j++;

        if (j==26){

            j=0;
            temp=rs2[0];
            for(int s=0;s<26-1;s++)
            {
                rs2[s]=rs2[s+1];
            }
            rs2[26-1]=temp;
            z++;

        }

        if (z==26){

            z=0;
            temp=rs2[0];
            for(int s=0;s<26-1;s++)
            {
                rs2[s]=rs2[s+1];
            }
            rs2[26-1]=temp;

        }

        q=(sentence[i]-65);

        //this cant decrypt

        sentence[i]=encrypt(sentence[i],rs1);
        //printf("%s\n",sentence);
        sentence[i]=encrypt(sentence[i],rs2);
        //printf("%s\n",sentence);
        sentence[i]=encrypt(sentence[i],rs3);
        //printf("%s\n",sentence);
        sentence[i]=reflect(sentence[i]);
        //printf("%s\n",sentence);
        sentence[i]=encrypt(sentence[i],rs3);
        //printf("%s\n",sentence);
        sentence[i]=encrypt(sentence[i],rs2);
        //printf("%s\n",sentence);
        sentence[i]=encrypt(sentence[i],rs1);
        //printf("%s\n",sentence);

    }

功能是:

char encrypt(char c, char r[]){

int num=(int)c-65;
char newc;

newc=r[num];

return newc;
}

char relfect(char c){

char reflector[27]={'A','Q','W','S','E','D','R','F','T','G','Y','H','U','J','O','K','I','L','P','Z','V','C','X','B','N','M'};
int num=(int)c-65;
char newc;

newc=reflector[num];

return newc;
}

当我编译并执行代码时,我设法对输入的单词进行加密,但是当我重置程序并插入加密的单词时,它并没有对其解密,这似乎很奇怪。

示例: 如果我输入Hello,我得到QOBAJ,但是在重新启动程序并输入QOBAJ时,得到MWCJC而不是Hello,我不知道为什么。

我使用的转子是:

1- EKMFLGDQVZNTOWYHXUSPAIBRCJ

2- AJDKSIRUXBLHWTMCQGZNPYFVOE

3- BDFHJLCPRTXVZNYEIWGAKMUSQO

谢谢您的帮助。

洛伦佐。

1 个答案:

答案 0 :(得分:2)

首先,我看不到将变量jz初始化的位置,并且在为变量q赋值后再也没有使用它。假设您确实初始化了所有内容,则不需要变量q,并且您的代码正确无误,那么问题出在这里:

if (z==26){
    z=0;
    temp=rs2[0];
    for(int s=0;s<26-1;s++)
    {
        rs2[s]=rs2[s+1];
    }
    rs2[26-1]=temp;
}

在此代码块中,您应该使用rs3而不是rs2。看起来您进行了复制和粘贴,但并没有更改所有名称。

编辑:

您必须反转用于解密的查找机制,并且不需要reflect函数。替换

sentence[i]=reflect(sentence[i]);

具有:

sentence[i]=encrypt(sentence[i],reflector);

decrypt函数将如下所示:

char decrypt(char c, char r[])
{
    for ( int num = 0; num < 26; ++num )
    {
        if ( r[num] == c )
        {
            return((char)(65 + num));
        }
    }
    return(c); // Should never get here
}

然后执行解密,请调用decrypt而不是encrypt