2015-10-19 80 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()」。 –