わかりました。狂ったようにreal times
次のコマンドを実行すると違いがあります。
dd if=/dev/random bs=1k count=1
では起きないでしょうしif=/dev/null
、これからも起きないでしょう。if=/dev/urandom
私はそれを500回実行しました。以下は一般統計(呼出あたり)です。時間は秒単位です。
Minimum Maximum Average Median
00.002 89.999 4.50402 2.275
なぜこれが起こるのかという提案がある人はいますか?
システムはUbuntu 10.04デスクトップ版です。 Bashバージョンは4.1.5(1)
で、同じUbuntuバージョンを実行しているVirtualBox VMでも同様の急激な変動を示しています。
実際のテストコードです
cp /dev/null "$HOME/dd-random.secs"
for ((i=100;i<=500;i++)); do
if ((i<10)) ;then zi="00$i"
elif ((i<100)) ;then zi="0$i"
else zi="$i"
fi
echo -ne "$zi\t" >>"$HOME/dd-random.secs"
exec 3>/dev/null 4>/dev/null
{ time { dd if=/dev/random bs=1k count=1; } 1>&3 2>&4; } 2>&1 |tail -n 3|tr 'm\n' '\t' |sed -re "s/([0-9])s/\1/g" >>"$HOME/dd-random.secs"
exec 3>&- 4>&-
echo >>"$HOME/dd-random.secs"
done
答え1
これがまさに/dev/random
エントロピープールの違いです/dev/urandom
。random
エントロピープールを使用すると、複数のソースからノイズを収集し、現在のプールに「どのくらいの」ノイズがあるかを追跡するため、random
生成できる高品質のランダム性がどれくらいになるかを確認できます。エントロピープールには限られた量のノイズがあるため、random
使用可能なエントロピーが不十分な場合は読み取りをブロックする必要があります。urandom
ブロックされませんが、「ランダムでない」データを取得できます。
random(4)
マニュアルページから:
読み取ると、/ dev / randomデバイスはエントロピープールの予想ノイズビット数内のランダムバイトのみを返します。 /dev/randomは、使い捨てパッドやキー生成など、非常に高品質のランダム性が必要な用途に適している必要があります。エントロピープールが空の場合、追加の周囲ノイズが収集されるまで、/ dev / random読み取りはブロックされます。
/dev/urandomデバイスからの読み込みは、追加のエントロピーを待つことをブロックしません。したがって、エントロピープールに十分なエントロピーがない場合、返された値は理論的にドライバが使用するアルゴリズムによる暗号化攻撃に対して脆弱です。
答え2
~からhttp://en.wikipedia.org/wiki//dev/random#Linux:
「エントロピープールが空の場合、追加の周囲ノイズが収集されるまで、/dev/random読み取りはブロックされます。」
編集:Michaelが私より一歩先を向いているようです!