暗号をより堅牢にして大文字と小文字を区別するように努力しました。大文字と小文字を区別する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'が'を回すために使用されたものを含めることができhow fun 'を' qZU Grv'に、または 'key'を入力と出力の例に使用していますか? –
そのメッセージとキーの出力は 'BrhNM QwlLeyX'になります。 – GoogleMac
Uとt(テストでは4番目の文字)85 + 116 = 201 201-130 = 81 81 mod 26 = 3 N(78)と7を加えて、また、「Z」と書かれているように、最終的なelseに落ち込みます。あなたが望むものならば、少なくともコメントを付ける必要があります。 –