2012-03-03 5 views
12

ソフトウェアエンジンを使用している場合、標準の私の読書より、random_device::entropy()は0.0を返します。しかし、VS2010では32.0を返します。私の理解では、非決定論的乱数を生成するためにはハードウェアが必要です。VS2010でのrandom_deviceの実装ですか?

どのようにVS2010のrandom_deviceは数列を生成するのでしょうか?

+5

まあ、それはちょっと変です。しかし、advapi.dllのSystemFunction036()を使用して、暗号的に安全な乱数を生成します。 –

+0

@ HansPassant:暗号で安全なことがまだ非決定的な意味ではないのですか? –

+0

@HansPassantは定義上HWが生成する暗号的に安全な乱数ではありませんか? (たとえそれが瞬間的なシステムパラメータの組み合わせであっても) – rubenvb

答えて

19

この質問に残っているHans Passantのコメントによると、random_deviceadvapi32:SystemFunction036を使用しています。これはMSDNによると、RtlGenRandomの別名です。これは、VC++ 2010で提供ランタイムライブラリのソースによって検証されています<random>

random_device::operator()()は、関数の以下のチェーンを呼び出す:

_Random_device() // in xrngdev.cpp 
    rand_s()  // in rand_s.c 
     RtlGenRandom()/SystemFunction036() // in advapi32.dll 

彼のブログ記事の1にマイケル・ハワードが残したコメントによると、"Cryptographically Secure Random number on Windows without using CryptoAPI"RtlGenRandomは以下を使用:

G関数としてSHA-1 とFIPS 186-2付録3.1で指定されるようにRNGが生成します。エントロピー付き:

  • 現在のプロセスID(GetCurrentProcessID)。

  • 現在のスレッドID(GetCurrentThreadID)。

  • ブート以降のティック(GetTickCount)。

  • 現在の時刻(GetLocalTime)。

  • 様々な高精度のパフォーマンスカウンタ(QueryPerformanceCounterの)。

  • ユーザの環境ブロックのMD4ハッシュで、ユーザ名、コンピュータ名、および検索パスが含まれます。 MD4は、128ビットのメッセージデータ 整合性を検証するために、入力データからダイジェストを作成し、そのハッシュアルゴリズム あります。アイドルプロセス時間、イオ読む転送回数、I/O書き込み転送回数、I/Oその他:このようRDTSC、RDMSR、RDPMC

  • 低レベルのシステム情報として

  • 高精度内部CPUカウンター、転送カウント、I/O読み出し 動作カウント、I/O書き込み動作回数、I/Oその他の動作回数、 使用可能なページ、コミット済みページ、コミットリミット、ピークコミットメント、ページ フォルトカウント、コピーオンライトカウント、 、キャッシュトランジション Countは、ゼロカウント、ページリード回数、ページリードI/Oカウント、キャッシュ 読むカウント需要、キャッシュI/Oカウント、ダーティページは、ダーティ書き込みカウントI/O書きますページプール、非ページングプールページ、ページングプール割り当て済みスペース、ページングプール 空き領域、非ページングプール割り当て済み領域、非ページングプール空き領域、 空き領域、非ページングプール空き領域、非ページングプール空き領域 システムページテーブルエントリ、常駐システムコードページ、トータルシステム ドライバページ、トータルシステムコードページ、ノンページプールルックアサイドヒット、 ページプールルックアサイドヒット、使用可能ページプールページ、常駐システム キャッシュページ、常駐ページプールページ、常駐システム・ドライバー・ページ キャッシュ・マネージャーファスト・リード待機なし、キャッシュ・マネージャー で高速読み取り待ちキャッシュ・マネージャーファスト・リード・リソースが見つかりませんでした。キャッシュ・マネージャーファスト・リード 不可キャッシュ・マネージャー高速メモリー記述子リストwiキャッシュ・マネージャ 待機中、キャッシュ・マネージャのファスト・メモリ・ディスクリプタ・リストの読み込み ファスト・メモリ・ディスクリプタ・リスト読取りリソースの欠落読取りリソース ファスト・メモリ・ディスクリプタ・リスト読取り不可、キャッシュ・マネージャ 待機中のキャッシュ・マップ・データ、キャッシュ・マネージャ・マップ・データキャッシュ・マネージャー マネージャー・データ待ちなし、キャッシュ・マネージャー・マップ・データ待ちキャッシュ・アロイ マネージャーピンマップ・データ・カウント、キャッシュ・マネージャーピン・リード無し、 キャッシュ・マネージャーピン読み取り待機、待機なしで読込み キャッシュマネージャーピン - 読み取り待機中ミス、キャッシュマネージャー を使用したコピー・リード待機なし、キャッシュ・マネージャー待機中のコピー読み取り、キャッシュ・マネージャ 待機なしミス、キャッシュ・マネージャーコピー・リード付きミスを待つ、キャッシュ マネージャメモリ記述子リスト読み取り 待ちミスでノーウェイトミス、キャッシュマネージャのメモリ記述子リストを読んで読む待ちで読むノーウェイト、キャッシュマネージャのメモリー 記述子リスト、キャッシュマネージャのメモリ記述子リスト で、キャッシュマネージャ先読みOを読みます、 キャッシュマネージャ遅延書き込みページ、キャッシュマネージャデータフラッシュ、キャッシュ マネージャデータページ、コンテキストスイッチ、第1レベル変換バッファ フィル、第2レベル変換バッファフィル、システムコール。

  • アライメント修正アップカウント、例外ディスパッチカウント、フローティングエミュレーションカウント、およびバイトワード エミュレーションカウントで構成されるシステム例外情報。

  • システムのルックアサイド情報は、現在の深さ、最大深度、合計割り当て、割り当てミス、合計フリーズ、フリーミス、 タイプ、タグ、およびサイズから構成されます。

  • システムは、コンテキストスイッチ、遅延プロシージャコール数、遅延プロシージャコールレート、時間 増加、遅延プロシージャコールバイパスカウント、および非同期 プロシージャコールバイパスカウントからなる情報を中断する。

  • 次のエントリからなる
  • システムプロセス情報はオフセット、スレッド数、作成時間、ユーザ時間、カーネル時間、イメージ名、固有のプロセスIDから継承ベース 優先順位、固有のプロセスIDは、 カウント、セッションIDをハンドルページディレクトリベース、ピーク仮想サイズ、仮想 サイズ、ページフォールトカウント、ピークワーキングセットサイズ、ワーキングセットサイズ、クォータ ピークページプール使用量、クォータページプール使用量、クォータピーク非ページング プール使用量、クォータ非ページングプール使用法、ページファイルの使用法、ピークページ カウント、その他の操作回数、転送回数、書き込み転送の転送ファイルの使用方法、プライベートページカウント、読み取り操作の回数、書き込み操作 カウント、およびその他の転送回数。

安全なコード、第2版を書くの第8章の(図を含む)完全な説明があります。

1

多分バグかもしれませんが、おそらくそうではありません。しかし、それは確かに慎重に見える。 Microsoftのown documentationから:

クラスは、好ましくは 非決定論的、外部機器から、乱数のソースを記述します。 この実装では、デフォルトで生成される値 は非決定的ではありません。これらは均一に であり、閉じた範囲[0、65535]に分布しています。

およびC++ 11標準、random_deviceのセクション26.5.6.6から:

result_type operator()();

戻り値:非決定論的ランダム値、 は均一(分間に分布)とmax()を含みます。これらの値の生成方法は、 で定義されています。

標準を厳密に読んで、entropy()から0以外を返すべきではありません。おそらく、彼らはいつか実装を改善する予定で、今はそれをSomething Reasonableにしようとしました。彼らはcryptographically secure random numbersを生成するためのAPI呼び出しを持っていますが、まだこれを使用していないようです。

+0

つまり、彼らはすでに嘘をついています。最初に 'random_device :: entropy()'を嫌う。嫌い。 –

+0

つまり、それは深刻な問題ではありますが、意図的なものではありますが(悪化させる) –

+4

MSを嫌うのは簡単ですが、意図的ではない間違いかもしれません。しかも、C++コンパイラの方がはるかに優れています。標準化が完了する前に、C++ 0xをサポートし始めました。 'random_device'がどのようにシーケンスを生成するのか、その範囲はなぜ小さいのでしょうか? –

関連する問題