Шифрование Цезаря в C ++ - PullRequest
       16

Шифрование Цезаря в C ++

0 голосов
/ 01 октября 2019

Не могу понять, почему не работают только определенные буквы в моем расшифровке. Я пытаюсь расшифровать буквы kddkmu с помощью ключа 10. Предполагается, что он выходит в атаку, но каждый раз, когда я запускаю код, он выходит в aZZack. Я полагаю, что проблема имеет какое-то отношение к моей работе модуля, но независимо от того, что я делаю, я не могу понять проблему.

int key = 10;
ciphertext = "kddkmu";
plaintext = shift_decrypt(ciphertext, key);

cout << "2. Decryption of the ciphertext: " << ciphertext << endl;

cout << "   Key: " << key << endl;

cout << "   Plaintext; " << plaintext << endl << endl;

с

string shift_decrypt(string p, int a)
{
    string dtext = "";

    for (int i = 0; i < p.length(); i++)
    {
        dtext += char(int(p[i] - a - 97) % 26 + 97);
    }

    return dtext;
}

Я не получаю никаких ошибок, просто расшифровываю dd как ZZ по какой-то странной причине

1 Ответ

0 голосов
/ 01 октября 2019

Я не предлагаю вычитание с оператором модуля (остатка).

Мы знаем, что (X * 26) % 26 == 0 для всех X.
Итак, мы можем добавить дополнительные 26 бесплатно. Чтобы вычесть, мы можем добавить (26 - Y) к значению и все еще иметь положительное значение.

Шаг за шагом:
1) Сдвиньте символ в диапазон 0 - 25 включительно:
int value = letter - 'a';

2) Удалите смещение Цезаря путем «вычитания»клавиша:
value = (value + 26 - key) % 26;

3) Смещение значения в диапазон a до z:
char decrypted_letter = value + 'a';

...