【问题标题】:Coding Enigma algorithm, can encrypt but not decrypt编码Enigma算法,可加密不可解密
【发布时间】:2019-06-11 15:52:25
【问题描述】:

我必须编写纳粹德国使用的谜算法来加密通过无线电发送的消息,您可以阅读它的工作原理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

谢谢你帮助我。

洛伦佐。

【问题讨论】:

    标签: c cryptography


    【解决方案1】:

    首先,我看不到您在哪里初始化变量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

    【讨论】:

    • 抱歉,我更正了那部分,q在以前的代码版本中用于调试,我忘了删除它。变量都是在 main 开始时初始化的。如果你想看更多我把代码上传到我的github
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多