C++ 维吉尼密码
Posted
技术标签:
【中文标题】C++ 维吉尼密码【英文标题】:C++ Vigenere Cipher 【发布时间】:2016-09-25 16:00:15 【问题描述】:我用 C++ 为 Vigenere Cipher 编写了这段代码(假设明文和密钥是小写的)。
void encrypt(string& plaintext , string key)
int j = 0;
for(int i=0; i<plaintext.length(); i++)
//cout<<"value of key["<<j<<"] = "<<int(key[j])<<endl;
plaintext[i] -= 97;
key[j] -= 97;
plaintext[i] = ((plaintext[i] + key[j])%26)+97;
j = (j+1)%key.length();
问题是当 'j' 被重置为 0 时,key[j] 结果为 NULL(0)。 例如。如果我假设 plaintext 为 'human' 并且 key 为 'abcd' 明文的前 4 个字符被正确加密,但对于最后一个字符 key[j ] 值变成了 0 或 Null,而不是回到 'a'。
我不确定为什么会这样。我猜字符串类隐式处理 Null 值,这让我更加困惑。
【问题讨论】:
检查key.length()
的内容。对于“abcd”键,它显然应该是 4,但根据您的描述,它必须是 5。无论代码设置了 key
的值,它都错误地这样做了,这就是错误所在,而不是这里。
@SamVarshavchik 我尝试打印它并显示 4
【参考方案1】:
key[j] -= 97;
在第一次通过密钥时,这段代码会乱涂乱画。
如果key
是“abcd”,那么在第二次通过时,它将是 0。
不要在你的函数中修改key
。由于不应更改该参数,因此应将其声明为const std::string key
,或者更好的是const std::string &key
。如果这样做,编译器会为您捕捉到这个错误。
【讨论】:
以上是关于C++ 维吉尼密码的主要内容,如果未能解决你的问题,请参考以下文章
与维吉尼斗争! (在 C 中)二进制表达式('int *' 和 'int')和其他东西的无效操作数