2016-08-01 52 views
2

我已經付出了很多努力使密碼更加健壯,以便輸出區分大小寫。區分大小寫的Vigenere密碼會產生錯誤的輸出

含義,如果大寫字母在消息字符串中,則輸出將在該位置的字符串中具有編碼大寫字母。例如InpUT MesSagE變爲HrhTS WwlReyD。使用的密鑰是test

public String encrypt(String text, final String key) { 
    int a_num = (int) 'a'; 
    int A_num = (int) 'A'; 
    String output = ""; 
    for (int i = 0, j = 0; i < text.length(); i++) { 
     int cur = (int) text.charAt(i); 
     // check for spaces 
     if (text.charAt(i) == ' ') { 
      output += " "; 
     // check for lowercase 
     } else if (cur >= 'a' && cur < 'z' + 26) { 
      output += Character.toString((char) ((cur + key.charAt(j) - 2 * 'a') % 26 + 'a')); 
      j = ++j % key.length(); 
     // check for uppercase between 'N' and 'Z' 
     } else if (cur >= 'N' && cur < 'Z') { 
      output += Character.toString((char) ((cur + key.charAt(j) - 2 * 'A') % 26 + 'N' + 7)); 
      j = ++j % key.length(); 
     // check for uppercase between 'A' and 'M' 
     } else { 
      output += Character.toString((char) ((cur + key.charAt(j) - 2 * 'A') % 26 + 'A' - 6)); 
      j = ++j % key.length(); 
     } 
    } 
    return output; 
} 

目前,所有的小寫字母看起來都是正確的,並且有些大寫字母可以。我的問題有時是大寫錯誤,例如符號將成爲輸出的一部分,因爲我的數學/邏輯不正確。

,我敢肯定的變量有問題在代碼中的這些部分:

((cur + key.charAt(j) - 2 * 'A') % 26 + 'A' - 6)); 
+1

你能[編輯]你的問題,包括什麼'key'被用來打開'如何玩轉'到'qZU Grv'或者你正在使用的'鍵'的輸入輸出? –

+0

該消息和密鑰的期望輸出將是'BrhNM QwlLeyX'。 – GoogleMac

+1

用U和t(第四個字母在測試中)85 + 116 = 201 201-130 = 81 81 mod 26 = 3加N(78)和7,你有88,這是X不是T?此外,正如書面的'Z'將會進入最後的其他部分,如果它是你想要的,至少應該得到評論。 –

回答

0
public String encrypt(String text, final String key) { 
    // we assume the key is all lower case 
    // and only inputs are letters and space (could enhance to leave all else alone) 
    int a_num = (int) 'a'; //unused? 
    int A_num = (int) 'A';//unused? 
    String output = ""; 

    for (int i = 0, j = 0; i < text.length(); i++) { 
     int cur = (int) text.charAt(i); 

     // check for spaces 
     if (text.charAt(i) == ' ') { 
      output += " "; 
     } 
     // check for lowercase 
     else if (cur >= 'a' && cur <= 'z') { 
      output += Character.toString((char) ((cur + key.charAt(j) - 2 * 'a') % 26 + 'a')); 
      j = ++j % key.length(); 
     } 
     // should work for uppercase between 'A' and 'Z' 
     else { 
      output += Character.toString((char) ((cur -'A' + key.charAt(j) - 'a') % 26 + 'A')); 
      j = ++j % key.length(); 
     } 
    } 
    return output; 
} 
+0

我會盡快嘗試這個,我假設要「增強」它,讓其他字符單獨使用,這將需要另外一個聲明捕獲所有符號等等,就像th一樣e空格檢查器?這是如何完成的? – GoogleMac

+0

我其實似乎無法得到正確的解密方法。我知道,這幾乎是一樣的,但兩條主線是我無法縮小的。 – GoogleMac

+0

來處理其他字符我會刪除第一個,如果,使當前如果一個if,使當前其他人進入其他if(cur> ='A'&& cur <='Z'),然後做一個新的else說輸出+ =當前字符投射爲一個字符串。 –