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
Почему вы думаете, что это неправильно? Обратите внимание, что даже если открытый текст не является буквой, вы все равно «продвигаете» ключ (по крайней мере, именно так сейчас поступает ваша программа).
Выравнивание простого текста и дублирование ключа:
Plain: HZU18{CLASSICAL...
Key: ALPHAALPHAALPHA...
^ ^^ ^
You get: HKJ18{NAHSSTRHL...
You expect: HKJ18{JLADHPCAW...
Обратите внимание на места, отмеченные ^
: те, где ключ равен A
Таким образом, шифрование не выполняется (незашифрованное письмо становится зашифрованным).
Кажется, хорошо для меня.
(Расшифровка сломана, хотя. Как подсказку, обратите внимание, что ROTDecode
не обрабатывает строчные и прописные буквы одинаково).
Других решений пока нет …