7.2.1. X9.82 Pseudo-Random Number Generation (X9.82擬似乱数生成)
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は, 生成器の状態の一部であるhash_lengthのサイズのビット文字列であり, ランダムビットが生成されるたびに少なくとも1回更新されます。
-
Vは, hash_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"をnullビット文字列に設定し, 次に繰り返し実行します:
V = HMAC ( K, V )
temp = temp | V
tempが要求されたランダムビット数以上になったらすぐに停止します。tempから要求された数の先頭ビットを使用します。アルゴリズムの定義では, 2^35ビットを超える要求を禁止しています。
上記のように擬似ランダム出力ビットを抽出して保存した後, 戻る前にさらに2つのHMACを次のように実行する必要があります:
K = HMAC ( K, V | 0x00 )
V = HMAC ( K, V )