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/秒