криптография — шифрование Vigenere Stack Overflow

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

0

Решение

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

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

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

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

Кажется, хорошо для меня.

(Расшифровка сломана, хотя. Как подсказку, обратите внимание, что ROTDecode не обрабатывает строчные и прописные буквы одинаково).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]