13

さて、これは完全に主観的なものだと思いますが、乱数ジェネレーターのエントロピーソースについて考えていました。ほとんどのジェネレーターには現在の時刻がシードされていますよね?さて、私は他のどのソースを使用して完全に有効なランダムな(緩い定義の)数値を生成できるかについて興味がありました。

複数のソース(時間+現在のHDDシーク時間[ここでは素晴らしい]など)を一緒に使用すると、単一のソースよりも「ランダムな」数値が作成されますか?ソースの量の論理的な制限は何ですか?本当にいくらで十分ですか?便利だからといって時間が選ばれるのでしょうか?

このようなことが許されないのならすみませんが、情報源の背後にある理論については興味があります。

4

15 に答える 15

19

ハードウェア乱数ジェネレーターに関するウィキペディアの記事には、物理​​的特性を使用した乱数の興味深い情報源がいくつかリストされています。

私のお気に入り:

  • PCに取り付けられたガイガーカウンターによって検出された核崩壊放射線源。
  • 半透明ミラーを通過するフォトン。相互に排他的なイベント(反射-送信)が検出され、それぞれ「0」または「1」ビット値に関連付けられます。
  • ランダムな電圧源を提供するために増幅された、抵抗器からの熱雑音。
  • アバランシェダイオードから発生するアバランシェノイズ。(それはどれくらいクールですか?)
  • PCに接続されたラジオ受信機によって検出された大気ノイズ

ウィキペディアの記事の問題のセクションでは、これらのソース/センサーの多くの脆弱性についても説明しています。センサーは、ほとんどの場合、経年劣化/劣化するにつれて、減少する乱数を生成します。これらの物理的なソースは、生成されたデータを分析できる統計的テストによって常にチェックされ、機器が静かに壊れていないことを確認する必要があります。

于 2008-11-19T02:46:07.863 に答える
9

SGIはかつて、エントロピーのソースとしてさまざまな「グロブフェーズ」の溶岩ランプの写真を使用していましたが、最終的にはLavaRndと呼ばれるオープンソースの乱数ジェネレーターに進化しました。

于 2008-11-19T02:53:44.277 に答える
5

私はRandom.ORGを使用しています。これらは、大気ノイズからの無料のランダムデータを提供し、メルセンヌツイスターRNGを定期的に再シードするために使用します。ハードウェアに依存せずに取得できるのとほぼ同じくらいランダムです。

于 2008-11-19T02:55:08.907 に答える
4

乱数ジェネレーターの「適切な」シードについて心配する必要はありません。シーケンスの統計的特性は、ジェネレーターのシード方法に依存しません。ただし、他にもあります。心配する。乱数生成の落とし穴を参照してください。

ハードウェア乱数ジェネレーターの場合、これらの物理ソースを測定する必要があり、測定プロセスには体系的なエラーがあります。「疑似」乱数は、「実際の」乱数よりも高品質であることがわかる場合があります。

于 2008-11-19T02:43:10.350 に答える
3

Linux カーネルは、デバイスの割り込みタイミング (マウス、キーボード、ハード ドライブ) を使用してエントロピーを生成します。ウィキペディアにエントロピーに関する素晴らしい記事があります。

于 2008-11-19T03:06:52.970 に答える
3

最新の RNG は、近くのシードの相関関係に対してチェックされ、シード後に数百回の反復が実行されます。残念ながら退屈ですが、本当の答えは、それはあまり重要ではないということです。

一般的に言えば、ランダムな物理プロセスを使用する場合は、それらが一様分布に準拠していることを確認する必要があります。

私の意見では、非常によく理解されている疑似乱数ジェネレーターを使用する方が良い場合がよくあります。

于 2008-11-19T03:29:16.933 に答える
2

一部のTPM(トラステッドプラットフォームモジュール)の「チップ」には、ハードウェアRNGがあります。残念ながら、私のDellラップトップの(Broadcom)TPMにはこの機能がありませんが、今日販売されている多くのコンピューターには、真に予測不可能な量子力学的プロセスを使用するハードウェアRNGが付属しています。Intelは熱雑音の種類を実装しています。

また、暗号化の目的でRNGをシードするために現在の時刻だけを使用したり、予測不可能性が重要なアプリケーションを使用したりしないでください。当時のいくつかの下位ビットを他のいくつかのソースと組み合わせて使用​​することはおそらく問題ありません。

同様の質問があなたに役立つかもしれません。

于 2008-11-19T19:22:15.467 に答える
2

ユーザーのマウスの動きを使用して乱数を生成する暗号化プログラムを使用しました。唯一の問題は、プログラムが一時停止し、適切に動作するために数秒間マウスをランダムに動かすようにユーザーに要求する必要があったことでした。これは常に実用的であるとは限りません。

于 2008-11-19T03:14:30.367 に答える
2

私は数年前にHotBitsを見つけました - 数字は放射性崩壊から生成されたもので、純粋に乱数です。

1 日にダウンロードできる数字の数には制限がありますが、これらを RNG の本当にランダムなシードとして使用するのはいつも楽しいことです。

于 2008-11-19T03:20:22.303 に答える
1

申し訳ありませんが、この議論に遅れてしまいましたが (今は 3 年半経っていますか?)、PRN 生成とエントロピーの代替ソースに再び関心を持っています。Linux カーネル開発者の Rusty Russell は最近、彼のブログでエントロピーの代替ソース (.NET 以外/dev/urandom) について議論しました。

しかし、私は彼の選択にそれほど感銘を受けていません。NIC の MAC アドレスは決して変更されず (ただし、他のすべてのアドレスからは一意ですが)、PID は可能なサンプル サイズが小さすぎるように思われます。

私は、次のアルゴリズムでシードされたMersenne Twister (私の Linux ボックス上) に手を出しました。誰かが喜んで興味を持っている場合は、コメント/フィードバックを求めています。

  1. 64 ビット + 256 ビット */proc以下のファイル数の配列バッファーを作成します。
  2. このバッファの最初の 64 ビットにタイム スタンプ カウンタ (TSC) の値を配置します。
  3. 次の各/procファイルについて、SHA256 サムを計算します。

    • /proc/meminfo
    • /proc/self/maps
    • /proc/self/smaps
    • /proc/interrupts
    • /proc/diskstats
    • /proc/self/stat

      256 ビットのハッシュ値を (1) で作成した配列のそれぞれの領域に配置します。

  4. このバッファ全体の 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*) がハッキングされ破られるのを見たことがありません。

于 2012-04-18T01:33:51.023 に答える
0

宇宙マイクロ波背景放射スペクトルの上のノイズ。もちろん、最初にいくつかの異方性、前景オブジェクト、相関検出器ノイズ、銀河と局所群速度、偏光などを削除する必要があります。多くの落とし穴が残っています。

于 2008-11-19T19:40:35.337 に答える
0

キーボード入力(キーストローク間のタイムアウト)を使用するものもあります。小説では、無線静的受信を使用できると思いますが、もちろん、他のハードウェアとソフトウェアが必要です...

于 2008-11-19T02:44:12.003 に答える
0

種子の供給源はそれほど重要ではありません。さらに重要なのは、疑似数生成アルゴリズムです。しかし、いくつかの銀行業務のシードを生成することについて、少し前に聞いたことがあります。彼らは多くの要因をまとめました:

  • 時間
  • プロセッサー温度
  • ファン回転速度
  • CPU電圧
  • 私はもっ​​と覚えていません:)

これらのパラメーターの一部が時間内にあまり変化しない場合でも、それらを適切なハッシュ関数に入れることができます。

良い乱数を生成するには?

無限の数の宇宙を考慮に入れることができるでしょうか?これが本当なら、常に新しいパラレル ユニバースが作成されているとすれば、次のようなことができます。

int Random() {
    return Universe.object_id % MAX_INT;
}

常に別のパラレル ユニバースのブランチにいる必要があるため、異なる ID を持つ必要があります。唯一の問題は、ユニバースオブジェクトを取得する方法です:)

于 2009-02-07T15:40:33.983 に答える
0

強制終了される前に一定時間、タイトなループで変数を操作するスレッドをスピンオフするのはどうですか。最終的にどうなるかは、プロセッサの速度、システムの負荷などによって異なります...非常にばかげていますが、srand(time(NULL))よりはましです...

于 2009-12-09T23:35:09.560 に答える
0

乱数ジェネレーターの「良い」シードについて心配する必要はありません。シーケンスの統計的特性は、ジェネレーターのシード方法には依存しません。

John D. Cook のアドバイスには同意しません。1 つを除くすべてのビットをゼロに設定して Mersenne Twister をシードすると、最初はランダムではない数が生成されます。ジェネレーターがこの状態を統計テストに合格するものに変えるには、長い時間がかかります。ジェネレーターの最初の 32 ビットをシードに設定するだけで、同様の効果が得られます。また、状態全体がゼロに設定されている場合、ジェネレーターは無限のゼロを生成します。

適切に記述された RNG コードには、たとえば 64 ビット値を受け入れてジェネレーターにシードする適切に記述されたシード アルゴリズムが含まれているため、可能な入力ごとに適切な乱数が生成されます。したがって、信頼できるライブラリを使用している場合は、任意のシードで十分です。ただし、独自の実装をハックする場合は注意が必要です。

于 2009-02-07T14:59:08.873 に答える