В настоящее время я пытаюсь сделать грубый кесарево шифрование в C ++, которое показывает все итерации, как угадывает каждый ключ.
Вот мой код до сих пор:
#include <iostream>
using namespace std;
int main()
{
char message[100], ch;
int i;
cout << "Enter a message to decrypt: ";
cin.getline(message, 100);
for(int key = 0; key<26 ; key++)
{
for(i = 0; message[i] != '\0'; ++i){
ch = message[i];
if(ch >= 'a' && ch <= 'z'){
ch = ch - key;
if(ch < 'a'){
ch = ch + 'z' - 'a' + 1;
}
message[i] = ch;
}
else if(ch >= 'A' && ch <= 'Z'){
ch = ch - key;
if(ch > 'a'){
ch = ch + 'Z' - 'A' + 1;
}
message[i] = ch;
}
}
cout << "Decrypted message: " << message << " " << endl ;
}
return 0;
}
У меня проблема в том, что когда он показывает догадки, он пропускает буквы, когда они строчные, и просто застревает, когда они заглавные, и повторяет одну и ту же строку. В этом примере это код LT HDGJWJFLQJX, который должен расшифровываться как GO CYBEREAGLES. Выводы программы в верхнем и нижнем регистре показаны на прилагаемых изображениях.
Вы расшифровываете message
на месте, поэтому, когда вы делаете второе предположение, вы дешифруете результат первого дешифрования. Третье предположение работает с результатом второго дешифрования и т. Д.
Когда вы записываете расшифрованное предположение, оно должно перейти в другой массив, чем message
, так что следующая итерация может начаться с исходных данных шифрования.
Редактировать: создать другой массив, char decrypted[100];
, то напиши в него расшифрованные символы (decrypted[i] = ch;
). Не забывайте нулевой (нулевой) символ в конце.
Других решений пока нет …