現在、Boostrandom_device
はLinux(多分* nix)システムのクラスのみを実装しています。他のOSの既存の実装を知っている人はいますか?理想的には、これらの実装はオープンソースです。
存在しない場合、Mac OSXだけでなくWindowsにも非決定論的RNGを実装するにはどうすればよいですか?この機能を提供するAPI呼び出しはどちらの環境にも存在しますか?ありがとう(そしてすべての質問に申し訳ありません)!
現在、Boostrandom_device
はLinux(多分* nix)システムのクラスのみを実装しています。他のOSの既存の実装を知っている人はいますか?理想的には、これらの実装はオープンソースです。
存在しない場合、Mac OSXだけでなくWindowsにも非決定論的RNGを実装するにはどうすればよいですか?この機能を提供するAPI呼び出しはどちらの環境にも存在しますか?ありがとう(そしてすべての質問に申し訳ありません)!
MacOSX では、/dev/random を使用できます (*nix であるため)。
Windows では、おそらく CryptGenRandom 関数が必要です。それを使用するboost::random_deviceの実装があるかどうかはわかりません。
RNG を何に使用するかによって異なります。
大まかに言えば、シード データをバッファにフィードし、バッファのハッシュ値を生成し、結果にカウンターを混ぜて、さらにハッシュします。ハッシュ関数を使用する理由は、優れたハッシュは、より構造化された入力データからランダムに見える結果を生成するように設計されているためです。
暗号化に使用したい場合、事態はさらに複雑になります。RNG が合理的に安全な制限内でパターンを繰り返し続けるようにするには、さらに多くのフープをジャンプする必要があります。Bruce Schneier の「Practical Cryptography」をお勧めします (RNG の紹介とサンプル実装について)。彼はまた、彼のヤロウRNG についていくつかの RNG 関連のものを用意しています。
ブーストが /dev/random に依存している場合、MacOS でも機能する可能性があります (それがあるため)。
Windows では、OS の一部として CryptoAPI があり、暗号品質の RNG を提供します。
また、最新の Intel CPU にはチップ上にハードウェア RNG があると思いますが、各 OS でそれを取得する方法を理解する必要があります。より高いレベルの API を使用することは、おそらくより良い方法です。
編集: Intel 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