Vigenere Cipher输出

时间:2015-10-19 15:08:14

标签: java vigenere

我正在查看https://github.com/gradha/Stackoverflow33217896上提供的Vigene Ciphere源代码。我尝试自己测试程序,但它并没有输出我期望的基于vigene的值。例如' dog'成为这个词和' bob'作为关键,我希望将其加密到' ech'但是' qot'代替。

public static void main(String[] args) {
    String key = "bob";
    String ori = "dog";
    String enc = encrypt(ori, key);
    System.out.println(enc);

}

static String encrypt(String text, final String key) {
    String res = "";
    text = text.toLowerCase();
    for (int i = 0, j = 0; i < text.length(); i++) {
        char c = text.charAt(i);
        if (c < 'a' || c > 'z') continue;
        res += (char)((c + key.charAt(j) - 2 * 'A') % 26 + 'A');
        j = ++j % key.length();
    }
    return res;
}

然而输出是不同的。这是因为我对密码的理解不正确,或者采用了与众所周知的vigenere密码不同的方法。

2 个答案:

答案 0 :(得分:0)

因为您要将文本设置为加密为小写,请尝试将这些字符文字更改为小写:

res += (char)((c + key.charAt(j) - 2 * 'a') % 26 + 'a');

将int转换为char时,必须考虑&#39; a&#39;的整数值。不等于&#39; A&#39;。因为您正在检查当前角色是否在&#39;之间。和&#39; z&#39; (因为你已经将它设置为小写),你也应该有一个小写的输出。

答案 1 :(得分:0)

正如用户已经指出的那样,您应该将行更改为:

res += (char)((c + key.charAt(j) - 2 * 'a') % 26 + 'a');

或者,你可以改变这个:

if (c < 'a' || c > 'z') continue;

到此:

if (c < 'A' || c > 'Z') continue;

确保将ASCII转换回字母时,您使用的是正确的ASCII值(即大写为65 (A),小写为97 (a)。)