Linuxでは、/ dev / randomは高品質の擬似乱数を提供する特別なファイルです。
この実装は、キーボード、マウス、ディスク、およびシステムの割り込みから発生するイベントからエントロピーを収集します。(これを参照ドキュメントを)そのようなイベントがない場合、エントロピープールは空で、追加の環境ノイズが収集されるまで/ dev / randomからの読み取りはブロックされます。これはあなたの問題を説明しています。エントロピープールを満たすには、キーボードのキーを押します。
一方、真の乱数ジェネレーターは、物理プロセスから乱数を生成するハードウェア乱数ジェネレーターを使用します。これらのプロセスには、熱ノイズや光電効果などの低レベルの統計的にランダムな「ノイズ」信号を生成する微視的現象が含まれます。その他の物理現象。これらのプロセスは、理論的には完全に予測不可能であり、予測不可能性の理論の主張は実験的テストの対象となります。
ハードウェア乱数ジェネレーターは、通常、物理現象の一部を電気信号に変換するトランスデューサー、増幅器およびその他の電子回路で構成され、ランダムな変動の振幅を巨視的なレベルまで増加させます。出力をデジタル数(通常は単純な2進数0または1)に変換します。ランダムに変化する信号を繰り返しサンプリングすることにより、一連の乱数が取得されます。
ハードウェア乱数ジェネレーターは、デバイスドライバーやその他のソースからの環境ノイズをエントロピープールに収集します。このエントロピープールから乱数が作成されます。読み取られると、/ dev / randomデバイスは、エントロピープール内のノイズの推定ビット数内のランダムバイトのみを返します。これはあなたの問題を説明しています。
ハードウェアRNGのいくつかの実装については、カーネルのドキュメントとデバイスの情報で説明されています。
/ dev / randomに対応するのは/ dev / urandom(「ロック解除」/非ブロッキングランダムソース)で、内部プールを再利用してより多くの擬似ランダムビットを生成します。これは、呼び出しがブロックされないことを意味しますが、出力には、/ dev / randomからの対応する読み取りよりも少ないエントロピーが含まれる場合があります。
したがって、目的がCSPRNG(暗号学的に安全な疑似乱数ジェネレーター)を生成しない場合は、/ dev / urandomを使用する必要があります。