2016-08-01 16 views
2

暗号をより堅牢にして大文字と小文字を区別するように努力しました。大文字と小文字を区別するVigenere暗号で間違った出力が生成される

大文字がメッセージ文字列内にある場合、出力はその場所の文字列にエンコードされた大文字を持ちます。例えば、InpUT MesSagEHrhTS 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'が'を回すために使用されたものを含めることができhow fun 'を' qZU Grv'に、または 'key'を入力と出力の例に使用していますか? –

+0

そのメッセージとキーの出力は 'BrhNM QwlLeyX'になります。 – GoogleMac

+1

Uとt(テストでは4番目の文字)85 + 116 = 201 201-130 = 81 81 mod 26 = 3 N(78)と7を加えて、また、「Z」と書かれているように、最終的なelseに落ち込みます。あなたが望むものならば、少なくともコメントを付ける必要があります。 –

答えて

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のようにスペースチェッカー?それはどうですか? – GoogleMac

+0

私は実際に解読方法を正しく取得できないようです。それはほぼ同じですが、私は知っていますが、2つの主な行は私が絞り込むことができないものです。 – GoogleMac

+0

他の文字を扱うには最初にifを削除し、ifなら現在のelseを作成し、elseをelseに置き換えます(cur> = 'A' && cur <= 'Z')。出力+ =現在の文字列を文字列として出力します。 –

関連する問題