Linuxはユーザー空間に利用可能な2つの乱数発生器を持っている、/dev/random
と/dev/urandom
。
/dev/random
「真の」ランダム性のソースです。つまり、擬似乱数ジェネレーターによって生成されません。エントロピーは、関数add_input_randomness
とを介して、入力ドライバーと割り込みハンドラーによってこれに供給されadd_interrupt_randomness
ます。このデバイスを読み取るプロセスは、エントロピーが不足するとブロックされます。
/dev/urandom
疑似乱数ジェネレータです。と同じエントロピープールによって供給されます/dev/random
が、それがなくなると、暗号的に強力なジェネレーターに切り替わります。
ユーザースペースアプリケーションは、に書き込むことでエントロピープールにフィードできます/dev/{,u}random
。
random(4)マニュアルページとdrivers/char/random.c
カーネルソースツリーのファイルを読んでください。それはよくコメントされており、あなたが尋ねることのほとんどはそこで説明されています。
FreeBSDの/dev/random
デフォルトは、Yarrowアルゴリズムを使用した疑似乱数ジェネレータです(ただし、ハードウェアRNGが接続されている場合は、それを指すことができます)。ソフトウェアジェネレーターは、イーサネット接続、シリアル接続、およびハードウェア割り込み(を介して変更可能sysctl kern.random
)からエントロピーを取得します。Yarrowアルゴリズムは、内部状態が不明である限り安全であると考えられているため、/dev/random
ブロックせずに常に高品質のデータを出力する必要があります。random(4)を参照してください。
NetBSDでは、(ディスク、ネットワーク、入力デバイス、テープドライブから収集された、rndctlを使用して調整可能な)エントロピーのみに/dev/random
基づいてランダムデータを提供しますが、Linuxと同様に、エントロピープールが空の場合はPRNGにフォールバックします。random(4)、rndctl(8)、rnd(9)を参照してください。/dev/urandom
OpenBSDには4つのジェネレーター/dev/random
があります。ハードウェアジェネレーターで/dev/srandom
あり、安全なランダムデータジェネレーター(エントロピープールでMD5を使用:「ディスクとネットワークデバイスの割り込みなど」)/dev/urandom
ですが、エントロピープールが空の場合はPRNGにフォールバックします。4番目の/dev/arandom
もPRNGですが、RC4を使用しています。random(4)、arc4random(3)を参照してください。
Mac OS XもにYarrowアルゴリズムを使用しますが/dev/random
、/dev/urandom
互換性のために同様に機能します。「追加のエントロピーは、カーネルのランダムジッター測定からSecurityServerデーモンによって定期的にジェネレーターに供給されます。」random(4)を参照してください。