2015-10-19 155 views
3

我正在查看http://rosettacode.org/wiki/Vigen%C3%A8re_cipher#Java上提供的Vigene Ciphere源代码。我试着自己测试了这个程序,并没有输出我期望基于vigene的值。例如'dog'这个词,'bob'是我希望这个被加密为'ech'的关键字,但是'qot'代替。Vigenere密码输出

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密码采取了不同的方法。

+0

“但是,输出是不同的”它是什么呢? –

+0

@AndyTurner QOT – Rishav

+0

@RishavKundu假设这不仅仅是我没听说过的缩写词,最好在问题中加入它 - 补充。 –

回答

0

因为你设置你的文本加密为小写,请尝试更改这些字符文字为小写,以及:

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

当铸造一个int为char,你必须要考虑到的是,整数值'a'不等于'A'。因为您正在检查当前字符是否在'a'和'z'之间(因为您已将其设置为小写字母),所以您还应该使用小写字母输出。

+0

啊谢谢!你能否向我解释这条线实际上在做什么? – user2982832

+0

由于java中的字符值具有不同的整数值(2 *'a'与2 *'A'不同),所得字符将根据计算的整数值稍微关闭,然后转换为字符。 –

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大写为,小写为97 (a))。

+1

“或者,你可以改变......”这意味着什么都不会被加密,因为之前有几行“text.toLowerCase()”。 –