本文へスキップ
ecdsa.com

RFC 6979(決定的 ECDSA)

Thomas Pornin による 2013年の仕様で、DSA または ECDSA の nonce k を秘密鍵とメッセージのハッシュ値から HMAC-DRBG で導出するため、署名に乱数生成器が不要になります。
別表記RFC 6979deterministic ECDSAdeterministic DSA

手順(§3.2)では、秘密鍵と、群の位数を法として剰余をとったハッシュ値(int2octets(x) ‖ bits2octets(h1))を HMAC のシードとし、HMAC-DRBG の更新ステップを実行して、候補が 1…q−1 の範囲に入るまで生成を繰り返します。同じ鍵とメッセージからは常に同じ k が得られるため、署名もバイト単位で同一になります。検証者には違いがわかりません。出力は通常の ECDSA または DSA の署名です。

FIPS 186-5 は、この方法を「決定的 ECDSA」として承認しています(§6.3.2、付録 A.3.3)。この方法は、PlayStation 3 や多くのウォレットで起きた鍵漏洩の原因である、質の悪い乱数生成器による破綻をなくし、テストベクトルを再現可能にします。RFC 6979 の付録 A.2 には、DSA、NIST の P 曲線、K 曲線と B 曲線のテストベクトルが掲載されています。

その代わりに、フォールト攻撃とサイドチャネル攻撃にさらされやすくなります。フォールトを誘発しながら同じメッセージに 2 回署名すると鍵が漏洩しうるため、ヘッジ付きのバリアントでは、同じ導出処理に追加の乱数を混ぜます(§3.6 は追加データを認めています)。ライブラリでの切り替え方法は次のとおりです。OpenSSL 3.2 以降では -pkeyopt nonce-type:1、Python の cryptography では ec.ECDSA(hashes.SHA256(), deterministic_signing=True) です。@noble/curves はデフォルトで決定的に署名し、ヘッジ用に extraEntropy オプションがあります。

規格と参考文献

すべての用語