Raspberry Pi のハードウェア乱数生成器を利用する

Raspberry Pi にはハードウェア乱数生成器が搭載されており, Raspbian では若干の設定を行うことでこれを簡単に利用することができます.

カーネルモジュール

ハードウェア乱数生成器を利用するためには, カーネルモジュール bcm2708-rng を読み込む必要があります.

カーネルモジュールを一時的に読み込む場合は以下を実行します.

sudo modprobe bcm2708-rng

起動時にカーネルモジュールを自動的に読み込むには, /etc/modules に以下を追記します.

bcm2708-rng

カーネルモジュールが読み込まれているかどうか確認します.

$ lsmod | grep rng
bcm2708_rng             1196  0

乱数の取得

ハードウェア乱数生成器のデータは /dev/hwrng から読み出すことができます. 以下は乱数を 128 バイト取得して, 16進数表示する例です.

$ sudo dd if=/dev/hwrng bs=1 count=128 | od -t x1
0000000 7c 19 bf 0f fe ec 49 85 73 ae 4a dd 39 8c 21 5b
0000020 53 71 56 2e 04 05 12 ff d7 ca a0 e4 66 28 7e 3a
0000040 40 12 a8 d2 02 6b 03 70 53 34 ce 64 7d e6 80 c4
0000060 12 6c 06 06 cf db c5 9c 20 a6 84 c2 d5 fe cf 0d
0000100 a8 24 5f 30 f2 0d 4d e1 53 2b 0b af d8 03 c4 06
0000120 b0 7a 73 80 fb 4c c9 40 d1 18 a4 fe e5 4b 63 c0
0000140 f0 da 19 d1 ea 1e ef cf ff 26 cf d6 ad e1 49 8f
0000160 51 69 e9 cb c8 93 43 ef 8a f7 40 42 5f 44 27 59
128+0 レコード入力
128+0 レコード出力
128 バイト (128 B) コピーされました、 0.0196065 秒、 6.5 kB/秒
0000200

乱数の利用

カーネルモジュールを読み込むだけでは, この乱数はカーネルによって利用されることはありません. /dev/random/dev/urandom でこのデータを用いるには追加の設定が必要です.

以下を実行してパッケージ rng-tools をインストールします.

sudo apt-get install rng-tools 

インストールが完了すると, デーモン rngd が自動的に起動します. 以下のようにして確認できます.

$ ps aux | grep rngd
root       382  0.0  0.2  27528  1300 ?        SLsl 18:21   0:03 /usr/sbin/rngd -r /dev/hwrng
pi        2870  0.0  0.4   5660  1988 pts/0    S+   19:30   0:00 grep rngd

rngd は /dev/hwrng から乱数を得て, カーネルのエントロピープールに乱数を提供します. rngd はあくまでカーネルのエントロピープールに乱数を提供するのみで, ハードウェア乱数生成器のデータを直接 /dev/random 等から出力するのでありません. また rngd は入力されたデータが本当にランダムかどうか, FIPS 140-2 (2002-10-10) テストを行ってくれます.

ハードウェア乱数生成器を利用することで /dev/random からより高速に乱数を生成することができます. ハードウェア乱数生成器を利用しない場合と利用する場合の生成速度の違いは以下のようになります.

# ハードウェア乱数生成器を使わない場合
$ dd if=/dev/random of=/dev/null bs=1 count=128
128+0 レコード入力
128+0 レコード出力
128 バイト (128 B) コピーされました、 188.318 秒、 0.0 kB/秒

# ハードウェア乱数生成器を使う場合
$ dd if=/dev/random of=/dev/null bs=1 count=128
128+0 レコード入力
128+0 レコード出力
128 バイト (128 B) コピーされました、 0.0161016 秒、 7.9 kB/秒