ECDSAとtryRecoverの原理
ECDSA と tryRecover の数学的な原理
ブロックチェーンやウォレットでおなじみの「署名」は、ECDSA(楕円曲線デジタル署名)で作られています。この記事では、なぜ秘密鍵の持ち主にしか署名が作れないのか、そして署名とメッセージから公開鍵(アドレス)を復元できるのかを、数式を交えて説明します。イーサリアムや Solidity の ecrecover / ECDSA ライブラリの「復元」の裏側にある式も扱います。
前提:楕円曲線と「片方向」の関係
ECDSA は楕円曲線上の演算を使います(イーサリアムでは secp256k1)。
- 曲線上に基準点
が 1 つ固定されているG -
秘密鍵
は、非常に大きなランダムな整数(256 ビット程度)d -
公開鍵
は、Q で定まる曲線上の点(Q = d \cdot G は\cdot のスカラー倍)G
重要な性質
-
からd は容易に計算できる(Q をG 回「足す」だけ)d -
からQ を求めることは、現実的な時間では不可能と信じられている(楕円曲線の離散対数問題)d
つまり「秘密鍵 → 公開鍵」は一方向。この一方向性が、「本人だけが署名できる」仕組みの土台です。
署名(sign)で何を計算しているか
メッセージのハッシュを
ステップ 1・2:乱数と点 R
-
乱数
を 1 つランダムに選ぶ(毎回異なるk が望ましい)。k は曲線の位数k より小さい正の整数。n - 曲線上の点
を計算し、R = k \cdot G のR 座標をx で割った余りをn とする。これが署名のr 。r
ステップ 3:s の定義
| 記号 | 意味 |
|---|---|
|
|
|
| メッセージのハッシュ(32 バイトを整数とみなす) | |
| 上で求めた |
|
| 秘密鍵 | |
| 楕円曲線の位数(secp256k1 では約 |
この式に秘密鍵
署名の形:(r, s, v)
署名は
-
:点r のR 座標x (32 バイト)\bmod n -
:上記の式で決まるs 以上0 未満の整数(32 バイト)n -
(復元用):楕円曲線ではv 座標がx の点はr 座標の正負で 2 つある。署名時に使った点y はそのどちらか一方なので、復元側は「どちらのR = k \cdot G か」を指定する 1 ビットの情報が必要。それがR (イーサリアムでは 27 または 28 がよく使われる)v
復元(recover / tryRecover)で何をしているか
受け手が持っているのはメッセージハッシュ
復元の式の導出
署名の式
-
両辺に
を掛ける:k
k \cdot s \equiv z + r \cdot d \pmod{n} -
について解く:k
k \equiv s^{-1}(z + r \cdot d) \pmod{n} -
署名時に
だったので、R = k \cdot G
R = k \cdot G = s^{-1}(z + r \cdot d) \cdot G = s^{-1} \cdot z \cdot G + s^{-1} \cdot r \cdot d \cdot G
ここで なので、Q = d \cdot G
R = s^{-1} \cdot z \cdot G + s^{-1} \cdot r \cdot Q -
両辺に
を掛ける(点のスカラー倍):s
s \cdot R = z \cdot G + r \cdot Q -
について解く:r \cdot Q
r \cdot Q = s \cdot R - z \cdot G -
の逆数r を掛ける:r^{-1} \pmod{n}
Q = r^{-1} \cdot (s \cdot R - z \cdot G)
ここで
公開鍵 Q を求める式(まとめ)
| 記号 | 意味 | 復元時に分かっているか |
|---|---|---|
|
|
✓ |
|
| 署名の |
✓ 署名に含まれる | |
| 曲線上の点。 |
|
|
| メッセージハッシュ | ✓ 受け手が持っている | |
| 曲線の基準点(固定) | ✓ 曲線の仕様で決まっている |
手順の整理
-
の決定:R 座標がx である曲線上の点は、r \pmod{p} 座標の正負で 2 つある。y でそのどちらかを選ぶ(署名時に使ったv の点)。R = k \cdot G -
:点s \cdot R のスカラー倍R -
:基準点z \cdot G のスカラー倍G -
:2 つの点の引き算(楕円曲線の演算)s \cdot R - z \cdot G -
:その結果の点を、整数r^{-1} \cdot (s \cdot R - z \cdot G) でスカラー倍したものが公開鍵r^{-1} \pmod{n} Q -
アドレス:
の座標Q から、イーサリアムの慣習(keccak256 など)でアドレスを導出する(x, y)
秘密鍵 ecrecover)で「誰が署名したか」を復元するときの数学的な中身です。
なぜ「改ざんや別人の署名」だと復元が合わないか
-
メッセージを 1 ビットでも変える → ハッシュ
が変わる → 署名z は「別の(r, s) 」用のものになる → そのz とz から復元する公開鍵は、元の署名者の公開鍵と一致しない(または復元が失敗する)。(r, s) -
別人の秘密鍵で署名した →
にはその人の(r, s) が込められている → 復元される公開鍵は「その別人」のもの。d
つまり「正しいメッセージ・正しい署名者」のときだけ、復元されたアドレスが期待した署名者と一致します。
まとめ(数学的な流れ)
| 段階 | 数学的な意味 |
|---|---|
| 鍵の関係 | 秘密鍵 |
| 署名 | メッセージ |
| 復元 |
|
ECDSA は楕円曲線の離散対数問題に基づいて「秘密鍵の持ち主だけが署名を作れる」性質を実現し、tryRecover は署名とメッセージから公開鍵を一意に復元することで「誰の署名か」を判定しています。
Discussion