ブロックチェーン/レベル II · 仕組み/2.1 暗号技術/レッスン 4
デジタル署名:ECDSAとSchnorr
鍵を明かさずに支出を認可する数学的なハンドシェイク
用意するものウィットネスデータを表示するブロックエクスプローラー比較用の、ネイティブSegWitの支出1件とTaprootキーパスの支出1件
問い
- 署名は、秘密の数値を明かすことなく、その管理権をどのように証明するのでしょうか?
- ソニーのPlayStation 3や複数のAndroid向けビットコインウォレットは、なぜ再利用された、あるいは予測可能なノンスによって鍵を失ったのでしょうか?
- ECDSAと比べて、Schnorr署名がより小さく高速で、集約も可能なのはなぜでしょうか?
探究
- デジタル署名は、秘密鍵を明かすことなくその所有権を証明するものです。ビットコインでは、トランザクションアウトプットを使用するには、そのアウトプットのロッキングスクリプトに記載されている公開鍵に対応する秘密鍵を使ってトランザクションハッシュに署名する必要があります。この署名は、公開鍵とメッセージハッシュを用いることで誰でも検証可能です。この仕組みにより、プライバシーを保ちつつ、鍵の持ち主のみが送金を承認できるようになっています。
- ANSI X9.62(1999年)で標準化されたECDSAは、2009年以来ビットコインの主要な署名方式です。メッセージハッシュと秘密のノンスkから、値の組(r, s)を生成します。rは点k·Gのx座標で、sはk⁻¹(hash + x·r) mod nです(xは秘密鍵)。署名ごとに新しいランダムなkが必要なため、kを再利用したり漏らしたりすると、攻撃者は秘密鍵を直接計算できてしまいます。
- 2010年、fail0verflowはソニーがすべての署名に同じノンスを再利用していたことを実証し、PlayStation 3の署名鍵が破られました。2013年8月には、AndroidのSecureRandomの欠陥が予測可能なノンスを生成したことにより、ビットコインでも同様の盗難が発生しました。RFC 6979(2013年)は、秘密鍵とメッセージハッシュからkを決定的に導出することでこの問題を解決し、外部の乱数源への依存をなくしました。
- ECDSA署名には展性(マリアビリティ)があります。あるrに対して、有効なsの値が2つ(sとn−s)存在します。第三者は等価な署名に差し替えることで、トランザクションを無効にすることなくそのIDを変更できます。ビットコインのポリシーでは「low-S」正規化が求められ、sは曲線の位数の下半分に制限されます。この制約により、各メッセージにはノンスごとに正規の署名が1つだけ存在することになります。
- Schnorr署名は、Claus-Peter Schnorrが特許を取得し(米国特許は1991年に成立、2008年に失効)、ビットコイン向けにはBIP340で標準化されたもので、DERエンコードのオーバーヘッドなしに固定長64バイトの署名を生成します。Schnorr署名は線形であり、慎重に設計されたプロトコルを用いれば、複数の公開鍵を1つの集約鍵に、その署名を1つの署名にまとめることができます。これにより、オンチェーンでは単一署名者のアウトプットに見えるMuSig2マルチシグ方式が可能になり、トランザクションサイズの削減とプライバシーの向上につながります。
- Taprootは2021年11月(ブロック709,632)に有効化され、P2TRアウトプットでSchnorr署名がネイティブにサポートされるようになりました。キーパス支出ではウィットネスに64バイトの署名だけがあればよく、P2WPKHの支出で必要となる71〜72バイトのECDSA署名と33バイトの公開鍵に比べて小さく済みます。固定サイズであるため解析が簡単になり、さらにSchnorrではバッチ検証、つまり異なる鍵による多数の署名を1つずつ検証するよりも高速にまとめて検証することが可能です。ただし、この機能はBitcoin Coreではまだ使われていません。
重要な事実
- ECDSA(ANSI X9.62、1999年)はDERエンコードされた約71〜72バイトの署名を生成し、Schnorr(BIP340)は固定長64バイトの署名を生成します。
- ECDSAのノンスkを再利用または漏洩すると、秘密鍵が明らかになります。例:ソニーPS3(2010年)、Androidウォレットの盗難(2013年8月)。
- RFC 6979では、乱数ジェネレータに依存することなく、秘密鍵とメッセージのハッシュ値からkを決定的に導出します。
- ECDSA署名には展性があり、ビットコインのポリシーは正規のエンコーディングを保証するために「low-S」を強制しています。
- Schnorr署名は線形であり、鍵と署名を集約(MuSig2)したり、効率化のためにバッチ検証したりできます。
- 2021年11月(ブロック709,632)にTaprootが有効化され、P2TR出力向けのネイティブなSchnorr署名サポートが導入されました。
演習 九・六・三・一
9集めるデジタル署名方式または鍵の種類を9つ挙げてください。標準化団体、年、出力サイズ、および集約をサポートしているかどうかについても記載してください。
6まとめる9つを検証の複雑さによって6つに分類してください:固定長・線形、可変長・展性あり、可変長・正規形、バッチ検証可能、単一当事者のみ、ハイブリッド。
3絞り込む6つを、署名サイズ、プライバシー、計算効率の間にある3つの核心的なトレードオフに絞り込んでください。
1結晶化するデジタル署名が鍵の管理について何を保証し、何を明かさないのかを、1文で述べてください。
事実確認
日付、数字、主張は、下記に記載された公表資料と照合して確認しました。
- BIP340: Schnorr Signatures for secp256k1 (P. Wuille, J. Nick & T. Ruffing, 2020)
- RFC 6979: Deterministic Usage of DSA and ECDSA (T. Pornin, 2013)
- A. M. Antonopoulos & D. A. Harding, Mastering Bitcoin, 3rd ed. (2023)
- fail0verflow, 'Console Hacking 2010: PS3 Epic Fail', 27C3 (December 2010)