我已經付出了很多努力使密碼更加健壯,以便輸出區分大小寫。區分大小寫的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));
你能[編輯]你的問題,包括什麼'key'被用來打開'如何玩轉'到'qZU Grv'或者你正在使用的'鍵'的輸入輸出? –
該消息和密鑰的期望輸出將是'BrhNM QwlLeyX'。 – GoogleMac
用U和t(第四個字母在測試中)85 + 116 = 201 201-130 = 81 81 mod 26 = 3加N(78)和7,你有88,這是X不是T?此外,正如書面的'Z'將會進入最後的其他部分,如果它是你想要的,至少應該得到評論。 –