イントロダクション(p67)

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

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

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

秘密鍵と公開鍵

 秘密鍵は16進数の数値です。ビットコインの秘密鍵にあまり厳格な制限はなく、512ビット(128文字)でも128ビット(32文字)でもいいのですが、256ビット(64文字)の秘密鍵が最も一般的なようです。
この秘密鍵から楕円曲線上のスカラー倍算を使って公開鍵(K)を生成し、さらに一方向ハッシュ関数を使ってビットコインアドレスを生成しています。
以下の図は秘密鍵、公開鍵、ビットコインアドレスの関係になります。

楕円曲線暗号

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

\[
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\)という一方向でのみ導出ができます。
この性質のため、秘密鍵から公開鍵を求め、そこからビットコインアドレスは生成できるが、逆のビットコインアドレスから秘密鍵を得ることができなくなっています。

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

◯参考

コメントを残す

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