Mi

日常をさらさらと

ECDSA署名について学ぶ

事前の単語知識

  • 2-of-2 2者間署名

  • マルチシグ マルチシグネチャビットコインを送付するための複数の署名が必要なこと 3つの秘密鍵の内、2つの鍵での署名が必要などなど

Bitcoin の通常の2-of-2マルチシグ

Bitcoinを使用するための複数人の署名が必要な仕組み

scriptPubKeyに複数人の公開鍵がセットされていれば、Transactionを行う際に、それぞれの秘密鍵をセットする必要がある

ECDSA の署名

登場するもの

生成方法

  1. ランダムなnonce(Transactionごとに生成されるもの)を選択
  2. k を秘密鍵とした楕円曲線上の点 R = kGを計算する
  3. 点Rのx座標をrとする
  4. s = H(m) + rx / k
  5. 算出される (r, s) がECDSAの署名データになる

両方を合わせると73バイトくらいにデータになる

検証方法

Rx = H(m) + rx + Gs / s

ECDSAでマルチシグを構成するポイント

生成された値 (r, s)の内、秘密鍵を使った計算をするのはs

s = H(m) + rx / k

秘密鍵xを2者の秘密鍵から算出する値にすると、署名は単一になるが、2者の秘密鍵を必要とするマルチシグを構成できる

x = Aの秘密鍵 x Bの秘密鍵

両者は それぞれの秘密鍵の内容を明示してはいけない

コインのロック

登場するもの

A の 公開鍵 P1 秘密鍵 x1 B の 公開鍵 P2 秘密鍵 x2

A と Bはそれぞれ 公開鍵を共有し、新規の公開鍵 P と nonce R を生成する これを用いて、2者間でのロックをすることができる

これをアンロックするには、 s = H(m) + r(x1 x x2) / k1 x k2 を計算する必要がある

秘密計算で署名データを計算

  1. AはPaillier暗号用のキーペアを生成(private, public) Paillier暗号は加法準同型性がある暗号スキーム
  2. publicを使って、Aの秘密鍵 x1 を暗号化し、publicと一緒に Bに送信
  3. Bは c1 = Enc(H(m) / k2) c2 = Enc(x1) ⊙ rx2 / k2 c3 = c1 ⊕ c2 を行い public を暗号化
  4. Aはc3を復号して、 s` = H(m) + r(x1 x x2) / k2 を算出
  5. s` / k1 で必要署名のsが取得できる