質問
でも大丈夫ないといけないと思い、これは完全に主観的およびwhatnotが、私はを考えるエントロピー源の乱数生成器.れる発電機の播種は、現在の時間ですよね?でもそこからどのようなその他のソースを利用して完全に有効で、ランダムにゆったり定義します。
うに複数のこのような時間+現在のHDDを求める【いれる幻想的なこちら])を作る"よりランダム"数値"は単一ソース?その論理的な限ください。どのくらいで十分か?が、時間指定は指定シールを貼なので便利です?
しばらく歩いたところでこのようなことが許可されないが、私としては、その背景理論の源です。
解決
ハードウェア乱数ジェネレーターのウィキペディアの記事では、乱数を使用する興味深いソースがいくつかリストされています。物理的特性。
お気に入り:
- PCに取り付けられたガイガーカウンターによって検出された核崩壊放射線源。
- 半透明の鏡を通過する光子。相互に排他的なイベント(リフレクション-送信)が検出され、「0」に関連付けられます。または" 1"それぞれビット値。
- 抵抗からの熱ノイズ、増幅してランダムな電圧源を提供します。
- アバランシェダイオードから発生するアバランシェノイズ。(それはどれくらいクールですか?)
- PCに接続されたラジオ受信機によって検出された大気ノイズ
ウィキペディアの記事の問題セクションでは、これらの多くの脆弱性についても説明しています。ソース/センサー。センサーは、ほとんどの場合、老化/劣化するにつれて減少する乱数を生成します。これらの物理的ソースは、生成されたデータを分析できる統計テストによって絶えずチェックされる必要があり、機器が静かに壊れていないことを確認します。
他のヒント
SGIはかつて、さまざまな「グロブフェーズ」で溶岩ランプの写真を使用していました。エントロピーのソースとして、最終的に LavaRnd というオープンソースの乱数ジェネレーターに進化しました。
Random.ORG を使用し、大気ノイズからのランダムデータを無料で提供します。 Mersene-Twister RNGを定期的に再シードします。ハードウェアに依存せずに取得できるほどランダムです。
「良い」ことを心配しないでください。乱数ジェネレーターのシード。シーケンスの統計特性は、ジェネレーターのシード方法に依存しません。ただし、他にもあります。心配する。 乱数生成の落とし穴を参照してください。
ハードウェア乱数ジェネレーターに関しては、これらの物理的ソースを測定する必要があり、測定プロセスには系統的な誤差があります。 「擬似」が見つかるかもしれません。 「本物」よりも品質が高い乱数乱数。
Linuxカーネルは、デバイスの割り込みタイミング(マウス、キーボード、ハードドライブ)を使用してエントロピーを生成します。エントロピーに関するウィキペディアには、素敵な記事があります。
最近のRNGは、近くのシードの相関に対してチェックされ、シード後数百回の反復を実行します。したがって、残念ながら退屈ですが、本当の答えは、それは本当にそれほど重要ではないということです。
一般的に、ランダムな物理プロセスを使用する場合は、それらが均一な分布に適合し、そうでない場合はトレンド除去されることを確認する必要があります。
ユーザーのマウスの動きを使用して乱数を生成する暗号化プログラムを使用しました。唯一の問題は、プログラムが一時停止し、ユーザーが数秒間ランダムにマウスを動かして正しく動作するように求めなければならないことでした。これは常に実用的ではない場合があります。
数年前に HotBits を見つけました-数値は放射性崩壊から生成され、本当に乱数。
1日にダウンロードできる数字の数には制限がありますが、これらをRNGの本当にランダムなシードとして使用するのはいつも面白かったです。
一部のTPM)"チップ"のハードウェアRNG.残念ながら、(Broadcom)TPMマデルノートがこの機能は、多くのコンピュータの販売は今日、ハードウェアRNGを使用する真の予測量子力学的プロセス。インテルには、熱雑音ます。
また、使われない現在の時刻のみの種、RNGのための暗号化の目的、又はその他の応用が先行き不透明なが重要になります。数低下位ビットからの時間と複数のその他の資料も大丈夫です。
A 類似の問題 が果たしている役割は重要です。
申し訳ありませんが、私はこの議論に遅れています(今は3年半経っていますか?)が、PRN生成とエントロピーの代替ソースに再び興味を持っています。 Linuxカーネル開発者のRusty Russellは最近、エントロピーの別のソース(他のソース / dev / urandom
)より。)
しかし、私は彼の選択にそれほど感心していません。 NICのMACアドレスは変更されません(他のすべてのものとは異なります)。PIDはサンプルサイズが小さすぎるようです。
Mersenne Twister (Linuxボックス上)に手を加えました。次のアルゴリズム。誰かが喜んで興味を持っている場合は、コメント/フィードバックをお願いしています:
- 64ビット+ 256ビット*以下の
/ proc
ファイルの数の配列バッファーを作成します。 - タイムスタンプカウンター(TSC)値をこのバッファーの最初の64ビットに配置します。
-
次の各
/ proc
ファイルについて、SHA256の合計を計算します。-
/ proc / meminfo
-
/ proc / self / maps
-
/ proc / self / smaps
-
/ proc / interrupts
-
/ proc / diskstats
-
/ proc / self / stat
各256ビットのハッシュ値を、(1)で作成した配列の独自の領域に配置します。
-
- このバッファ全体のSHA256ハッシュを作成します。 注: SHA関数とは完全に独立した別のハッシュ関数を使用できます(おそらくそうすべきです)-この手法は、「セーフガード」として提案されています。弱いハッシュ関数に対して。
現在、256ビットの HOPEFULLY ランダム(十分な)エントロピーデータを使用して、Mersenne Twisterをシードしています。上記を使用して、MT配列の先頭(624個の32ビット整数)を設定し、MT作成者のコードでその配列の残りを初期化します。また、別のハッシュ関数(SHA384、SHA512など)を使用することもできますが(明らかに)、別のサイズの配列バッファーが必要になります(明らかに)。
元のMersenne Twisterコードは1つの32ビットシードを必要としましたが、それは恐ろしく不十分だと感じています。 「単に」実行する暗号を破ることを求めて2 ^ 32-1の異なるMTは、今日の時代における実際的な可能性の領域を超えていません。
これに関する誰のフィードバックも読んでみたい。批判は大歓迎です。上記のように / proc
ファイルの使用を防御します。これらは常に変更されているためです(特に / proc / self / *
ファイル、およびTSCは常に異なる値(ナノ秒(またはそれ以上)の解像度、IIRC)。これに対して Diehardテストを実行しました(数百 billion ビットの調子)、そしてそれは飛ぶ色で渡っているように見えます。それ。
もちろん、これらは誰かがハッキングすることを完全に不浸透性ではありませんが、これらのすべて(およびSHA *)がハッキングされて 壊れているのは見ていません私の生涯で。
キーボード入力(キーストローク間のタイムアウト)を使用する人もいますが、小説では無線の静的受信を使用できると思いますが、もちろん他のハードウェアとソフトウェアが必要です...
Cosmic Microwave Backgroundスペクトルのノイズ。もちろん、最初にいくつかの異方性、前景オブジェクト、相関検出器ノイズ、銀河とローカルグループ速度、偏光などを削除する必要があります。多くの落とし穴が残る。
シードのソースはそれほど重要ではありません。より重要なのは、疑似番号ジェネレーターアルゴリズムです。しかし、私はしばらく前に、いくつかの銀行業務のシードを生成することについて聞いたことがあります。彼らは多くの要因を一緒に取りました:
- 時間
- プロセッサー温度
- ファン速度
- CPU電圧
- これ以上覚えていない:)
これらのパラメーターの一部が時間的にあまり変化しない場合でも、それらを適切なハッシュ関数に入れることができます。
適切な乱数を生成する方法
無数の宇宙を考慮に入れることができますか?これが当てはまる場合、常に新しいパラレルユニバースが作成されているので、次のようなことができます。
int Random() {
return Universe.object_id % MAX_INT;
}
すべての瞬間に、パラレルユニバースの別のブランチにいる必要があるため、異なるIDを持つ必要があります。唯一の問題は、ユニバースオブジェクトを取得する方法です:)
キルされる前に一定の時間、タイトループ内の変数を操作するスレッドをスピンオフする方法はどうですか。プロセッサ速度、システム負荷などに依存します。非常に粗末ですが、srand(time(NULL))よりも優れています...
「良い」ことを心配しないでください。乱数ジェネレーターのシード。シーケンスの統計特性は、ジェネレーターのシード方法に依存しません。
ジョンD.クックのアドバイスに同意しません。 1以外のすべてのビットがゼロに設定されたメルセンヌツイスターをシードすると、ランダムではない数値が最初に生成されます。ジェネレーターがこの状態を統計的テストに合格するものに変えるには長い時間がかかります。ジェネレータの最初の32ビットをシードに設定するだけで、同様の効果が得られます。また、状態全体がゼロに設定されている場合、ジェネレーターは無限のゼロを生成します。
適切に記述されたRNGコードには、64ビット値を受け入れてジェネレーターをシードするシードアルゴリズムが適切に記述されているため、可能な入力ごとに適切な乱数が生成されます。したがって、信頼性の高いライブラリを使用している場合、任意のシードが実行されます。ただし、独自の実装をハッキングする場合は注意が必要です。