Mastering Bitcoinの第4章を読み進めていきます。
P67のイントロダクションからP75の公開鍵生成までをまとめました。

 ビットコインの所有権はデジタル鍵ビットコインアドレスデジタル署名に基礎を置いてます。

 デジタル鍵は公開鍵暗号を用いて秘密鍵公開鍵と呼ばれるキーペアとして生成されます。
秘密鍵はビットコインを支払うためのトランザクションに署名するのに使用します(なので秘密鍵が第三者に漏れると自分のビットコインを使用されてしまいます)。
一方、公開鍵は誰にでも教えてもよいもので、ビットコインアドレスは多くの場合この公開鍵から生成されます。ビットコインアドレスはビットコインを受け取る時に使用します。

 この節では秘密鍵、公開鍵、ビットコインアドレスの生成の流れを見ていきますが、まずは公開鍵生成まで。

秘密鍵と公開鍵

 秘密鍵は16進数の数値です。ビットコインの秘密鍵を作るために、256ビットの数値をランダムに選び、多少の条件のもと、秘密鍵を作成します。
この秘密鍵から楕円曲線上のスカラー倍算を使って公開鍵(K)を生成し、さらに一方向ハッシュ関数を使ってビットコインアドレスを生成しています。
秘密鍵から公開鍵を生成する手法はRSAなど他にもいくつかありますが、比較的新しく強度の強い手法である楕円曲線暗号を使用します。

以下の図は秘密鍵、公開鍵、ビットコインアドレスの関係になります。

楕円曲線暗号

 楕円曲線は数学では以下の式で表されます。

\[
y^2 = x^3 + ax + b
\]

特に、ビットコインではsecp256k1曲線と呼ばれる関数を使用しており、
\(a\)と\(b\)をそれぞれ16進数で
\(a = \rm{0x0000000000000000000000000000000000000000000000000000000000000000}\)
\(b = \rm{0x0000000000000000000000000000000000000000000000000000000000000007}\)
として\({\rm mod}\ p\)をとった
\[
y^2\ {\rm mod}\ p = (x^3 + 7)\ {\rm mod}\ p
\]
で表されます。ただし\({\rm mod}\ p\)は素数\(p\)で割った余りを表し、\(p\)は
\[
p = 2^{256}\ -\ 2^{32}\ -\ 2^9\ -\ 2^8\ -\ 2^7\ -\ 2^6\ -\ 2^4\ -\ 1
\]
で表される、非常に大きな素数です(ちなみに16進数では\(\rm{0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F}\)となります)。

 楕円曲線自体は滑らかな曲線(下図)なのですが、整数で割った余りをとることで曲線状の任意の点は離散的な値になっています。
離散的な値にすることで離散対数問題となり、公開鍵から秘密鍵を求めることを非常に難しくしています。

 楕円曲線暗号は、この楕円曲線上の点に対する加法とスカラー倍算で表現される離散対数問題をもとにした非対称型演算を用いて行います。

 楕円曲線上の点に対しては足し算、引き算、かけ算、割り算に相当する演算を定義できます。
楕円曲線上にある2つの点\({\rm P}_1\)と\({\rm P}_2\)が与えられた時、3つ目の点\({\rm P}_3\ =\ {\rm P}_1\ +\ {\rm P}_2\)が楕円曲線上に存在します。幾何学的には\({\rm P}_3\)は\({\rm P}_1\)と\({\rm P}_2\)を通る直線が曲線上で交わる別の点をx軸に対して反転したところにある点として求めることができます。
楕円曲線暗号は曲線上のある決まった点\(G\)を出発して\(k\)回\(G\)を足す演算(スカラー倍算)を行います。
つまり\(K\ =\ k\ *\ G\)を求めます。
ビットコインでは生成元となる\(G\)は決まっており、その座標は
\(G_x = {\rm 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798}\)
\(G_y = {\rm 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8}\)
です。

この演算ですが、\(k\)と\(K\)の関係は固定されていますが、\(k\)から\(K\)という一方向でのみ導出ができます。
この性質のため、秘密鍵から公開鍵を求め、そこからビットコインアドレスは生成できるが、逆のビットコインアドレスから秘密鍵を得ることができなくなっています。

楕円曲線上のスカラー倍算を可視化すると以下の図のようになります。

◯参考

One thought on “【Mastering Bitcoin】秘密鍵から楕円曲線暗号を使って公開鍵を生成する

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です