Windowsの関数CryptGenRandomがこれに適しているようです。しかし、移植可能な代替品はありますか?
これはどのように表示されるかによって異なります。プラットフォームのRNGの周りを直接ラップできるスタンドアロンのラッパーがあるかどうかはわかりません。しかし、ほとんどの暗号ライブラリには、OS乱数ジェネレータからのシード自体を直接参照するか、より可能性が高いランダムジェネレータがあります。
例えば、AutoSeeded
の暗号化の生成器++ hereについて読んでください。これらのライブラリは、OSによって提供される機能を抽象化して、基盤となるプラットフォームへの呼び出しを最小限に抑える移植性のあるオプションを提供します(つまり、セキュリティーはともにとです)。
対応していない場合、対応するLinuxとMacの機能はありますか?
暗号ランダムを直接使用する場合は、/dev/urandom
を使用してください。一般に、ブロックする可能性のある/dev/random
を使用する理由はありません。私はよく検証されたライブラリを使用することをお勧めします。あなたはそれがOSの乱数発生器が十分にランダムであることを確認するために支払う埋め込みまたは仮想化デバイス& OSを使用している場合は特に
。仮想化されたシステムでは、VM拡張機能がOS用にインストールされていることを確認することをお勧めします。
乱数ジェネレータにも追加のシードが追加される可能性があります。乱数の強度が不明な場合は、シードとして追加することをお勧めします。
インテルRD_RANDなどのRNG拡張機能(OSまたはライブラリで使用される)を持つCPUを持つことはもちろん意味があります。
これは簡単ではないかもしれません。いくつかの発言(imhoを慎重に提示しているビットがあるが)はここにある(http://www.pcg-random.org/posts/simple-portable-cpp-seed-entropy.html)。コアメッセージは、std :: random_deviceにいくつかの欠陥があるかもしれないが、私は決してそれと連絡を取ったことがなく、おそらくそれはあなたを助けるだろうということです。それにもかかわらず、あなたの質問は少し広いです。たぶんあなたのcryptoPRNGの現在の状態をローカルのDBやファイルに保持するほうがずっと簡単です(これは非常に簡単です(1つのinitだけが必要です; collision-probは無視されます)。もちろん、これは正確なユースケースに依存します。 – sascha
@sascha:興味深いリンク、またstd :: random_deviceが役に立つかもしれません。ありがとう、これは役に立ちました! –