ウォレットの秘密鍵を公開鍵から割り出すのはどれだけ難しい?
注意:数学っぽい話です。
暗号資産のウォレットアドレスに紐付いている秘密鍵は絶対に漏洩させてはならない。秘密鍵は金庫の鍵のようなもの。
これが他人にバレるとアドレスに紐づく資産を盗まれてしまう。
ビットコインブロックチェーンの場合、秘密鍵の実態は32バイトの乱数であることが一般的。
32バイトの乱数は例えば以下のような数である。(16進数表記)
a1afbc715bd4490a7e909436bf15672871306f5b0b1608230e7b440bd655c9bb
これが秘密鍵の実態である。(16進数64桁の数)
この数字がバレてはいけない。
ビットコインブロックチェーンの公開鍵は、秘密鍵から楕円曲線暗号という暗号化方式を使って生成される。
公開鍵はその名の通り公開されているため誰でも見ることができるが、公開鍵から秘密鍵を計算することは非常に困難である。
公開鍵はざっくりいうと、ビットコインブロックチェーンにおいて定められている定数Gを秘密鍵の数だけ足し合わせた値となる。
式で簡単に書くと
A(公開鍵) = G(定数) x B(秘密鍵)
となる。
これだけ見るとA(公開鍵)をG(定数)で割ればB(秘密鍵)が計算できるではないかと思うが、実際は楕円曲線上の演算なのでそう簡単にはいかない。
ではどうやったら秘密鍵を公開鍵と定数から求められるかというと、実際にGを1回ずつ足していき、その結果がA(公開鍵)と一致するかどうか確かめていくしか無いというのである。
G + G を求めた時、これがAの値と一致すれば秘密鍵は2であることが分かる。
一致しなかった場合は 2G + G を計算してAと一致するかどうか確かめる。一致すれば秘密鍵は3であると発覚する。
一致しなければ 3G + G を・・・・
というように1回ずつGの足し算をしていかなければならない。
(ちなみに、逆にB(秘密鍵)とGからA(公開鍵)を算出するのは容易に計算できる性質となっている。)
このように、秘密鍵の値が大きければ大きいほど秘密鍵の割り出しに時間がかかるということである。
秘密鍵は32バイトの整数である。
これは一体どれだけ大きい数値なのか。
ちなみに1000兆という数は、
1000000000000000
と記せる。
32バイトの数を馴染みのある10進数で書くと
10000000000000000000000000000000000000000000000000000000000000000000000000000
と記せる。
もはや億とか兆とかの次元ではない数であることが分かる。(ちなみに32バイトの数というのは地球上に存在する砂粒の数より多い数らしい。)
つまり公開鍵から秘密鍵を割り出すためには、1000兆なんてほぼゼロだと思えるような巨大な数だけGの足し算をする必要がある。
これは最新のコンピューターの演算でも現実的な時間で割り出すのは困難だと言われている。(数十年、数百年という単位だった気がする)(量子コンピューターとかだとどうなんだろう??)
公開鍵から秘密鍵を割り出すのは現実的な時間ではほぼ不可能であるということが分かった。
秘密鍵がたまたま小さい乱数だったら??
ふと思った。
秘密鍵は乱数なので、たまたま10とか100とかそういう小さい数を引いてしまったら簡単にバレてしまうのでは?
しかしよくよく考えたら1000兆という数ですら32バイトの数値にくらべるとほぼゼロのような数である。
これは乱数を決定する時に、1000兆以下の数を引き当てる確率もほぼゼロということになる。
つまり乱数をどう引いても十分に巨大な数になると言える。
この記事が気に入ったらサポートをしてみませんか?