web-dev-qa-db-ja.com

線形合同ジェネレーターのクラック

私は最近セキュリティがポッドキャストになっているのを聞いていましたが、彼らは線形合同生成器(LCG)は簡単に解読できると言っていました。私は1年目の統計計算クラスでLCGを使用しており、LCGを解読すると「特別な」問題が発生すると考えました。

力ずくでLCGをクラックする素晴らしい方法はありますか?


この質問がOTかどうかはわかりませんが、他に質問を投稿する場所がわかりません。また、新しいタグを作成するのに十分な担当者がいないため、私のタグはあまり役に立ちません。

34
csgillespie

はい。線形合同ジェネレーターを破る非常に効率的な方法があります。

線形合同ジェネレーターはsで定義されますn + 1 = a s + b modm、ここでmは係数です。最も単純な形式で、ジェネレータはsを出力するだけですとして 疑似乱数。 mが攻撃者に知られていて、aである場合、bは知られていないその後、トーマスはそれを破る方法を説明しました。

abmのいずれもわからない場合でも、最初にmを回復することにより、線形合同生成器を壊します。これを効率的に行う方法を導き出すことは興味深い演習です。できます。以下にその方法を示します。あなた自身でそれを理解しようとすることを好むなら読み続けないでください。

mを回復するには、tを定義します = sn + 1 -sおよびu= |tn + 2 t -t2n + 1|;高い確率でm= gcd(あなた1、あなた2、...、u10)。ここで10は任意です。 kとすると、これが失敗する確率はkで指数関数的に小さくなります。誰か興味があれば、これが機能する理由へのポインタを共有できます。

重要な教訓は、線形合同生成器は不可解なほど安全ではないであり、暗号化の使用には完全に適さないことです。


追加:@AviDは私をさらに嫌いにします:)しかし、これが機能する理由、それを要求した人のための数学は次のとおりです。

重要なアイデア:tn + 1 = sn + 1 -s =(a s -b)-(a sn-1 -b)= a s - なのでn-1 = a tmodm、およびtn + 2 = a2 tmodm、およびtn + 3 = a tmodm。したがって tn + 2 t -tn + 12 = 0 modm、つまり|tn + 2 t -tn + 12| mのランダムな倍数です。ニフティ数論の事実:mの2つのランダムな倍数のgcdは、確率6 /πでmになります2 = 0.61;そして、それらのkのgcdを取ると、この確率は1に非常に近くなります(kで指数関数的に高速)。それはクールですか、それとも何ですか?

36
D.W.

線形合同ジェネレーターはlinearです。

つまり、次のように更新される状態sがあります:s←as + b mod w、2つの定数aおよびb、および便利な係数w(通常は232saおよびbは32ビットワードです);出力はsの連続する値で構成されます。 3つの連続する出力がある場合(ss1およびs2)の場合、2つの未知数(aおよびb)の2つの線形方程式が得られます。これらは、初等演算で簡単に解決できます。

これは、値の一部のみを取得するバリアントに拡張できますs、おそらく連続していない。 aおよびbが2つの32ビット定数である場合、定数を再計算するために必要な出力は約96ビットだけです。

18
Thomas Pornin

Mを解く別の方法は、これ paper から来ます。

基本的に、この方法は、線形合同ジェネレーターが平面テストに劇的に失敗するという事実を利用しています。 4つの出力を使用する3x3行列の行列式は、mの倍数です。

2つの倍数のgcd(n_1およびn_2ofmismifx_1=n_1/mおよびx_2=n_2/mは素数です。

K個の整数が素数である確率は1 /ζ(k)で与えられるため、x_1およびx_2は互いに素で、1 /ζ(2)または6 /π^ 2、約61%です。

@Thomasが言ったように、mが見つかったら、問題の残りの部分は簡単です。

3
Jon Takagi