通常、/dev/random
から読み取ると、100〜500バイトとブロックが生成され、エントロピーが収集されるのを待ちます。
他のプロセスによって/dev/random
に情報を書き込まないのはなぜですか?必要なエントロピーを提供すべきではありませんか?
再起動してすべてを再入力せずにgpg
または同様のソフトウェアのブロックを解除したり、非スーパートップシークレットキーを生成したりする場合などに役立ちます。
_/dev/random
_に書き込むことができます。これは、_/dev/random
_に追加のランダムバイトを提供する方法の一部ですが、それだけでは十分ではなく、ioctl()
呼び出し。
スマートカードセットアッププログラム をテストするために同じ機能が必要でした。マウス/キーボードが、それぞれに対して行われたgpg
への複数の呼び出しに対して十分な数を生成するのを待ちたくなかったためです。テスト走行。私がしたことは、テストと並行してPythonプログラムを実行することです。もちろん、しないでください実際のgpg
鍵の生成にまったく使用されます。ランダムな文字列はまったくランダムではありません(システムで生成されたランダムな情報はインターリーブされます)。random
の場合、エントロピーを高くできるはずです。エントロピーは次のようにして確認できます。
_cat /proc/sys/kernel/random/entropy_avail
_
プログラム:
_#!/usr/bin/env python
# For testing purposes only
# DO NOT USE THIS, THIS DOES NOT PROVIDE ENTROPY TO /dev/random, JUST BYTES
import fcntl
import time
import struct
RNDADDENTROPY=0x40085203
while True:
random = "3420348024823049823-984230942049832423l4j2l42j"
t = struct.pack("ii32s", 8, 32, random)
with open("/dev/random", mode='wb') as fp:
# as fp has a method fileno(), you can pass it to ioctl
res = fcntl.ioctl(fp, RNDADDENTROPY, t)
time.sleep(0.001)
_
(終了したら、プログラムを強制終了することを忘れないでください。)
通常、これはカーネル開発者によって設計され、man 4 random
:
Writing to /dev/random or /dev/urandom will update the entropy pool
with the data written, but this will not result in a higher entropy
count. This means that it will impact the contents read from both
files, but it will not make reads from /dev/random faster.
Anthonyはすでに/dev/random
への書き込みはエントロピー数を増加させないことを説明し、RNDADDENTROPY ioctl( random(4) を参照)を使用してエントロピーをクレジットする方法を示しました。それは明らかに本当に安全ではないので、ハードウェアの乱数ジェネレータが利用可能な場合の代替案を以下に示します。
次の実装は、/dev/hwrng
から512バイト(4096ビット)のランダム性を取り、それをエントロピープールに転送します(1バイトあたり4ビットのエントロピーをクレジットします。これは私からの任意の選択です)。その後、エントロピープールがいっぱいになると select(2) syscallを呼び出してブロックします( random(4) のマンページに記載されています)。
A Pythonバージョン:
import fcntl, select, struct
with open('/dev/hwrng', 'rb') as hw, open('/dev/random') as rnd:
while True:
d = hw.read(512)
fcntl.ioctl(rnd, 0x40085203, struct.pack('ii', 4 * len(d), len(d)) + d)
select.select([], [rnd], [])
Arch Linux isoにはPythonがインストールされていないため、Perlバージョンもここにあります:
open my $hw, "</dev/hwrng" and open my $rnd, "</dev/random" or die;
for (;;) {
my $l = read $hw, my $d, 512;
ioctl $rnd, 0x40085203, pack("ii", 4 * $l, $l) . $d or die;
vec(my $w, fileno $rnd, 1) = 1;
select undef, $w, undef, undef
}
これはおそらく、すでに一般的に利用可能なツール(PythonまたはPerl)を使用していることを除いて、rngdプログラム( rng-tools )の一部(検証されていない)です。