私は疑似乱数ジェネレータについて読みましたが、「基礎となるハッシュ関数」と「基礎となるブロック暗号」を使用するという特定の要求がありました。ハッシュアルゴリズムとブロック暗号は、乱数生成でどのような役割を果たしますか?
ハッシュ関数は、潜在的にバイアスされた入力データを受け取り、それらのバイアスがシステムのRNG状態の品質に悪影響を及ぼす可能性が非常に低い方法で変換するための混合関数としてよく使用されます。これは、部分的なランダム性しか含まれていない可能性があり、一部のデータが攻撃者の影響を受ける可能性があるソースからエントロピーを蓄積しようとしている場合に役立ちます。入力ビットのいずれかが不明で予測不可能である限り、ハッシュからの出力ビットはその予測不可能性を保持します。
対称暗号は、DRBG(確定的ランダムビットジェネレーター)の生成によく使用されます。 AESやRC4などの暗号を、秘密シード値をキーとするストリーム暗号として構成することにより、暗号の出力は暗号的に安全なランダムビットジェネレーターになります。これは、反復可能で安全な乱数が必要な場合に役立ちます。 2つのシステムはどちらも同じ乱数ストリームを生成する必要がありますが、乱数は安全である必要があります。
暗号的に安全な疑似乱数ジェネレータ(以前の出力からの出力を予測できないもの)が必要な場合、一般的な方法は、別の暗号プリミティブを再利用することです。
一般的なパターンは、ハッシュまたは暗号化アルゴリズムを使用し、その出力を入力として常にフィードバックするというものです。
秘密鍵で暗号化アルゴリズムを使用すると、各ラウンドの完全な出力を疑似乱数として使用できます。ハッシュアルゴリズムを使用する場合は、その一部のみを使用するか、すべてのハッシュラウンドに秘密のソルト値を追加します。