RFC 6979 - Deterministic Usage of the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA) (デジタル署名アルゴリズム (DSA) および楕円曲線デジタル署名アルゴリズム (ECDSA) の決定論的使用法)
- ステータス: Informational
- 発行日: August 2013
- ストリーム: INDEPENDENT
- エラッタ: エラッタなし
Abstract (概要)
この文書は決定論的なデジタル署名生成手順を定義します。このような署名は標準的な Digital Signature Algorithm (DSA, デジタル署名アルゴリズム) および Elliptic Curve Digital Signature Algorithm (ECDSA, 楕円曲線デジタル署名アルゴリズム) のデジタル署名と互換性があり, ここに記載された手順を認識する必要のない変更されていない検証者によって処理できます。決定論的署名はデジタル署名に関連する暗号学的セキュリティ機能を保持しますが, 高品質なランダム性のソースへのアクセスを必要としないため, さまざまな環境でより簡単に実装できます。
Status of This Memo (このメモのステータス)
この文書はインターネット標準トラックの仕様ではありません。情報提供を目的として公開されています。
これは他の RFC ストリームとは独立した RFC シリーズへの貢献です。RFC Editor はこの文書をその裁量で公開することを選択し, 実装または展開に対するその価値について何も述べていません。RFC Editor によって公開が承認された文書は, いかなるレベルのインターネット標準の候補でもありません。RFC 5741 のセクション 2 を参照してください。
この文書の現在のステータス, 正誤表, およびフィードバックの提供方法に関する情報は http://www.rfc-editor.org/info/rfc6979 で入手できます。
Copyright Notice (著作権表示)
Copyright (c) 2013 IETF Trust and the persons identified as the document authors. All rights reserved.
この文書は BCP 78 および IETF Trust の IETF 文書に関する法的規定 (http://trustee.ietf.org/license-info) の対象であり, この文書の公開日に有効です。これらの文書は, この文書に関するあなたの権利と制限を記述しているため, 慎重に確認してください。
Contents
- 1. Introduction (はじめに)
- 2. DSA and ECDSA Notations (DSA および ECDSA の表記法)
- 3. Deterministic DSA and ECDSA (決定論的 DSA および ECDSA)
- 4. Security Considerations (セキュリティに関する考察)
- 5. Intellectual Property Status (知的財産ステータス)
- 6. References (参考文献)
- Appendix A. Examples (例)
1. Introduction (はじめに)
DSA [FIPS-186-4] および ECDSA [X9.62] は2つの標準的なデジタル署名スキームです。これらはさまざまなプロトコルにおいてデータの完全性と検証可能な真正性を提供します。
DSA および ECDSA の特徴の1つは, 各署名生成のために新しいランダム値 (以下 k と呼びます) を生成する必要があることです。効果的なセキュリティのためには, k は暗号学的に安全なプロセスを使用して, モジュラー整数の集合からランダムかつ一様に選択されなければなりません。そのプロセスにおけるわずかな偏りでさえ, 署名スキームに対する攻撃に利用される可能性があります。
暗号学的に安全なランダム性のソースの必要性は, 安全な乱数生成が困難な一部のアーキテクチャ, 特にスマートカードなどの組み込みシステムにおける DSA および ECDSA 署名スキームの展開の妨げとなることが証明されています。これらのシステムでは, Public-Key Cryptography Standards (PKCS, 公開鍵暗号標準) #1 [RFC3447] (Probabilistic Signature Scheme (PSS, 確率的署名スキーム) ではなく "type 1" パディングを使用) および ISO 9796-2 [ISO-9796-2] で指定されている RSA 署名アルゴリズムが, 計算コストが高いにもかかわらず, しばしば好まれます。これは RSA (このようなパディングスキームを使用した場合) が決定論的であり, したがってランダム性のソースを必要としないためです。
DSA および ECDSA のランダム化された性質は実装のテストをより困難にします。自動テストでは, 実装が十分に高品質なランダム性のソースを使用しているかどうかを確実に検出できません。これにより, 実装プロセスは壊滅的な障害に対してより脆弱になり, システムが展開され攻撃を受けた後にしばしば発見されます。
"ランダム" 値 k を生成するための決定論的プロセスを使用することにより, DSA および ECDSA を決定論的スキームに変換することが可能です。そのプロセスは, 署名スキームに期待される検証可能性および偽造不可能性の特性を維持するために, いくつかの暗号学的特性を満たさなければなりません。すなわち, 署名の秘密鍵を知らない者にとって, 入力メッセージから対応する k 値へのマッピングは, ランダムかつ一様に選択された関数 (メッセージの集合から可能な k 値の集合への関数) が返すものと計算上区別不可能でなければなりません。
この文書はそのような手順を記述します。この手順には以下の特徴があります:
-
生成される署名はプレーンな DSA および ECDSA と完全に互換性を保ちます。署名を検証するエンティティは変更する必要がなく, k を生成するために使用されるプロセスを認識する必要もありません。
-
鍵ペアの生成は変更されません。既存の秘密鍵を決定論的 DSA および ECDSA で使用できます。
-
決定論的 DSA および ECDSA の使用は, 秘密値または公開値の追加のストレージ要件を意味しません。
-
決定論的 DSA および ECDSA は, プレーンな DSA および ECDSA と同じ入力, すなわち暗号学的に安全なハッシュ関数を使用して署名されるメッセージに対して計算されたハッシュ値に対して適用できます。
この文書で指定されている決定論的 (EC)DSA の定義においていくつかの比較的恣意的な選択がなされました。これは可能な限り普遍的に適用可能にするために行われ, 含まれるテストベクタの有用性を最大化します。いくつかの可能な変種の議論については Section 3.6 を参照してください。
鍵ペアの生成には依然としてランダム性のソースが必要であることに注意すべきです。ランダム性の品質が問題となる組み込みシステムでは, 鍵ペアの生成がより制御された条件 (例えば, 特別なスマートカード初期化手順中または宣誓した代理人の物理的管理下) で行われるように手配できることがしばしばあります。または, 鍵を他の場所で生成してデバイスにインポートすることさえできます。決定論的 DSA および ECDSA は署名生成時のランダム性の必要性のみを扱います。
2. DSA and ECDSA Notations (DSA および ECDSA の表記法)
このセクションでは, DSA および ECDSA を簡潔に説明し, 表記法を定義します。DSA および ECDSA の完全な仕様は, それぞれ [FIPS-186-4] および [X9.62] にあります。
2.1. Key Parameters (鍵パラメータ)
DSA および ECDSA は素数サイズの大きな群に対して動作します。この群では, 群演算は計算が容易ですが, 離散対数は既存および予見可能な技術では計算上実行不可能です。群の定義は "鍵パラメータ" と呼ばれます。鍵パラメータは, セキュリティに悪影響を与えることなく異なる鍵ペア間で共有できます。これは特に ECDSA において通常のケースです。
DSA は以下の鍵パラメータを使用します:
p: 大きな素数 (少なくとも 1024 ビット)
q: 十分に大きな素数 (少なくとも 160 ビット) であり, p-1 の約数でもあります
g: p を法とする整数の位数 q の乗法的部分群の生成元
DSA が計算される群は, 値 'g^j mod p' から構成されます。ここで '^' は冪乗を示し, j は 0 から q-1 (両端を含む) までの範囲です。群のサイズは q です。
ECDSA は以下の鍵パラメータを使用します:
E: 与えられた有限体上で定義された楕円曲線
q: 十分に大きな素数 (少なくとも 160 ビット) であり, 曲線の位数の約数です
G: 位数 q の E の点
ECDSA が計算される群は, 曲線上の点 jG (点 G と整数 j の乗算) から構成されます。ここで j は 0 から q-1 までの範囲です。G は qG = 0 (曲線 E 上の "無限遠点") となるような点です。群のサイズは q です。これらの表記法は [X9.62] に記載されているものとはわずかに異なることに注意してください。DSA に使用される表記法と一致させるためにこれらを使用しています。
2.2. Key Pairs (鍵ペア)
DSA または ECDSA の秘密鍵は, q を法として取られた整数 x です。関連する標準は x が 0 であってはならないと規定しています。したがって, x は範囲 [1, q-1] の整数です。
DSA または ECDSA の公開鍵は, 秘密鍵 x と鍵パラメータから計算されます:
-
DSA の場合, 公開鍵は整数です: y = g^x mod p
-
ECDSA の場合, 公開鍵は曲線上の点です: U = xG
2.3. Integer Conversions (整数変換)
qlen を q の2進数の長さとします。qlen は, q が 2^qlen よりも小さくなる最小の整数です。これは符号ビットなしの q の2進表現のサイズです (q は大きな素数であるため奇数であり, 2の累乗に等しい整数の長さに関する曖昧さを回避します)。ビット列, オクテット列, および q を法とする整数に対して動作する5つの変換関数を定義します。qlen はこれらの変換の主要なパラメータです。
以下のサブセクションでは, blen および rlen と呼ばれる2つの他の長さを使用します。rlen は qlen を8の次の倍数に切り上げた値に等しくなります (qlen がすでに8の倍数である場合, rlen は qlen に等しくなります。そうでない場合, rlen はわずかに大きく, qlen+7 まで大きくなります)。rlen は生成された署名の前半である値 r とは無関係であることに注意してください。blen はビットの入力シーケンスの長さ (ビット単位) であり, 呼び出し間で変化する可能性があります。blen は qlen よりも小さい, 等しい, または大きい場合があります。
2.3.1. Bits and Octets (ビットとオクテット)
形式的には, すべての操作はビットのシーケンスに対して定義されます。シーケンスは順序付けられており, 最初のビットは左端と呼ばれ, 最後のビットは右端と呼ばれます。
ほとんどのソフトウェアシステムでは, ビットはオクテット (8ビットのシーケンス) にグループ化されます。バイナリデータ, 例えばハッシュ関数の出力は, オクテットのシーケンスとして利用可能です。該当する場合, オクテット内のビットは最上位から最下位の順に並んでいると見なします: オクテット内の最初 (左端) のビットは数値 128 を持ち, 最後 (右端) のビットは数値 1 を持ちます。
2.3.2. Bit String to Integer (ビット列から整数へ)
bits2int 変換は, blen ビットのシーケンスを入力として受け取り, 2^qlen よりも小さい非負整数を出力します。これは以下のステップから構成されます:
-
シーケンスは最初に長さ qlen に切り詰められるか拡張されます:
-
qlen < blen の場合, qlen 個の左端のビットが保持され, 後続のビットは破棄されます。
-
そうでない場合, qlen-blen 個のビット (値ゼロ) がシーケンスの左側に追加されます (つまり, シーケンス順序で入力ビットの前に)。
-
-
結果のシーケンスは, ビッグエンディアン規則を使用して整数値に変換されます: 入力ビットが b_0 (左端) から b_(qlen-1) (右端) と呼ばれる場合, 結果の値は次のようになります:
b_0*2^(qlen-1) + b_1*2^(qlen-2) + ... + b_(qlen-1)*2^0
bits2int 変換は次の方法でも説明できます: 入力ビットシーケンス (長さ blen) はビッグエンディアン規則を使用して整数に変換されます。次に, blen が qlen よりも大きい場合, 結果の整数は blen-qlen を2で累乗した値で除算されます (ユークリッド除算: 余りは破棄されます)。大きな整数の算術演算の多くのソフトウェア実装では, その除算は blen-qlen ビットによる "右シフト" に相当します。
2.3.4. Bit String to Octet String (ビット列からオクテット列へ)
bits2octets 変換は, blen ビットのシーケンスを入力として受け取り, rlen ビットのシーケンスを出力します。これは以下のステップから構成されます:
-
入力シーケンス b は bits2int 変換を通じて整数値 z1 に変換されます:
z1 = bits2int(b) -
z1 は q を法として削減され, z2 (0 から q-1 の間の整数, 両端を含む) が得られます:
z2 = z1 mod qz1 が 2^qlen よりも小さいため, そのモジュラー削減は単純な条件付き減算で実装できることに注意してください: その値が非負である場合 z2 = z1-q, そうでない場合 z2 = z1。
-
z2 は int2octets を適用することにより, オクテットのシーケンス (rlen ビットのシーケンス) に変換されます。
2.3.5. Usage (使用法)
int2octets は, 長さ qlen の入力シーケンスに対してさえ, bits2int の逆ではないことに注意する価値があります: int2octets は左側にいくつかのビットを追加し, bits2int は右側のいくつかのビットを破棄します。int2octets が bits2int の逆であるのは, qlen が 8 の倍数であり, ビットシーケンスがすでに長さ qlen を持っている場合のみです。
bits2int は, 標準的な DSA および ECDSA における署名生成および検証中に使用され, ハッシュ値 (入力メッセージに対して計算された) を q を法とする整数に変換します。つまり, bits2int を通じて得られた整数はさらに q を法として削減されます。その整数は 2^qlen よりも小さいため, その削減は最大で1回の減算で実行できます。
int2octets は SEC 1 [SEC1] のセクション 2.3.7 において "Integer-to-OctetString" という名前で定義されています。これは ASN.1 ベースの構造内での ECDSA 秘密鍵 (x) のエンコーディングの仕様で使用されます。
bits2octets は標準的な DSA または ECDSA では使用されません。決定論的 (EC)DSA の仕様で使用します。
2.4. Signature Generation (署名生成)
署名生成は暗号学的ハッシュ関数 H と入力メッセージ m を使用します。メッセージは最初に H によって処理され, 値 H(m) が得られます。これは長さ hlen のビットのシーケンスです。通常, H はその出力長 hlen が qlen にほぼ等しくなるように選択されます。これは署名スキームの全体的なセキュリティが hlen と qlen のうち小さい方に依存するためです。ただし, 関連する標準は hlen と qlen のすべての組み合わせをサポートします。
次のステップが適用されます:
-
H(m) は bits2int 変換と追加のモジュラー削減を使用して, q を法とする整数に変換されます:
h = bits2int(H(m)) mod qbits2octets の説明で述べたように, 追加のモジュラー削減は条件付き減算以上のものではありません。
-
k と呼ばれる q を法とするランダム値が生成されます。この値は 0 であってはなりません。したがって, 範囲 [1, q-1] にあります。この文書の残りのほとんどは k を生成するために使用されるプロセスを中心に展開されます。プレーンな DSA または ECDSA では, k は q-1 個の可能な値の中から一様な確率で値を選択するランダム選択を通じて選択されるべきです。
-
値 r (q を法とする) が k と鍵パラメータから計算されます:
-
DSA の場合:
r = g^k mod p mod q(冪乗は p を法として実行され, 0 から p-1 の間の数値が得られ, それがさらに q を法として削減されます。)
-
ECDSA の場合: 点 kG が計算されます。その X 座標 (E が定義されている体のメンバー) は整数に変換され, q を法として削減され, r が得られます。
r がゼロになった場合, 新しい k を選択し, r を再度計算する必要があります (これは極めてありえない発生です)。
-
-
値 s (q を法とする) が計算されます:
s = (h+x*r)/k mod qペア (r, s) が署名です。署名をどのようにエンコードするかは DSA および ECDSA 標準自体ではカバーされていません。一般的な方法は DER エンコードされた ASN.1 構造 (r と s の2つの INTEGER の SEQUENCE, この順序で) を使用することです。
3. Deterministic DSA and ECDSA (決定論的 DSA および ECDSA)
決定論的 (EC)DSA は, 値 k がランダムに生成される代わりに, このセクションで説明されるプロセスを通じて取得されることを除いて, 標準的な (EC)DSA 署名生成プロセス (前のセクションで説明) を使用して, 入力メッセージ m に対する (EC)DSA 署名を生成するプロセスです。
セクション 2 で説明した表記法を使用します。
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 の間にない場合, プロセスはループします。単純なモジュラー削減を実行すると, 署名のセキュリティに有害となる偏りが生じます。
3.3. Alternate Description of the Generation of k (k の生成の代替的説明)
This compatibility page redirects readers to 3.3. Alternate Description of the Generation of k (k の生成の代替的説明).
3.4. Usage Notes (使用上の注意)
DSA または ECDSA の場合, 値 k は署名の前半を計算するために使用され, r と呼ばれます (セクション 2.4 参照)。DSA および ECDSA 標準は, r がゼロの場合, 新しい k を選択する必要があると規定しています。このような状況では, この文書は値 k が "不適切" であり, 生成プロセスはループし続けるべきであると指定しています。
このイベントは極めて起こりにくいです。実際, r のゼロ値につながる秘密鍵とメッセージを見つけるには, かなりの計算作業 (ハッシュ関数の原像抵抗性を破ることに類似) が必要になります。したがって, 純粋な偶然でそのようなケースに遭遇することは起こりそうにないと考えられ, 攻撃者は注意深く作成されたメッセージでそれを強制することはできません。実際には, そのようなコードパスはトリガーされず, したがって最小限の最適化で実装できます。
3.5. Rationale (根拠)
前のセクションで説明されたプロセスは, [X9.62] の附属書 D で "HMAC_DRBG" 疑似乱数生成器を使用して説明されている k の "承認された" 生成プロセスを模倣しています。主な違いは, 疑似乱数生成器 (PRNG) のシードとして秘密鍵 x とハッシュ化されたメッセージ H(m) の連結を使用することです。n ビットの "セキュリティレベル" を使用する場合, HMAC_DRBG は少なくとも n+64 ビットのシードエントロピーで使用する必要があります。ただし, 鍵 x もそれだけのエントロピーで生成されているべきであり, x の長さは qlen であり, 少なくとも 2*n に等しく, したがって n+64 より大きいです (標準で指定されているように, DSA および ECDSA は qlen >= 160 を必要とします)。したがって, 決定論的 ECDSA は [X9.62] の附属書 D のエントロピー要件を満たすと主張できます。
統合を容易にするために, H(m) の代わりに bits2octets(H(m)) を使用します。実際, 多くの既存の署名システムはメッセージのハッシュをオフロードします。署名エンジン (秘密鍵にアクセスできる) は H(m) のみを受け取ります。データ帯域幅が制限されている一部のアプリケーションでは, bits2int 変換が後続のビットをいずれにせよ無視するという根拠に基づいて, H(m) の最初の qlen ビットのみが署名エンジンに送信されます。おそらく一部のシステムでは, 切り捨てられた H(m) は外部で q を法として削減される可能性があります。これは (EC)DSA がハッシュ化されたメッセージで最初に行うことだからです。bits2octets の定義により, 決定論的 (EC)DSA は同じ入力で適用できます。
3.6. Variants (バリアント)
決定論的 (EC)DSA の仕様の多くの部分はかなり恣意的ですが, 相互運用性の理由で選択が行われました。このセクションでは, いくつかの可能なバリアントについて説明します。
使用されるハッシュ関数 H は, 署名生成プロセスで2つの異なる目的に使用されます: 最初に入力メッセージを処理し, 次に HMAC の基礎として (それ自体もハッシュ関数です)。この文書では, 両方の用途に同じハッシュ関数を使用することを指定しています。ただし, これは必須ではありません。これら2つの役割に異なる関数を使用することは可能です。主な欠点は, テストベクトルがすべての組み合わせをカバーできないことです。単一のハッシュ関数を使用すると, 相互運用性テストが簡素化されます。
int2octets と bits2octets の定義は rlen ビット (つまり qlen を次の 8 の倍数に切り上げたもの) の出力につながり, 使用時に実際に最大で qlen ビットのエントロピーを生成します。正確に qlen ビットを出力するように同じ関数を定義することは可能でしょう。ただし, 多くのプログラミング言語やフレームワークはビットシーケンスではなくオクテットのシーケンスで動作する傾向があるため, 実装がわずかに複雑になります。一方, qlen の切り上げは最大で 7 ビットを追加し, PRNG シードのコンテキストでは無視できます。
この仕様では, k (bits2int を介して T から取得) が適切な範囲にない場合, または r のゼロ値を生成する場合の特殊なケースでループするプロセスを規定しています。ただし, これらのケースはどちらも実際には発生しません。後者のケース (計算された r がゼロ) は, ソフトウェアバグ (たとえば, プログラム実行中に楕円曲線パラメータが破損する) によってのみ発生する可能性があります。したがって, 実装はループする代わりに, そのようなケースを回復不可能なエラーとして扱い, 署名計算を単純に中止することを選択できます。
4. Security Considerations (セキュリティに関する考察)
この文書で説明されている決定論的 (EC)DSA の変種の署名セキュリティは, 検討中の (EC)DSA の従来のセキュリティと同等です。特に:
-
署名の偽造者に対して, 決定論的 (EC)DSA によって生成された署名は, ランダムな k 値を使用して生成された署名と区別できません。これは, HMAC が疑似ランダム関数 (PRF) として動作するという仮定に基づいています。
-
秘密鍵 x へのアクセス権を持たない攻撃者に対して, 決定論的 (EC)DSA は, ランダムな k 生成を使用する従来の (EC)DSA と同じ保護を提供します。
-
決定論的 (EC)DSA は, いくつかのサイドチャネル攻撃に対してより脆弱である可能性があります。ランダムな k の使用は, タイミング攻撃に対するある程度の保護を提供する可能性があります (攻撃者が観察するタイミングは, k のランダム性により変化するため)。決定論的 k を使用すると, この変動性は失われます。ただし, 適切に実装された場合 (一定時間演算を使用), 決定論的 (EC)DSA はそのような攻撃に対して脆弱ではありません。
-
決定論的生成により, 実装のテストが容易になります。自動テストではランダム生成の品質を評価できないため, 決定論的変種を使用することで, 実装が正しく動作しているかどうかをより確実に検証できます。
-
k の決定論的生成は, 秘密鍵 x が侵害された場合の影響を軽減しません。k が決定論的に生成される場合でも, 秘密鍵が漏洩すると攻撃者は任意のメッセージに対する署名を生成できます。
-
HMAC が使用されるハッシュ関数 H の選択は, セキュリティにとって重要です。H は暗号学的に安全なハッシュ関数であるべきです。出力長が短いハッシュ関数 (例えば MD5 や SHA-1) は, 全体的なセキュリティが損なわれる可能性があるため避けるべきです。
秘密鍵 x の保護が最も重要であることに注意することが重要です。決定論的 (EC)DSA は, 不適切なランダム性生成の問題を解決しますが, 秘密鍵の適切な保護と管理に取って代わるものではありません。
5. Intellectual Property Status (知的財産ステータス)
この文書は IETF (Internet Engineering Task Force) によって公開されたものではなく, 独立した提出として RFC シリーズに貢献されています。著者は, この仕様の実装に必要な特許またはその他の知的財産権を認識していません。
Appendix A. Examples (例)
この付録では, k の生成プロセスの詳細な例とテストベクタを提供します。
A.1.2. Generation of k (k の生成)
このセクションでは, 決定論的 k 生成プロセスの各ステップで取得される中間値を示します。
ハッシュ関数として SHA-256 を使用します (hlen = 256 ビット)。
メッセージ m は文字列 "sample" です。
H(m) の計算:
h1 = SHA-256("sample")
= 0xAF2BDBE1AA9B6EC1E2ADE1D694F41FC71A831D0268E9891562113D8A62ADD1BF
この値は bits2octets 変換を使用して処理されます。
A.2. Test Vectors (テストベクタ)
このセクションでは, DSA および ECDSA の決定論的署名生成のためのテストベクタを提供します。各テストベクタには以下が含まれます:
- 鍵パラメータ (曲線または DSA パラメータ)
- 秘密鍵 x
- メッセージ
- 使用されるハッシュ関数
- 期待される k 値
- 期待される署名 (r, s)
テストベクタは次のカテゴリに分類されます:
- A.2.1 - A.2.2: DSA (1024 ビットおよび 2048 ビット)
- A.2.3 - A.2.7: ECDSA (素体上の曲線, 192-521 ビット)
- A.2.8 - A.2.12: ECDSA (2進体上の Koblitz 曲線, 163-571 ビット)
- A.2.13 - A.2.17: ECDSA (2進体上の疑似ランダム曲線, 163-571 ビット)
実装者は, これらのテストベクタを使用して決定論的 (EC)DSA の実装を検証できます。
A.3. Sample Code (サンプルコード)
決定論的 (EC)DSA のリファレンス実装とサンプルコードは, さまざまなプログラミング言語で利用可能です。実装者は, この文書で説明されているアルゴリズムを実装する際に, これらのリソースを参照できます。
実装時の重要な考慮事項:
- HMAC の正しい実装を使用してください
- bits2int, int2octets, bits2octets 変換関数を正確に実装してください
- k 値が範囲 [1, q-1] 内にあることを確認してください
- サイドチャネル攻撃に対する防御策を実装してください
- テストベクタに対して実装を検証してください
注: サンプルコードは説明目的のものであり, 本番環境での使用には追加のセキュリティ対策と最適化が必要になる場合があります。