Vigenere Encription с другим модом - PullRequest
0 голосов
/ 19 декабря 2018

Я пытался написать программу на C ++, которая может зашифровывать заданные буквы в Vigenere-зашифрованные.Это работает, если алфавит состоит из 26 букв, но когда я пытаюсь заставить их работать с алфавитом разного размера (скажем, 25 для этого примера), я получаю нерелевантные коды.

Например:

ALPHABET: ABCDEFGHIJKLMNOPQRSTUVWXY (длина алфавита 25)ТЕКСТ: MUADGRATRYINGTOMAKEITWORKКЛЮЧ: КАЙДЖГENCRYPTEDTEXT: CANRRHFHGKXSTIACFXSTJCCGVDECRYPTEDTEXT: RAFILWFYWENSLYTRFPJNYCTWP

Моя текущая формула для шифрования:

    for (i = 0; i < lengthoftext; i++) {

        encryptedtext[i] = ((text[i] + keytext[i]) % alphabetlength) + 'A' + 1;
        if (encryptedtext[i] < 65) {
            encryptedtext[i] = encryptedtext[i] + alphabetlength;
        }
        if (encryptedtext[i] > 90) {
            encryptedtext[i] -= alphabetlength;
        }

И формула для расшифровки:

    for (i = 0; i < lengthoftext; i++) {
          decryptedtext[i] = (((decryptedtext[i] - keytext[i]) + alphabetlength) % alphabetlength) + 'A' - 1 - (5 * (26 - alphabetlength));
        if (decryptedtext[i] < 65) {
            decryptedtext[i] = decryptedtext[i] + alphabetlength;
        }

        if (decryptedtext[i] > 90)
            decryptedtext[i] = decryptedtext[i] - alphabetlength;
    }

Итак, она работает для мода 26 безпроблемы, но когда я пытаюсь изменить свой алфавит в, скажем, ABCDEFGH, а затем пытаюсь вернуть его в расшифрованном виде, я получаю несущественные результаты.Я не смог найти шаблон при изменении длины алфавита.Я хотел бы знать, как изменить мои формулы или новый способ шифрования.

1 Ответ

0 голосов
/ 19 декабря 2018

Давайте проанализируем, что происходит с вашим кодом, например, для первой буквы «М».

Я заменю это в вашей первой строке кода. Кстати, я предполагаю, что keyText содержит повторение вашего ключевого слова столько раз, сколько необходимо для того, чтобы содержать такое же количество символов, как в вашем примере: KAIJGKAIJGKAIJGKA....

encryptedtext[i] = ((text[i] + keytext[i]) % alphabetlength) + 'A' + 1;

Это будет выглядеть примерно так:

encryptedtext[i] = (('M' + 'K')% 25) + 'A' + 1

Заменив значения на таблицу ascii , вы получите:

encryptedtext[i] = ((77 + 75)% 25) + 65 + 1, что означает encryptedtext[i] = 67

Что действительно является C.

В итоге : ASCII имеет таблицу алфавита из 26 символов, которая, возможно, нетакой же, как ваш alphabetlength.Создайте свою собственную карту алфавита, не полагайтесь на переводы с ASCII на int, это просто напрашивается на неприятности.

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