上級 レッスン3 読了4分

スカラー乗算と離散対数

kGを計算するのは簡単です。kGからkを見つけることが、すべての安全性が依存する問題です。

ジェネレーターを自分自身に13回足すことは、12回の加算を必要とするように思えますが、実際には5回で済みます。そして、77桁の数に対してそれを行うには、400回未満の操作が必要です。この短縮がBitcoinを可能にし、逆方向に同等の短縮がないことが安全性をもたらします。

この方法は「ダブル・アンド・アッド」と呼ばれ、数を2進数で読むことがレシピです。13は2進数で1101です。左のビットから始め、手元に点Gを持ちます。次のビットごとに、持っているものを倍にします。ビットが1なら、倍にした後にGを加えます。2番目のビットは1です:2Gに倍にして、3Gに加えます。3番目は0です:6Gに倍にして、それ以上は何もしません。4番目は1です:12Gに倍にして、13Gに加えます。3回の倍加と2回の加算で到達します。

256ビットの数の場合、最大256回の倍加と平均128回の加算が必要です。力ずくで行うと、このページに収まらない数が必要ですが、400回未満の操作で済みます。これは等比数列の経済性と同じです:少ない倍加で、常に加算することでは到達できないところに到達します。

8回の倍加は、200枚の紙を1枚ずつ積み重ねるよりも遠くに行きます。

ただし、このレシピをそのまま書くと重大な欠陥があります。それは数学の問題ではありません。ビットが1の場合、倍加と加算が必要ですが、ビットが0の場合、倍加だけが必要です。したがって、機械がかかる時間は秘密鍵のビットに依存します。この時間を正確に測定できる人、または計算中のデバイスのエネルギー消費を測定できる人は、何も壊さずに鍵を読み取ることができます。

各回の時間を聞く人は、メカニズムを見ずに秘密を発見します。

そのため、どの真剣な実装もこの素朴なレシピを実行しません。Bitcoin Coreが使用するライブラリ、libsecp256k1は、鍵に関係なく全く同じ時間がかかる操作のシーケンスを実行し、ビットが0の作業も行います。これを「定数時間」と呼び、よく作られたハードウェアウォレットと飾りの違いです。

次は逆の道です。点kGが与えられ、出発点がGであることがわかっている場合、kは何でしょうか?この問題には名前があります — 離散対数 — そして、グループのサイズの平方根よりも良い一般的な解決策はありません。この平方根に到達する2つの方法は、メモリを時間に交換するベビーステップとジャイアントステップ、およびほとんどメモリを使用せずに並列化が得意なPollardのρです。これらの2つは次のモジュールのテーマです。

2^256の平方根は2^128で、これは34に37個のゼロが続く数です。寛大に計算する価値があります。Bitcoinネットワークの全計算能力、約1セクスティリオンの操作毎秒がこれに向けられたと仮定し、これらの操作のそれぞれが曲線上の操作であると仮定します — これは何桁も間違っていますが、曲線上の操作はハッシュよりも数千倍のコストがかかります。この想像上の利点があっても、スキャンには約100億年かかります。実際のコストの違いを修正すると、10^14年の範囲に達します:宇宙の年齢の約1万倍です。

放すのは1秒。集めるには誰も持っていないロープが必要です。

次のモジュールのために1つのフレーズを覚えておいてください。これは高価な誤解を避けるためです。この計算は、全範囲でランダムに選ばれた鍵に対して有効です。ブロックチェーンに存在するチャレンジやこのサイトが構築するものは、2^256や2^128を攻撃するのではなく、70または80ビットの意図的に小さな範囲を攻撃します。ここで同じ平方根が実際のプロジェクトに収まる数を返します。数学は弱くなりません。範囲が小さくなるのです。

Bitcoinの暗号化を完成させるために必要なピースが1つあります:これらの点と数がどのように署名になり、なぜ検証が機能するのかです。次のレッスンでは、ECDSAをステップバイステップで計算します。