中級 レッスン2 読了4分

秘密鍵から公開鍵へ:曲線secp256k1

公開鍵は、固定点によって掛け算された秘密鍵です。行きはミリ秒の単位でかかりますが、帰りは世界中の誰もできません。

多くの人は、秘密鍵と公開鍵をペアの2つの半分として、一緒に同時に生成されるものと想像しています。しかし、実際にはそうではありません。存在するのは1つの数字だけであり、それが秘密鍵です。公開鍵はその上に計算されるもので、秘密鍵を持っている人は、公開鍵をミリ秒で計算できますが、その逆を誰も行うことはできません。

秘密鍵は単なる整数であり、それ以上でもそれ以下でもありません。1から2^256の少し下の限界までの数字です。登録もなく、サーバーもなく、発行する権威もありません。この範囲内の数字をランダムに選ぶことができれば、それだけでウォレットを持つことになります。前のモジュールで、「鍵を持っている人がコインを動かす」と繰り返し述べたのはこのことです。

この数字を公開鍵に変えるのは、曲線上で行われる操作です。Bitcoinの曲線はsecp256k1と呼ばれ、その方程式は1行に収まります: y² = x³ + 7。この描画は学校の教科書にあるような滑らかなアークではありません。座標は有限体内の整数で、pは2^256から2^32と977を引いたものです。このグラフは点が散らばった雲のようで、この雲の算術は上級コースのテーマです。ここでは1つのルールだけを知っておけば十分です。

そのルールとは、曲線上の2つの点を足すと、同じ曲線上の3つ目の点が得られるというものです。2つの点を通る直線を引き、その直線が曲線と3回目に交わる点を見つけ、その交点を軸の反対側に反射させます。結果は常に曲線上にとどまります。

出発点として、Gという点があります。これはあなたやあなたのウォレットが選ぶものではなく、標準に書かれており、ブロックジェネシス以来、すべてのBitcoinウォレットに共通の点です。

みんな同じ石から始まります。鍵を区別するのは、そこから何歩進んだかです。

あなたの公開鍵は、Gをあなたの秘密鍵の値だけ何度も足したものです。もし秘密鍵が数字kであれば、公開鍵は点kGです。これは点を数で掛ける操作で、スカラー乗算と呼ばれます。

Gをそのままの大きさで一度ずつ足していくと、宇宙の年齢を超える時間がかかりますが、それでも計算は瞬時に行われます。トリックは、足す代わりに倍にすることです。点を自分自身に足すと2進み、倍にすると4進み、再び倍にすると8進みます。256回の倍加といくつかの加算で、範囲内のどの点にも到達できます。

逆方向にはトリックはありません。点kGが与えられ、出発点がGであることがわかっている場合、kを見つけるのは離散対数問題です。40年間の試行の後、知られている最良の方法でも2^128ステップが必要です。レッスン5ではこの数字を測定します。今のところ重要なのは非対称性の形です。一方向は簡単で、逆方向は不可能であること、前のレッスンのハッシュ関数のように — ただし、ここでは逆側にあるのはファイルではなく、あなたのお金です。

ショットを繰り返すのは簡単です。ボールが止まっているのを見て、何回ショットがあったかを言うことは誰にもできません。

曲線の選択は当時は奇妙でした。secp256k1は2000年にSECGによって公開され、カナダの企業Certicomに関連するグループで、ほとんど誰も使用していませんでした。世界はアメリカのNISTのP-256を使用していました。Satoshiはあまり使われていない方を選びました。secp256k1のパラメータは、何かを隠すにはあまりにも単純です — 方程式のゼロと7、2^256のすぐ下のp — 一方、P-256のパラメータは説明されていない定数から来ています。2013年、Edward Snowdenによって漏洩された文書は、NSAが同じファミリーの別の標準であるDual_EC_DRBGを弱体化させるために1000万ドルを支払ったことを示しました。P-256に対して何かが証明されたことはなく、今日でもそれを擁護する暗号学者がいますが、2008年の選択が良い方向に進んだと言えるでしょう。

ここから最も実用的な結果が生まれます: 秘密鍵は生まれた場所から決して出る必要がありません。デバイスはそこから公開鍵を計算し、公開鍵が移動します — ネットワークが見るのは公開鍵であり、あなたのアドレスのレシピに入るのも公開鍵です。ハードウェアウォレットはこの非対称性のために存在し、数字を保持し、点を提供します。

マトリックスは作業台に固定されており、ドアから出るのはそれが作り出した印刷物です。

誰かに支払いを依頼するときに送るのは公開鍵ではありません。もっと短いチェーンであり、誤った文字を拒否するメカニズムをまだ持っています。次のレッスンでは、アドレスがバイトごとに構築される様子を見ていきます。