2017-03-13 6 views
0

ハードコードされた「アルファベット」配列を使用して元の平文メッセージの各文字に数値を代入するJavaで平文Feistel Cipherを実装しようとしています。私の問題は、私は左と右半分とXORに関数を適用した後、私は時々私の「アルファベット」配列の境界外にある数を残していますということです。ここでFeistel Cipher関数のXORの後のarrrayindexoutofbounds

は、アルファベットの配列です:

public static char[] alphabet = new char[] {'a', 'b', 'c', 'd', 'e','f' ,'g', 'h', 'i', 
     'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' '}; 

これは、関数である:

private static int function(int character, int key, int roundNumber) { 
    return (2 * roundNumber * key * character) % 26; 
} 

そして、ここでは、暗号化のためのコードのブロックです:

for(int r = 1; r <= rounds; r++) { 

     String str1 = ""; 
     String str2 = ""; 
     // looping through left half and applying XOR with function 
     for(int i = 0; i < midpoint; i++){ 
      leftHalf[i] ^= (function(rightHalf[i], KEY, r)); 
      System.out.println(leftHalf[i]); 

      // turn left half numbers back to chars 
      str1 += alphabet[leftHalf[i]]; 

     } 

     // turning right half numbers back to chars 
     for (int i = 0; i < rightHalf.length; i++) { 
      str2 += alphabet[rightHalf[i]]; 
     } 

     System.out.println("ENCIPHER-" + r + " " + str1 + str2); 
     temp = leftHalf; leftHalf = rightHalf; rightHalf = temp; // swap after 

     KEY++; 
    } 

エラーがで起こりますこのライン:

str1 += alphabet[leftHalf[i]]; 

それはアルファベット配列に合うが、それは暗号のポイント遺跡と私はそれを解読することができませんように、私は%26に左半分[i]の数を試してみました。

私はまた、いくつかの異なる機能を試してみましたが、私はそれが主にXORとしなければならないと思います。 XORがアルファベット配列の境界内に何かを返すかどうかを確認する方法はありますか、またはこの全部を間違った方法で行っていますか?どんな助けもありがとうございます。

また、エラーコード:私はそれを把握することができた

Please enter a message to be encrypted: hello there 
Please enter number of encryption rounds between 1 and 20: 5 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 31 
at com.company.FeistelCipher.main(FeistelCipher.java:94) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
[7][4][11][11][14][26][26][19][7][4][17][4] 
Original Message: hello there 
5 
24 
31 

Process finished with exit code 1 

答えて

0

かなり確信して。だから、アルファベット配列の最高の配列インデックスは26だったので、XORは最高で5ビット操作(2進数で10111)になります。 5ビットでは、XORが生成する最大数は31(2進数で11111)です。だから、僕はその後、私は念の機能は、弾性率が何のためにあるのかである、同様に5ビット内の数を返さなければならなかったその長さ31を作るためにアルファベット配列に5以上の冗長、未使用の小文字を追加しました。

新しい配列:

public static char[] alphabet = new char[] {'a', 'b', 'c', 'd', 'e','f' ,'g', 'h', 'i', 
     'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ', 'a', 'b', 'c', 'd', 'e', 'f'}; 

新機能:%26で

private static int function(int character, int key, int roundNumber) { 
    return (2 * roundNumber * key * character) % 23; 
} 

古い機能は大丈夫だったが、23%は私に、より良い暗号化さ結果を与えていました。いずれにせよ、彼らは5ビット以下である。