Алгоритм кодирования Enigma, может зашифровать, но не расшифровать - PullRequest
3 голосов
/ 11 июня 2019

Мне нужно закодировать алгоритм загадки, используемый нацистской Германией для шифрования сообщений, отправляемых по радио, вы можете прочитать, как он работает правильно здесь

На данный момент я только кодирую роторы, я еще не кодировал Plugboard или начальную позицию ротора, поскольку у меня, похоже, уже есть проблемы с этим.

Вот что я написал:

    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

Спасибо за помощь.

Lorenzo.

1 Ответ

2 голосов
/ 11 июня 2019

Прежде всего, я не вижу, где вы инициализируете переменные j или z, и вы никогда не используете переменную 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
}

Затем, чтобы выполнить расшифровку, вместо этого вызовите decryptencrypt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...