申し訳ありませんが、この議論に遅れてしまいましたが (今は 3 年半経っていますか?)、PRN 生成とエントロピーの代替ソースに再び関心を持っています。Linux カーネル開発者の Rusty Russell は最近、彼のブログでエントロピーの代替ソース (.NET 以外/dev/urandom
) について議論しました。
しかし、私は彼の選択にそれほど感銘を受けていません。NIC の MAC アドレスは決して変更されず (ただし、他のすべてのアドレスからは一意ですが)、PID は可能なサンプル サイズが小さすぎるように思われます。
私は、次のアルゴリズムでシードされたMersenne Twister (私の Linux ボックス上) に手を出しました。誰かが喜んで興味を持っている場合は、コメント/フィードバックを求めています。
- 64 ビット + 256 ビット *
/proc
以下のファイル数の配列バッファーを作成します。
- このバッファの最初の 64 ビットにタイム スタンプ カウンタ (TSC) の値を配置します。
次の各/proc
ファイルについて、SHA256 サムを計算します。
- このバッファ全体の SHA256 ハッシュを作成します。注: SHA 関数とは完全に独立した別のハッシュ関数を使用することもできます (おそらく使用する必要があります)。この手法は、弱いハッシュ関数に対する「保護」として提案されています。
これで、Mersenne Twister をシードするための 256 ビットのランダムな (十分な) エントロピー データが得られました。上記を使用して、MT 配列 (624 個の 32 ビット整数) の先頭に入力し、その配列の残りの部分を MT 作成者のコードで初期化します。また、別のハッシュ関数 (SHA384、SHA512 など) を使用することもできますが、別のサイズの配列バッファーが必要になります (明らかに)。
元の Mersenne Twister コードは 1 つの 32 ビット シードを必要としていましたが、それでは恐ろしく不十分だと感じています。暗号を解読するために「単に」2^32-1 の異なる MT を実行することは、この時代において実用的な可能性の領域を超えているわけではありません。
これに関する誰かのフィードバックを読みたいです。批判は大歓迎です。/proc
ファイルは常に変化しているため、上記のようにファイルの使用を擁護します (特に/proc/self/*
ファイル、および TSC は常に異なる値 (ナノ秒 [またはそれ以上] の解像度、IIRC) を生成します)。私はこれに対してダイハード テストを実行しました (数千億ビットの曲)、そしてそれは飛んでいるように見えます. しかし、それはおそらく、私がそれをどのようにシードしているかよりも、PRNG としての Mersenne Twister の健全性を証明するものです.
もちろん、これらは誰かがハッキングしても完全に無防備というわけではありませんが、私が生きている間に、これらすべて (および SHA*) がハッキングされて破られるのを見たことがありません。