维吉尼亚密码 C++
Posted
技术标签:
【中文标题】维吉尼亚密码 C++【英文标题】:Vigenere cipher C++ 【发布时间】:2017-05-06 15:47:37 【问题描述】: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 HZU18CLASSICAL_CIPHER
HKJ18NAHSSTRHL_NXWHEC
应该是:HKJ18JLADHPCAW_RPphpG 我认为输入没问题,功能出了问题。 C:\Users\adm1n\Desktop\C\HZToolkit>HZToolkit --evig --key ALPHA ALPHA 输出:AWEOA
【问题讨论】:
【参考方案1】:为什么你认为这是错误的?请注意,即使明文不是字母,您仍然“提前”密钥(至少,这是您的程序当前所做的)。
排列纯文本并复制密钥:
Plain: HZU18CLASSICAL...
Key: ALPHAALPHAALPHA...
^ ^^ ^
You get: HKJ18NAHSSTRHL...
You expect: HKJ18JLADHPCAW...
注意标有^
的地方:那些是密钥等于A
的地方,因此不会进行加密(明文字母变成密文字母)。
我觉得很好。
(虽然解密被破坏了。作为提示,请注意ROTDecode
不会以相同的方式处理小写和大写字母)。
【讨论】:
感谢您的回答。我明白出了什么问题:函数应该忽略非字母符号。以上是关于维吉尼亚密码 C++的主要内容,如果未能解决你的问题,请参考以下文章