Feistel Cipher の小さな実装をしようとしています。これは私が試してきたことです:
int[] left = {1,2,3};//left half of plaintext
int[] right = {4,5,6};//right half of plaintext
int temp[];//temp for swapping values
//encrypt the plaintext (left and right arrays)
for(int r = 0; r < 3; r++) {//the number of rounds
for(int i = 0; i < right.length; i++){
right[i] = left[i] ^ (scramble(right[i], KEY, r));
}
temp = left;
left = right;
right = temp;
}
//swap left and right array before decryption
temp = left;
left = right;
right = temp;
for(int r = 3; r > 0; r--) {//start from the last round
for(int i = 0; i < right.length; i++) {
right[i] = left[i] ^ (scramble(right[i], KEY, r));
}
//again, swap arrays to do the next round
temp = left;
left = right;
right = temp;
}
ラウンド関数scramble
は次のとおりです。
private static int scramble(int character, int key, int roundNumber) {
return (int) Math.pow(2 * roundNumber * key, character) % 15;
}
最初に平文の左半分と右半分を暗号化してから、復号化ラウンドを実行しようとしています。したがって、最終的に、配列の値は [1,2,3] と [4,5,6] になるはずです (平文に戻る)。8 のキー入力を使用して、復号化後に [15, 13, 0] と [8, 12, 1] の値を取得しています。これのどこが間違っているのですか?
簡単にするために、ファイルからの読み取り/バイト配列の使用とは対照的に、キーとして定数を使用し、整数の入力を使用しています。
編集:
ループのカウントが正しくありませんでした。「暗号化ループ」を次のように変更しました。
for(int r = 1; r < 4; r++) {//the number of rounds
for(int i = 0; i < right.length; i++){
right[i] = left[i] ^ (scramble(right[i], KEY, r));
}
temp = left;
left = right;
right = temp;
}
ループはラウンド 1、2、3 (暗号化) および 3、2、1 (復号化) をカウントするようになりました。ただし、復号化しても正しい平文は得られません。