Шифр Виженера C ++

HZVIG.cpp:

#include "HZVIG.h"

char ROTEncode(char inchar, int rot)
{
    if (IsBigLetter(inchar))
        return ((int)inchar - (int)'A' + rot) % 26 + 'A' - 1;
    else if (IsSmallLetter(inchar))
        return ((int)inchar - (int)'a' + rot) % 26 + 'a' - 1;
    else
        return inchar;
}
char ROTDecode(char inchar, int rot)
{
    if (IsBigLetter(inchar))
        return ((int)inchar - (int)'A' - rot + 26) % 26 + 'A' - 1;
    else if (IsSmallLetter(inchar))
        return ((int)inchar - (int)'a' + rot + 26) % 26 + 'a' - 1;
    else
        return inchar;
}
std::string VIGDecode(std::string instring, std::string key)
{
    std::string result;
    for (int i = 0; i < instring.length(); i++)
        result += ROTDecode(instring[i], key[i % key.length()] - 'A' + 1);
    return result;
}
std::string VIGEncode(std::string instring, std::string key)
{
    std::string result;
    for (int i = 0; i < instring.length(); i++)
        result += ROTEncode(instring[i], key[i % key.length()] - 'A' + 1);
    return result;
}

HZVIG.h:

#include <string>

#define IsBigLetter(a) a >= 'A' && a <= 'Z'
#define IsSmallLetter(a) a >= 'a' && a <= 'z'

std::string VIGDecode(std::string instring, std::string key);
std::string VIGEncode(std::string instring, std::string key);

Этот код работает, но имеет неправильный вывод:

C:\Users\adm1n\Desktop\C\HZToolkit>HZToolkit --evig --key ALPHA HZU18{CLASSICAL_CIPHER}
HKJ18{NAHSSTRHL_NXWHEC}

Должно быть: HKJ18 {JLADHPCAW_RPPHPG} Думаю, с вводом все в порядке, что-то не так с функциями. C: \ Users \ adm1n \ Desktop \ C \ HZToolkit> HZToolkit --evig --key АЛЬФА АЛЬФА Выходы: AWEOA


person Zolboobayar G.    schedule 06.05.2017    source источник


Ответы (1)


Как вы думаете, почему это неправильно? Обратите внимание, что даже если открытый текст не является буквой, вы все равно «продвигаете» ключ (по крайней мере, это то, что ваша программа сейчас делает).

Выравнивание простого текста и дублирование ключа:

     Plain: HZU18{CLASSICAL...
       Key: ALPHAALPHAALPHA...
            ^        ^^   ^
   You get: HKJ18{NAHSSTRHL...
You expect: HKJ18{JLADHPCAW...

Обратите внимание на места, отмеченные ^: там ключ равен A, поэтому шифрование не происходит (буква открытого текста становится буквой зашифрованного текста).

Мне кажется, это нормально.

(Однако расшифровка не работает. В качестве подсказки обратите внимание, что ROTDecode не обрабатывает строчные и прописные буквы одинаково).

person YSK    schedule 06.05.2017
comment
Спасибо за ответ. Я понял, что не так: функции должны игнорировать неалфавитные символы. - person Zolboobayar G.; 07.05.2017