5

MTテンパリング機能を逆転させることができることはよく知られています。これを行うためのソース コードはオンラインで入手できます。私は、これがどのように機能するか、また、これと同様の問題にプログラムでどのようにアプローチするかを理解しようとしています。

私が苦労しているのは、有限サイズの変数でシフト操作を行うと、不可逆的なデータ損失が発生するということです。同様に、ビット単位の AND 演算でも永久的なデータ損失が発生するはずですが、提供されているサンプル コードを使用すると、任意の値を元の調整前の状態に戻すことができます。

もう1つのことは、私が混乱していることです。非一時的なシフト操作が一時的な機能と同じ方向と量にシフトしていることです。

4

1 に答える 1

6

Feistel ネットワークの構造を考えてみましょう。基本的な動作原理は、データを 2 つの部分に分割し、一方の部分をマスクにハッシュして、もう一方の部分に排他的論理和を適用することです。ハッシュ自体がそうでない場合でも、これは元に戻すことができます。復号化中に、同じ (潜在的に破壊的な) ハッシュ操作を使用して、以前と同じマスクを生成し、それを他の部分に対して排他的論理和することで、元の値に復元します。この操作をさまざまな分割で繰り返すことができるため、すべてのビットが他のすべてのビットに影響を与え、影響を受ける機会が得られます。チェーンを逆方向に再生して復号化するだけです。

同様に、破壊的シフトとビットごとの AND は、元の値の完全なコピーを置換するために使用される排他的 OR マスクとしてのみ使用されます。

k ^= k >> 11k の上位 21 ビットを取得し、それらを k の下位 21 ビットで排他的論理和することを意味します。k の上位 11 ビットは変更されず、これらのビットを再度排他的論理和することにより、k の次の 11 ビットを復元するために使用できます。次に、これらの新しく発見された k の元のビットを使用して、残りの k の元の値を復元できます。

于 2013-05-25T10:51:00.813 に答える