/dev/random の秘密

たとえば SSH や PGP の鍵対を生成するときには、本当の乱数が必要になる。疑似乱数ではダメだ。Unix 上で乱数を生成してくれるデバイスとしては、/dev/ramdom がある。/dev/ramdom には、真性乱数が蓄えられていて、read システムコールで必要なバイト数だけ読み込むことができる。

/dev/ramdom が真性乱数を生成する方法は、実に単純だ。ハードウェア割り込みの間隔を測るのである。今の間隔が直前の間隔よりも短ければ 1 を、長ければ 0 を真性乱数として蓄える(0 と 1 の割り当ては逆かもしれない)。つまり割り込みが、時刻 t1、t2、t3 に起こったとすると、t2 - t1 と t3 - t2 を比較するということだ。

/dev/ramdom は、ブロックデバイスなので、必要な量の真性乱数がなければ、read システムコールはブロックする。このブロックをできるだけ早く解除するには、ハードウェア割り込みを起こしてやればよい。つまり、キーボードを叩いたり、マウスを動かしたり、ネットワークパケットを送りつければいいのである。

できの悪いソフトウェアだと、read システムコールを使って単にブロックするから、鍵生成が終わるのには長い時間がかかるかもしれない。気の利いたソフトウェアだと、/dev/ramdom をタイマー付きで select して、必要なバイト数があるか検査する。ないと分かれば、ユーザーに「マウスを動かして下さい」などと表示して、ハードウェア割り込みを起こすように促す。

最近、SSH でログインしたサーバー上で、DNSSEC の鍵対を作ろうとして、長い時間待たされている人がいるみたいだけれど、RET キーを押し続けてパケットをたくさんのパケットを送信してあげれば、早く終わるはずだ。