这是我从编程讲师那里得到的一项任务。 我们将为所有可打印的ASCII代码实现vigenere密码并使用它运行测试。
vigenere密码是一种使用多个凯撒密码的多字母密码,其密码为1。另请参阅Wikipedia
我实现了如下所示的vigenere,但是我的作业中的测试没有为我的实现生成所需的输出。
我做了一个搜索,但似乎这种ASCII实现非常稀疏。 我的代码中是否有明显错误,我没有看到?
public String encrypt(String plaintext) {
String cipherText = "";
for (int i = 0; i < plaintext.length(); i++) {
char c = plaintext.charAt(i);
// vigenere for the letters A-Z is defined as vigenere(m) = m[i] + k[i] % 26
// where m[i] is the message and k[i] is the key.
//
// For ASCII support, as printable space starts at 32,
// subtract 2*32 from the sum of keyChar and messageChar to get zero based.
// Then calculate the modulo of this sum to be sure to stay in bounds.
// Finally add 32 to the result of the modulo operation to place it in the 32 - 126 range.
//
// The key wrapping is implemented as i % _key.length() to restart
// from the beginning if the end of the key is reached.
cipherText += (char) ((c + _key.charAt(i % _key.length()) - 64) % 94 + 32);
}
return cipherText;
}
答案 0 :(得分:0)
您的代码和评论之间的唯一区别是当您使用%94 时,范围32到126包含 95 字符。
更改相应的语句以使用模数95,然后稍微分解一下:
int caesar = _key.charAt(i % _key.length()) - 32;
int sum = c - 32 + caesar;
cipherText += (char) (sum % 95 + 32);
然后你的解密算法可以使用所有相同的代码,只用以下代码替换上面的第二个语句:
int sum = c - 32 + (95 - caesar);