/dev/random
カーネル割り込みのタイミングを使用して、エントロピープールに追加します。プール内のエントロピーの量は、という名前の変数で追跡されますentropy_count
。
関連するコードの抜粋を次に示しますrandom.c
。これは、変数の最後の2つのinteruptsとdelta delta
の差との間の時間(私が思うにわずか)を表しますdelta2
。
delta = time - state->last_time;
state->last_time = time;
delta2 = delta - state->last_delta;
state->last_delta = delta;
if (delta < 0) delta = -delta;
if (delta2 < 0) delta2 = -delta2;
delta = MIN(delta, delta2) >> 1;
for (nbits = 0; delta; nbits++)
delta >>= 1;
r->entropy_count += nbits;
/* Prevent overflow */
if (r->entropy_count > POOLBITS)
r->entropy_count = POOLBITS;
追加されたエントロピーの推定値は、基本的にデルタの2を底とする対数の下限(ループ前の初期ビットシフトのために上限ではないようです)。これはいくつかの直感的な理にかなっていますが、これを正式に正しくするためにどのような仮定が必要かはわかりません。
したがって、私の最初の質問は「この推定の背後にある理由は何ですか?」です。
2番目の質問はについてdelta = MIN(delta, delta2) ...
です。これは何をしますか?なぜこのデルタと最後のデルタの最小値を取るのですか?私はこれが何を達成するのかわからない-おそらくそれは見積もりを改善し、おそらくもっと保守的になります。
編集:私は推定値を指定する論文を見つけましたが、それについて実際には理由のある議論を与えていません(推定者が満たすべきいくつかの非公式の条件を概説しています)。
コメントに記載されている他のリソース:
- 上のウィキペディア
/dev/random
と/dev/urandom
- それを説明しようとする論文(私はそれについて懐疑的です、コメントを見てください)
/dev/random
上記のコードを書いた人からのコメント付きのブログ投稿。/dev/random
エントロピープールに関するsecutity.SEの回答。
/dev/random
不安定な基盤にあることに注意してください。/dev/randomエントロピープールのフィードを参照してください。。トーマスがあなたの質問に答えてくれることを願ってトーマスにpingを送りました。