ハードウェア乱数生成器の検定をする。
せっかく作った 2048bit の秘密鍵も 16bit 相当に縮まってしまうことがある、こんな世の中だから、大事な鍵を生成する時には良質な乱数を使うように心がけたい。 debian の openssl の問題でソースコードを確認してみた所、元々の乱数生成器の実装もどうかと思った。初期化していないメモリの MD5 を反映させているんだけど、初期化してないメモリってかなりの確率で疎なんじゃなかろうか、全部 0 って確率も高いんじゃないかな。
というわけで去年買った eToken Pro にハードウェア乱数生成器がついているので今後大事な鍵はこれを使って作るようにしたい。でもこのハードウェア乱数生成器がその他の疑似乱数生成器と比べて良いという根拠も無いので簡単な検定を行ってみる。
乱数の検定はいろいろ有るみたいだけれど、アメリカ国立標準技術研究所が発行する FIPS 140-2 の中で定義されているものの、何故か打ち消し線で削除されている「monobit test」をやってみる。monobit test とは 20,000 bit の乱数を生成して、1 の数が 9,725 〜 10,275 の間だったら OK、という単純な度数検定。今回は複数の乱数生成器の比較が行いたいのでそれぞれの乱数生成器で生成した乱数からカイ2乗値を求め、比較する。
まずいろいろな乱数生成器で 1M 程度の乱数の生成する。(/dev/random はエントロピーを貯めるのが面倒なのでやめた。)
- /dev/urandom
- openssl rand
- eToken Pro HWRNG
% dd if=/dev/urandom of=data.urandom bs=1M count=1
% openssl rand 1048576 -out data.openssl
% openssl
OpenSSL> engine -t dynamic -pre SO_PATH:/usr/local/openssl/lib/engines/engine_pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/local/opensc/lib/opensc-pkcs11.so
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:/usr/local/openssl/lib/engines/engine_pkcs11.so
[Success]: ID:pkcs11
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:/usr/local/opensc/lib/opensc-pkcs11.so
Loaded: (pkcs11) pkcs11 engine
[ available ]
OpenSSL> rand -engine pkcs11 1048576 -out data.etoken
って生成した乱数のχ2乗値を求めてみたんだけどやっぱりダメだこれ、何回やっても値がバラバラで。サンプル数を増やしても値が収束しない。
一気にやる気が失せてしまったけれど、また今度別の検定方法で挑戦するかもしれない。
Permanent Link: http://www.cuspy.org/blog/archives/609
Trackback URL: http://www.cuspy.org/blog/archives/609/trackback
Robert wrote related post…
Silk posts and stories…
Trackback by Robert wrote related post — 2008/06/19 Thursday @ 19:53:48