web-dev-qa-db-ja.com

乱数ジェネレーターの状態を判断する方法は?

コンピューティングで強力な暗号番号を取得するには、優れた乱数ジェネレータが必要であると常に言われています。ランダム性の優れたソースがなければ、攻撃者が乱数ジェネレータの状態を判断し、次の乱数を予測する可能性があります。これは明らかに、暗号化キーなどを持っているか、持っている可能性があることを意味します。

これは非常に現実的な攻撃である必要があることはわかっていますが、これがどのように行われるのか私にはわからないので、これは常に理論的な攻撃であると考えていました。あまりよくない乱数ジェネレータの予測可能性を活用できる優れた現実のシナリオは何でしょうか(ただし、「コマンドプロンプトを開いてからの時間」よりも優れています)?

また、上記のジェネレーターでキーを生成し、ジェネレーターが実行されたシステムのおおよその知識のみを使用して攻撃者にそのキーを再作成させることは可能ですか?

または、より貧弱な乱数発生器の脆弱性を完全に誤解していますか?

3

多数の安全なプロトコルは、乱数または安全な疑似乱数に依存しています。どのWebリクエストがどのユーザーに属しているかを追跡するためにほとんどのWebアプリケーションによって作成されるセッションIDでさえ、乱数を使用して生成されるランダムな文字列に依存します。

たとえば、Webアプリケーションによって生成される次のセッションIDを予測できた場合、このセッションを乗っ取ることができます。

乱数は、さまざまなプロトコル(ssl、sshなど)でセッションキーを作成するために使用されます。これらのキーを予測できれば、これらのセッションで送信されたデータを復号化できます。これらはnonce値としても使用され、これらを予測できる場合、予測できないnonceに依存する多くのプロトコルを壊すことができます。

状態で取得する方法

乱数ジェネレーターの状態を推測するには、通常、RNGによって生成された多数の数値を観察する必要があります。

これは、これらの数値を要求するアプリケーションを監視する必要があることを意味するものではありません。同じRNGにアクセスできる場合(被害者のアプリケーションが存在する物理サーバーにアクセスできる場合に可能です)、別のプログラムを使用して、自分で100万または1000万の番号を要求できます。ただし、通常はRNGに直接アクセスできないため、通信を受動的に長時間観察するか、サーバー側をだましてこれらの数値をさらに提供する必要があります(たとえば、通常のユーザーとして接続し、暗号化キーのローテーションは、これを可能にする不適切に設計されたプロトコルで1秒あたり100回行われます)。

優れた乱数ジェネレータの品質の1つは、周期が非常に長いことです。彼らが繰り返し始める前に、非常に多くの呼び出しが必要です。

たとえば、わずか256回の呼び出しで一連の数値の繰り返しを開始する非常に悪いジェネレーターがあるとします。これらの乱数のいくつかを観察できれば、乱数発生器がシーケンスのどのポイントにあるかを簡単に特定でき、生成される将来のすべての数を正しく予測できます。

優れたジェネレータは、さまざまな統計テストに合格する数値も出力する必要があります。つまり、たとえば出力スペース内のすべての数値はほぼ同じ頻度で生成されるべきであり、検出可能なパターン(たとえば、RNGは常に偶数と奇数の間で交互に変化する)があってはならないということです。

RNG内の特定のパターンを検出できた場合、将来の「ランダムな」数値の一部を予測できることは別として、RNGの最も重要でない8ビットが特定の位置にあるときに、このパターンが常に発生することがわかります。構成。 RNGの状態の一部を推測できるようないくつかのパターンを特定できた場合、これらの観察を組み合わせて、状態全体の大部分を生成できます。

適切なRNGでは、生成する各出力ビットの状態全体を考慮する必要があります。しかし、これを行わないものがあるとしましょう。たとえば、最下位ビットがRNG状態の単一ビットにのみ依存する数値を生成するRNGがあるとします。これは、RNGが生成する数値ごとに、RNGの内部状態の一部がリークすることを意味します。代わりに、最下位ビットが2ビットの内部状態に依存している場合、RNGは、生成されるすべての数値でこれら2ビットの状態に関する重要な確率情報をリークします。

3
Out of Band