ECDSA署名について学ぶ
事前の単語知識
Bitcoin の通常の2-of-2マルチシグ
Bitcoinを使用するための複数人の署名が必要な仕組み
scriptPubKeyに複数人の公開鍵がセットされていれば、Transactionを行う際に、それぞれの秘密鍵をセットする必要がある
ECDSA の署名
登場するもの
生成方法
- ランダムなnonce(Transactionごとに生成されるもの)を選択
- k を秘密鍵とした楕円曲線上の点 R = kGを計算する
- 点Rのx座標をrとする
- s = H(m) + rx / k
- 算出される (r, s) がECDSAの署名データになる
両方を合わせると73バイトくらいにデータになる
検証方法
Rx = H(m) + rx + Gs / s
ECDSAでマルチシグを構成するポイント
生成された値 (r, s)の内、秘密鍵を使った計算をするのはs
s = H(m) + rx / k
秘密鍵xを2者の秘密鍵から算出する値にすると、署名は単一になるが、2者の秘密鍵を必要とするマルチシグを構成できる
両者は それぞれの秘密鍵の内容を明示してはいけない
コインのロック
登場するもの
A の 公開鍵 P1 秘密鍵 x1 B の 公開鍵 P2 秘密鍵 x2
A と Bはそれぞれ 公開鍵を共有し、新規の公開鍵 P と nonce R を生成する これを用いて、2者間でのロックをすることができる
これをアンロックするには、 s = H(m) + r(x1 x x2) / k1 x k2 を計算する必要がある
秘密計算で署名データを計算
- AはPaillier暗号用のキーペアを生成(private, public) Paillier暗号は加法準同型性がある暗号スキーム
- publicを使って、Aの秘密鍵 x1 を暗号化し、publicと一緒に Bに送信
- Bは c1 = Enc(H(m) / k2) c2 = Enc(x1) ⊙ rx2 / k2 c3 = c1 ⊕ c2 を行い public を暗号化
- Aはc3を復号して、 s` = H(m) + r(x1 x x2) / k2 を算出
- s` / k1 で必要署名のsが取得できる