3.2. Generation of k (k の生成)
3.2. Generation of k (k の生成)
入力メッセージ m が与えられた場合, 次のプロセスが適用されます:
a. メッセージ m をハッシュ関数 H を通して処理し, 次を得ます:
h1 = H(m)
(h1 は hlen ビットのシーケンスです)。
b. 設定します:
V = 0x01 0x01 0x01 ... 0x01
V の長さ (ビット単位) が 8*ceil(hlen/8) に等しくなるようにします。例えば, オクテットベースのシステムで H が SHA-256 の場合, V は値 1 の 32 オクテットのシーケンスに設定されます。このステップおよび後続のすべてのステップでは, 入力メッセージを処理するためにステップ 'a' で使用されたものと同じ H 関数を使用することに注意してください。この選択については Section 3.6 でより詳細に説明します。
c. 設定します:
K = 0x00 0x00 0x00 ... 0x00
K の長さ (ビット単位) が 8*ceil(hlen/8) に等しくなるようにします。
d. 設定します:
K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1))
ここで '||' は連結を示します。言い換えると, 次のものを順番に連結したものに対して, 鍵 K を使用して HMAC を計算します: V の現在の値, 値 0 の 8 ビットのシーケンス, (EC)DSA 秘密鍵 x のエンコーディング, およびハッシュされたメッセージ (bits2octets 変換で指定されたように切り詰められ拡張される可能性があります)。HMAC の結果が K の新しい値です。秘密鍵 x は [1, q-1] の範囲にあり, したがって int2octets の適切な入力であり, rlen ビットの出力, すなわちオクテットの整数個 (rlen は 8 の倍数) が得られることに注意してください。
e. 設定します:
V = HMAC_K(V)
f. 設定します:
K = HMAC_K(V || 0x01 || int2octets(x) || bits2octets(h1))
今回は "内部オクテット" が 0x01 であることに注意してください。
g. 設定します:
V = HMAC_K(V)
h. k の適切な値が見つかるまで次のアルゴリズムを適用します:
-
T を空のシーケンスに設定します。T の長さ (ビット単位) を tlen と表記します。したがって, この時点で tlen = 0 です。
-
tlen < qlen の間, 次を実行します:
V = HMAC_K(V)
T = T || V -
計算します:
k = bits2int(T)k の値が [1,q-1] の範囲内にあり, DSA または ECDSA に適している場合 (すなわち, 0 ではない r 値をもたらす場合。Section 3.4 を参照), k の生成は終了です。取得された k の値は DSA または ECDSA で使用されます。そうでない場合, 計算します:
K = HMAC_K(V || 0x00)
V = HMAC_K(V)そしてループします (新しい T を生成しようとします, など)。
k が T から生成されるとき, bits2int の結果は q と比較されますが, q を法として削減されないことに注意してください。値が 1 から q-1 の間にない場合, プロセスはループします。単純なモジュラー削減を実行すると, 署名のセキュリティに有害となる偏りが生じます。