私はCで非常に大きなランダム整数の生成に取り組んでいます。/dev/randomが優れたソースであることがわかりましたが、エントロピープールが使い果たされるとブロックされます。/ dev / urandomは次のgotoのように見えましたが、ランダム性の品質は比較するとそれほど良くありません。/ dev / randomからの整数を使用してPRNGをシードし、/ dev / randomから読み取りを続ける必要がないようにする方法はありますか?長期的ではありませんが、暗号的に安全なPRNGを探しています。
4 に答える
からの整数を使用し/dev/random
てPRNGをシードするのは、まさにそのため/dev/urandom
です。urandomに特定の弱点があるという証拠がない限り、車輪の再発明を行っています。
urandomがより弱いのは事実ですが/dev/random
、提案されたスキームはまったく同じように弱いので、urandomを使用するよりも利点はありません。urandomには、基盤となるハードウェアから新しいエントロピーが利用可能になると、生成された数値に新しいエントロピーを継続的に混合できるという追加の利点があります。たとえば、FreeBSDにはurandomスタイルのデバイスしかありません。
最後に、urandomは何年も前から存在しており、そのソースはセキュリティの専門家によってレビューされていますが、自分でロールできる代替品の場合はそうではありません。
プラットフォームに依存する可能性があります。すでに/dev/randomに暗号化された安全なPRNGを使用しているものもあります。例:FreeBSD、OpenBSD、OSX。Yarrow、Fortuna、ISAAC(RC4に基づく)も見ることができます。これは、さらに調査したい場合に開始するのに適した場所です:http: //csrc.nist.gov/groups/ST/toolkit/index.html
エントロピーの大きなプールが必要な場合は、ノイズの多いデータストリーム(たとえば、ビジー環境のビデオやオーディオ)からデータブロックのSHA1を取得するなど、基本的なことを行うことができます。
問題は、どのくらいのエントロピーが必要で、どれだけ速くなるかということです。「大きな数値」とは、プロジェクトのランダムビットのギガバイトから「このサービスには100k/秒の一定のエントロピーストリームが必要」までのすべてを意味する可能性があるためです。
あなたがそれをするためのハードウェアを持っているならば、それはさらに良いでしょう。暗号化乱数生成をサポートしている場合は、CPUまたはその他のモジュールを確認してください。/ dev/randomと/dev/ urandomはどちらも、暗号化の観点から安全ではありません。それらをアプリケーションのソースとして使用しないでください。