ブロックチェーン/レベル II · 仕組み/2.1 暗号技術/レッスン 3
秘密鍵、公開鍵、secp256k1
整数、曲線、そして一方通行のドア
用意するものウィットネスデータを表示するブロックエクスプローラーA. M. アントノポロス&D. A. ハーディング著、『Mastering Bitcoin』第3版(2023年)、第4章
問い
- 点に数を掛ける計算はミリ秒で済むのに、それを逆算するには宇宙の年齢より長い時間がかかるのはなぜでしょうか?
- secp256k1は、他の大半のデジタル署名で使われているNIST曲線と、構造的に何が違うのでしょうか?
- 32バイトの値が、誰が管理しているかを明かすことなく数十億ドル規模の資産を制御できるのはなぜでしょうか?
探究
- ビットコインの秘密鍵は、1からn−1までのランダムな整数です。ここでnは曲線の生成点の位数です。nは約1.158 × 10^77という78桁の数で、観測可能な宇宙に存在する原子の推定数(約10^80)からそれほどかけ離れていません。公開鍵はスカラー乗算によって導出されます。つまり、この整数kを楕円曲線上の固定された生成点Gに掛けます。Gはすべてのビットコインユーザーに共通の定数なので、kが異なればそれぞれ曲線上の一意で決定的な点Kが得られます。
- secp256k1曲線は、p = 2^256 − 2^32 − 977の素数体上で、方程式y² = x³ + 7によって定義されます。この特定のパラメータセットは、CerticomによるSEC 2規格で定められたものです。2009年にsecp256k1が選ばれたのは異例でした。これはニール・コブリッツにちなんで名付けられたコブリッツ曲線で、その特殊な構造(効率的に計算可能な自己準同型)によってスカラー乗算を高速化できます。また、説明のないランダムシードから生成された曲線とは異なり、パラメータに隠れた選択が入り込む余地がほとんどありません。サトシ・ナカモトはこの選択理由を一度も説明していません。
- スカラー乗算が高速なのは、実装がダブル・アンド・アッド(倍算と加算)アルゴリズムを使い、秘密鍵の2進表現を1ビットずつ処理するからです。点の2倍算と別の点の加算は基本的な曲線演算で、コンピュータはマイクロ秒単位で実行します。しかし、この演算を逆にすること、つまりKとGからkを導き出すことは、楕円曲線離散対数問題(ECDLP)として知られています。secp256k1上のECDLPを効率的に解く古典アルゴリズムは知られておらず、鍵空間をブルートフォースで探索することは計算上不可能です。これにより、古典的な攻撃に対して約128ビットのセキュリティが得られます。
- 公開鍵は、保存や送信のために特定の形式でシリアライズされます。非圧縮の公開鍵は65バイトで、プレフィックス04の後にx座標とy座標が続きます。圧縮公開鍵は33バイトで、y座標の偶奇を示すプレフィックス02または03を使い、x座標だけから復元できるようにします。2021年11月に有効化されたTaprootは、x-only鍵と呼ばれるさらなる最適化を利用します。これは32バイトでプレフィックスを完全に省略しており、Schnorr署名方式の性質に依拠しています。
- 秘密鍵と公開鍵の関係は厳密に一方向性のものです。この曲線サイズでは離散対数問題が未解決のため、公開鍵を共有しても秘密鍵について何も明らかになりません。逆に、秘密鍵を持っていれば対応する公開鍵を即座に計算できます。この非対称性がビットコインの所有権モデルの基盤となっており、誰でも鍵自体を見ることなく、特定の秘密鍵によって署名が作成されたかどうかを確認することができます。
- これらの仕組みを確認するには、どのブロックエクスプローラーでも開いてトランザクションのインプットを探してください。ネイティブなSegWit(P2WPKH)方式の場合、ウィットネスには署名と33バイトの圧縮された公開鍵が含まれます。一方、Taprootキーパス方式の場合、32バイトの鍵はアウトプット自体に格納され、ウィットネスには署名のみが含まれます。これを前のアウトプットにあるアドレスと比較してみてください。アドレスは公開鍵のハッシュですが、支出時にはその生の鍵がここに表示されます。なお、公開鍵の座標は曲線上の点を表す16進数文字列であり、SegWitバージョン0のアドレスで使用される20バイトや32バイトのハッシュとは異なります。
重要な事実
- 秘密鍵は1からn−1までのランダムな整数です(n ≈ 1.158 × 10^77)。
- secp256k1は、素数体p = 2^256 − 2^32 − 977上のy² = x³ + 7によって定義されます。
- スカラー乗算k·Gによって公開鍵が得られます。その逆演算(ECDLP)は計算上不可能です。
- 圧縮されていない公開鍵は65バイト(プレフィックス04)、圧縮された鍵は33バイト(プレフィックス02/03)です。
- Taprootは32バイトのx-only鍵を使用し、y座標とプレフィックスを完全に省略します。
- secp256k1は、説明のつかないパラメータがほとんどないコブリッツ曲線で、2009年にサトシによって選ばれました。
演習 九・六・三・一
9集めるsecp256k1の特性を9つ挙げてください:方程式、体の素数、生成点の位数、鍵のサイズ(非圧縮/圧縮/x-only)、セキュリティレベル、規格の出自、曲線の種類、そして採用に関する2つの歴史的事実。
6まとめる9つを6つに分類してください:方程式と体、生成点と位数、鍵の形式、セキュリティレベル、規格の歴史、採用状況。
3絞り込む6つを、secp256k1がビットコインの所有モデルに適している3つの理由に絞り込んでください。
1結晶化する秘密の整数を公開点に変換する正確な数学的演算を一文で述べ、それを逆算することを妨げる問題の名前も挙げてください。
事実確認
日付、数字、主張は、下記に記載された公表資料と照合して確認しました。