メインコンテンツまでスキップ

7.2. Generators Assuming a Source of Entropy (エントロピーソースを仮定した生成器)

7.2. Generators Assuming a Source of Entropy (エントロピーソースを仮定した生成器)

以下の 3 つのセクションで説明されている擬似乱数生成器はすべて, 十分なエントロピーを持つシード値が提供されることを仮定しています。次に, そのシードから強力なシーケンス (セクション 6.2 を参照) を生成します。

7.2.1. X9.82 Pseudo-Random Number Generation (X9.82擬似乱数生成)

ANSI X9F1 委員会は, 真のランダム性生成器と擬似乱数生成器の両方をカバーする乱数生成の標準を作成する最終段階にあります。これには, ハッシュ関数に基づく多数の擬似乱数生成器が含まれており, そのうちの 1 つはおそらく HMAC SHA ハッシュ構造 [RFC2104] に基づいています。この生成器のドラフトバージョンを以下に説明します。多数のオプション機能を省略しています [X9.82]。

以下のサブセクションでは, HMAC ハッシュ構造は単に HMAC と呼ばれていますが, もちろん特定の使用では特定の標準 SHA 関数を選択する必要があります。一般的に言えば, 生成される擬似ランダム値の強度が N ビットである場合, 選択される SHA 関数は N 以上のビットの出力を生成する必要があり, 少なくとも N ビットの入力エントロピーのソースが必要です。この生成器のインスタンス化全体で同じハッシュ関数を使用する必要があります。

7.2.1.1. Notation (表記法)

以下のセクションでは, 以下に示す表記法が使用されます:

  • hash_length は使用されている基礎となるハッシュ関数の出力サイズです。
  • input_entropy は生成器にエントロピーを提供する入力ビット文字列です。
  • K は生成器の状態の一部であり, ランダムビットが生成されるたびに少なくとも 1 回更新される hash_length サイズのビット文字列です。
  • Vhash_length サイズのビット文字列であり, 生成器の状態の一部です。hash_length ビットの出力が生成されるたびに更新されます。
  • "|" は連結を表します。

7.2.1.2. Initializing the Generator (生成器の初期化)

V を各バイトの最下位ビットが 1 に設定されていることを除いてすべてゼロバイトに設定します。

K をすべてゼロバイトに設定し, 次に設定します:

K = HMAC ( K, V | 0x00 | input_entropy )

V = HMAC ( K, V )

K = HMAC ( K, V | 0x01 | input_entropy )

V = HMAC ( K, V )

注意: すべての SHA アルゴリズムは整数バイト数を生成するため, K と V の長さは整数バイト数になります。

7.2.1.3. Generating Random Bits (ランダムビットの生成)

出力が呼び出されたら, 単に次のように設定します:

V = HMAC ( K, V )

そして V の先頭ビットを使用します。V の長さよりも多くのビットが必要な場合, "temp" をヌルビット文字列に設定し, 次を繰り返し実行します:

V = HMAC ( K, V )
temp = temp | V

temp が要求されたランダムビット数以上になるまで停止します。temp から要求された数の先頭ビットを使用します。アルゴリズムの定義は, 2^35 ビットを超える要求を禁止しています。

上記のように擬似ランダム出力ビットを抽出して保存した後, 戻る前に次のように 2 つの HMAC をさらに実行する必要があります:

K = HMAC ( K, V | 0x00 )
V = HMAC ( K, V )

7.2.2. X9.17 Key Generation (X9.17鍵生成)

米国国家規格協会は, 鍵のシーケンスを生成するための次の方法を指定しました [X9.17]:

  • s0 は初期 64 ビットシードです。
  • gn は生成された 64 ビット鍵量のシーケンスです。
  • k はこの鍵シーケンスを生成するために予約されたランダム鍵です。
  • t は利用可能な限り細かい解像度で鍵が生成される時刻です (最大 64 ビット)。
  • DES ( K, Q ) は鍵 K で量 Q の DES 暗号化です。

次に:

g    = DES ( k, DES ( k, t ) XOR s  )
n n

s = DES ( k, DES ( k, t ) XOR g )
n+1 n

g sub n が DES 鍵として使用される場合, その使用のために 8 番目のビットごとにパリティを調整する必要がありますが, 次の s を計算する際には修正されていない完全な 64 ビット g を使用する必要があります。

7.2.3. DSS Pseudo-random Number Generation (DSS擬似乱数生成)

NIST デジタル署名標準 [DSS] の付録 3 は, 秘密鍵などとして使用する 160 ビット量の擬似ランダムシーケンスを生成する方法を提供します。これは変更通知 1 [DSS_CN1] によって修正され, 汎用擬似乱数を生成する次のアルゴリズムが生成されました:

t = 0x 67452301 EFCDAB89 98BADCFE 10325476 C3D2E1F0

XKEY = initial seed
0

For j = 0 to ...

XVAL = ( XKEY + optional user input ) (Mod 2^512)
j

X = G( t, XVAL )
j

XKEY = ( 1 + XKEY + X ) (Mod 2^512)
j+1 j j

このように生成された量 X は, 160 ビット値の擬似ランダムシーケンスです。上記の "G" には 2 つの関数を使用できます。各々は 160 ビット値を生成し, 2 つの引数 (160 ビット値と 512 ビット値) を取ります。

最初は SHA-1 に基づいており, SHA-1 仕様でサブスクリプト付きの H で示される 5 つのリンク変数を, 5 分の 1 に分割された最初の引数に設定することによって機能します。次に, NIST SHA-1 仕様のセクション 7 のステップ (a) から (e) が, 512 ビットデータブロックであるかのように 2 番目の引数に対して実行されます。これらのステップの後のリンク変数の値は, 連結されて G の出力を生成します [SHA*]。

代替方法として, NIST は DES 暗号化関数 [DSS] の複数のアプリケーションに基づく代替 G 関数も定義しました。