乱数について

暗号に関する研究の進展とともに,セキュリティシステムの実現に強力な暗号アルゴリズムが使われるようになってきている.しかし,このようなセキュリティシステムの多くはパスワードや暗号鍵のような秘密の情報を生成することに依存している.この秘密の情報が盗まれたり,推測されることはセキュリティシステムが破られるのと等価である.

RFC1750 ("Randomness Recommendations for Security")に,パスワードや暗号鍵のような予測の困難な乱数性を持ったデータを生成するための技術や推奨項目が記述されている(2005年6月に RFC4086 へ更新).

ここでは,RFC1750 の記述を中心に乱数の重要性と乱数の生成方法について解説する.

乱数の利用 ハードウェアによる乱数生成 ソフトウェアによる乱数生成
乱数性の評価

乱数の利用

ハードウェアによる乱数生成

熱雑音や放射線の崩壊を生み出す源,高速な自走式の発信器などは,直接的な乱数源になる.これらは,僅かなハードウェア量であリ,計算機システムの標準部品として容易に組み込めるものである.さらに,回転ディスクあるいはそれに類似した機構を持つ任意のシステムは,十分な乱数源を持つと言える.このような僅かな付加的なハードウェアとそれにアクセスするソフトウェアが必要であり,有効であるという計算機ベンダの共通認識が重要と思われる.

攪拌のための最良の入力源は,空気の乱れによるディスクドライブのタイミングや熱雑音をもった音声入力のようなハードウェアのランダム性を持ったものである. しかし,それが実現できない場合他の可能性がある.これには,システムクロック,システムまたは入出力バッファ,user/system/hardware/network のシリアル番号,アドレス,タイミングおよびユーザ入力などが含まれる.これらのどれも,限られたあるいはある環境化では予測可能な値である.

上記の乱数源の幾つかはマルチユーザシステムでは強力なものになる.システムの各ユーザ自体がランダム性の源になるからである.しかしながら,パーソナルコンピュータのような小規模な単一ユーザシステムでは,攻撃者が同様な環境を構築することが可能である.これは,攻撃者が元々用いられたものと十分に相関の高い攪拌プロセスを用いて入力を生成でき,探索に利用できることを示している.

強力な攪拌関数を用い複数の乱数源を使うことが推奨される.これにより,特定の入力の弱点を克服することができる.例えば,ランダムなユーザのキー入力のタイミングと内容は数百ビットの乱数ビットを生成する.しかし,安全側の仮定がなされなければならない.例えば,キー入力の間隔については,ほんの数ビットの乱数性のみを仮定するなどである.

入力された文字やそのタイミングを攪拌した結果は,さらにクロック値やその他の入力と結合することができる.この戦略は,対象システムにおける入力の幾つかが非常に弱いものであったとしてもセキュリティに対する良い乱数性を生成する実用的で移植性の高いコードを生成する.しかし,それでも小規模な単一ユーザシステムにおける高度な攻撃には対抗できない.特に,攻撃者が過去における生成プロセスを観測できたならば.したがって,ハードウェアによる乱数生成が望ましいと言える.

将来的には,強力でポータブルな物理的予測不可能な乱数源を持つ乱数ジェネレータが現われると予想される.
現在利用されているランダム要素には,次のようなものがある.

ソフトウェアによる乱数生成

信頼すべき乱数発生用のハードウェアがない場合,乱数データを取得する最善の方法は,大容量の相関の無いデータ源からランダムに入力を得て,強力な攪拌関数でデータを結合,攪拌することである.このような攪拌関数は,結合されるデータの一部が固定的あるいは予測され易いものであったとしても,データ源の乱数性を保存する.

乱数の一様性の向上方法には,次のような方法がある.

ソフトウェアによる擬似乱数(算術乱数)の生成方法には,次のようなものがある.

乱数性の評価

FIPS PUB 140-2 に乱数列に対する評価基準が示されている.

20,000ビットの乱数に対して,以下を満足することを要求している.

inserted by FC2 system