Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > opensslライブラリ > OpenSSL::Randomモジュール

module OpenSSL::Random

クラスの継承リスト: OpenSSL::Random

要約

OpenSSL が利用する疑似乱数生成器関連のモジュールです。

* [RFC4086]

暗号と乱数

OpenSSL では、鍵を生成するためなどに乱数を用いています。例えば RSA では 巨大(512bitや1024bitなど)な素数の組を乱数で生成し、そこから公開鍵、秘密鍵の ペアを計算します。鍵は他人に知られてはならないため、 その乱数は外部からの推論が不可能な良い性質を持っている必要があります。 このようなメソッドには以下のものがあります。

そのような乱数は適切な実装を持つ疑似乱数生成器に適切なシードを渡す ことによって実現できます。

OpenSSL にはそのような疑似乱数生成器が実装されています。 そして、この疑似乱数生成器は OpenSSL の様々なモジュールから利用されています。 上に挙げた鍵生成メソッドの他に、

などでも利用されます。

疑似乱数生成器は適切なシードを与えられなければ正しく動作しません。 OpenSSL にはそのための API

が存在します。これらの API を模式的に説明すると、以下のようになります。

エントロピー源には良いものと悪いものがあります。例えば現在時刻(Unix time)は エントロピー源としては悪いです。なぜなら予測不可能なのは せいぜい秒の部分のみであり、上位のビットは予測可能だからです。 そこに含まれるエントロピー量を適切に評価できるならばシードとして利用できますが、 通常はもっと良いエントロピー源があるはずです。 Linux であれば /dev/random が適当なエントロピー源となるでしょう。

OpenSSL では EGD(Entropy Gathering Daemon)からエントロピーを取得すること もできます。適切なエントロピー源を提供していない OS ではこのような 方法でエントロピー源を用意する必要があるかもしれません。

実際のところ、OpenSSL バージョンによっては OS が提供するエントロピー源から 必要な量のエントロピーを得るよう実装してあるため、これらの API を使って エントロピーを追加する必要はない場合が多いでしょう。ただし、 OS によっては OpenSSL が利用可能なエントロピー源を見つけられない場合があり、 その場合はこれらのメソッドで明示的にエントロピーを追加する必要があるでしょう。

モジュール関数

定義 説明
egd(filename) -> true

EGD(Entropy Gathering Daemon) からエントロピーを得、 乱数生成器に追加します。

egd_bytes(filename, length) -> true

EGD(Entropy Gathering Daemon) から length バイト分のエントロピーを得ます。

load_random_file(filename) -> true

ファイルを読み込み、その内容をエントロピー源として 乱数生成器に渡します。

pseudo_bytes(len) -> String

暗号論的な予測不可能性を持たない(が高速な) 乱数生成器によって、 len バイトの ランダムなバイト列を返します。

random_add(str, entropy) -> self

乱数生成器にエントロピーを追加します。

random_bytes(len) -> String

暗号論的な予測不可能性を持つ乱数生成器によって、 len バイトの ランダムなバイト列を返します。

seed(str) -> str

乱数生成器にエントロピーを 「エントロピー予測値 = str のバイト数」として 追加します。

status? -> bool

乱数生成器内のエントロピーが十分である場合に true を返します。

write_random_file(filename) -> true

乱数生成器で生成された 1024 バイトのランダムなバイト列を ファイルに書き込みます。