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 &amp;key。如果这样做,编译器会为您捕捉到这个错误。

【讨论】:

以上是关于C++ 维吉尼密码的主要内容,如果未能解决你的问题,请参考以下文章

CS50 - pset2 - 维吉尼

在一维数组中写维吉尼广场

与维吉尼斗争! (在 C 中)二进制表达式('int *' 和 'int')和其他东西的无效操作数

具有所需功能的 Python Vigenere Cipher

Vigenere 没有在 python 中加密我的消息

ExtraVM法国/美国维吉尼亚/达拉斯高防VPS:AMD处理器,KVM虚拟化,3.5美元/月起