本文へスキップ
ecdsa.com

nonce(ECDSA の k)

一度だけ使われる数です。ECDSA、DSA、Schnorr 署名では署名ごとの秘密値 k を指し、秘密にするだけでなく、予測不可能で一様に分布していなければなりません。
別表記ECDSA noncek valueper-message secret numberephemeral key k

ECDSA では、署名者は 1…n−1 の範囲から k を選び、点 kG を計算して、その x 座標を n で割った剰余を r とします。次に s = k⁻¹·(z + r·d) mod n を計算します。ここで z は切り詰めたメッセージのハッシュ値、d は秘密鍵です(FIPS 186-5 §6.4.1)。s は k と d の両方について線形なので、1 つの署名の k がわかるだけで、d = (s·k − z)·r⁻¹ mod n により秘密鍵を求められます。そのため FIPS 186-5 §6.3 は、署名ごとに新しい k を使い、それを鍵そのものと同様に保護することを求めています。

再利用も同じく致命的で、しかも検出は容易です。同じ鍵による 2 つの署名で r が等しければ、k = (z₁ − z₂)·(s₁ − s₂)⁻¹ mod n が得られ、続いて d も求まります。2010年に PlayStation 3 の署名鍵が抽出されたのも、多くのブロックチェーンのウォレットから資金が抜き取られたのも、この方法によるものです。nonce は繰り返される必要すらありません。署名ごとに数ビットの偏りや漏洩があれば、十分な数の署名を集めることで、格子基底簡約によって隠れ数問題を解き、鍵を復元できます。

最近のライブラリは、秘密鍵とメッセージのハッシュ値から k を決定的に導出する(RFC 6979、FIPS 186-5 §6.3.2 で許可)か、同じ導出に新しい乱数を混ぜ込むヘッジ付きの方式を使います。EdDSA はこの考え方をアルゴリズムに組み込んでおり、Ed25519 の nonce は、秘密鍵から導いた値の半分とメッセージに対する SHA-512 です(RFC 8032 §5.1.6)。nonce 再利用チェッカーは、署名の集合の中で繰り返し現れる r の値を探します。

署名以外では、「nonce」は一度だけ使われる値全般を指します。AES-GCM の 96 ビットの IV、OpenID Connect の nonce クレーム、ACME の Replay-Nonce ヘッダーなどです。これらに必要なのは一意性と新しさであり、秘密性は必要ありません。署名の nonce は、その両方を必要とする点で特殊です。

規格と参考文献

すべての用語