質問

現在、BoostはLinux(多分* nix)システム用の random_device クラスのみを実装しています。誰か他のOSの既存の実装を知っていますか?理想的には、これらの実装はオープンソースになります。

存在しない場合、WindowsおよびMac OS Xに非決定的RNGを実装するにはどうすればよいですか?この機能を提供するAPI呼び出しはどちらの環境にも存在しますか?ありがとう(そしてすべての質問に申し訳ありません)!

役に立ちましたか?

解決

MacOSXでは、/ dev / randomを使用できます(* nixであるため)。

Windowsでは、おそらくCryptGenRandom関数が必要です。 boost :: random_deviceを使用する実装があるかどうかはわかりません。

他のヒント

RNGの使用目的によって異なります。

一般的には、シードデータをバッファにフィードし、バッファのハッシュ値を生成し、結果にカウンタを混ぜて、さらにハッシュします。ハッシュ関数を使用する理由は、適切なハッシュが、より構造化された入力データからランダムに見える結果を生成するように設計されているためです。

暗号化に使用したい場合は、状況はかなり複雑になります。 RNGが合理的に安全な範囲内でパターンを繰り返し続けるようにするには、さらに多くのフープをジャンプする必要があります。 Bruce Schneierの「Practical Cryptography」をお勧めします。 (RNGの概要、およびサンプル実装用)。また、彼は yarrow RNGについてRNG関連の情報もいくつか持っています。

boostが/ dev / randomに依存している場合、MacOSでも動作する可能性があります(それがあります)。

Windowsでは、OSの一部としてCryptoAPIがあり、暗号品質のRNGを提供します。

また、最新のIntel CPUのハードウェアRNGはチップ上にあると思いますが、各OSでそれを実現する方法を理解する必要があります。おそらく、より高いレベルのAPIを使用するほうがよいでしょう。

編集:インテルRNGの仕組みへのリンク

OpenSSLには適切なものがあります。

#include <openssl/rand.h>
...
time_t now = time(NULL);
RAND_seed(&now, sizeof(now)); // before first number you need

int success = RAND_bytes(...);
if (!success) die_loudly();

RAND_cleanup(); // after you don't need any more numbers

Microsoft CryptoAPIにはWin32に1つあります。さらにいくつかの関数呼び出しが必要です。これらの各呼び出しには2〜5個の引数があるため、ここには詳細を含めません。 CryptoAPIでは、ユーザーに乱数を与える前に、完全なローカルプロファイル(C:\ Documents and Settings \ user \ Local Settings)を正しく設定する必要があるように思われます。

CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top