2

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 (復号化) をカウントするようになりました。ただし、復号化しても正しい平文は得られません。

4

3 に答える 3

3

物事を最小限にとどめると、物事が見やすくなることがあります。この疑似コードの最小限の Feistel 暗号が役立つ場合があります。

function FeistelEncipher(plaintextBlock)

  left <- left hand half of plaintextBlock
  right <- right hand half of plaintextBlock

  // Note the half-open interval.
  for (roundNumber in [0 .. number of rounds[)

    if (roundNumber != 0)
      swap(left, right)
    end if

    right <- right XOR F(left, roundNumber)

  end for

  // Return ciphertext block.
  return join(left, right)

end function


function F(data, roundNumber)

  return some combination of the data and the round key for this round

end function

偶数回のラウンドが想定され、反転された終了 '[' はオープン エンド インターバルを示します。

于 2016-11-01T17:11:08.007 に答える
2

あなたのラウンド カウンターは対称的ではありません。

for(int r = 0; r < 3; r++)

カウント: 0、1、2。

for(int r = 3; r > 0; r--)

カウント: 3、2、1。

于 2016-10-30T16:38:42.990 に答える