Raspberry Pi のハードウェア乱数生成器を試す
今まで知りませんでしたが,Raspberry Pi にはハードウェア乱数生成器があるようです.
Raspberry Pi にキーボードやマウス等を繋がすに,いわゆるサーバの様にヘッドレス運用をしていると,乱数のエントロピーが不足しがちになりますが, ハードウェア乱数生成器を使うことができれば,改善できるかもしれません.
ハードウェア乱数生成使用前のエントロピー
現在のエントロピー状態は,以下で確認できます.
$ cat /proc/sys/kernel/random/entropy_avail 763
https://archlinuxjp.kusakata.com/wiki/Haveged によると,この数値が1000以下だと暗号処理などで十分なエントロピーが貯まるまで止まるようです.
必要なドライバのロードとソフトのインストール
Raspberry Pi のハードウェア乱数生成ドライバは,bcm2708_rng と言う名前で,これを起動時にロードするように /etc/modules を編集します.
$ cat /etc/modules # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. # Parameters can be specified after the module name. bcm2708_rng
次に,rng-tools をインストールします.私は Raspbian を使っているので,以下の様にコマンドを実行します.
$ sudo apt-get install rng-tools
基本的にこれでOKで,Raspberry Pi を再起動させると,ハードウェア乱数生成ドライバがロードされ,rngd がそれを使うようになります.
動作確認と効果
Raspberry Pi を起動したら,ハードウェア乱数ドライバがロードされているかを確認します.
$ lsmod | grep rng bcm2708_rng 952 0
また,ps コマンドで,rngd が動作しているかを確認します.
/var/log/syslog に,以下の様なログがあることを確認します.
Jun 10 22:52:19 tiamat rngd[2056]: stats: bits received from HRNG source: 60064 Jun 10 22:52:19 tiamat rngd[2056]: stats: bits sent to kernel pool: 4608 Jun 10 22:52:19 tiamat rngd[2056]: stats: entropy added to kernel pool: 4608 Jun 10 22:52:19 tiamat rngd[2056]: stats: FIPS 140-2 successes: 3 Jun 10 22:52:19 tiamat rngd[2056]: stats: FIPS 140-2 failures: 0 Jun 10 22:52:19 tiamat rngd[2056]: stats: FIPS 140-2(2001-10-10) Monobit: 0 Jun 10 22:52:19 tiamat rngd[2056]: stats: FIPS 140-2(2001-10-10) Poker: 0 Jun 10 22:52:19 tiamat rngd[2056]: stats: FIPS 140-2(2001-10-10) Runs: 0 Jun 10 22:52:19 tiamat rngd[2056]: stats: FIPS 140-2(2001-10-10) Long run: 0 Jun 10 22:52:19 tiamat rngd[2056]: stats: FIPS 140-2(2001-10-10) Continuous run: 0 Jun 10 22:52:19 tiamat rngd[2056]: stats: HRNG source speed: (min=654.094; avg=659.847; max=667.233)Kibits/s Jun 10 22:52:19 tiamat rngd[2056]: stats: FIPS tests speed: (min=5.709; avg=6.476; max=7.753)Mibits/s Jun 10 22:52:19 tiamat rngd[2056]: stats: Lowest ready-buffers level: 2 Jun 10 22:52:19 tiamat rngd[2056]: stats: Entropy starvations: 0 Jun 10 22:52:19 tiamat rngd[2056]: stats: Time spent starving for entropy: (min=0; avg=0.000; max=0)us
Jun 10 23:33:12 tiamat rngd[2079]: rngd 2-unofficial-mt.14 starting up... Jun 10 23:33:12 tiamat rngd[2079]: entropy feed to the kernel ready
この状態で,エントロピーの状態を確認します.
$ cat /proc/sys/kernel/random/entropy_avail 2101
使用前は1000未満だったものが2000を超えています.
終わりに
実際の乱数の効果は未確認ですが,ヘッドレス運用で乱数エントロピーが足りず,貯まるまで処理がブロックされる場合に有用と思います.
できればメルセンヌ・ツイスタも試してみたいです. http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/index-jp.html