楕円曲線暗号

楕円曲線を用いて暗号化することを、楕円曲線暗号(Elliptic Curve Cryptography:ECC)と呼びます。
bitcoinではこの暗号方式を用いることで秘密鍵から公開鍵を生成します。
また楕円曲線暗号を使用して電子署名がされる一連の流れは「楕円曲線電子署名アルゴリズム」と呼ばれています。
これはその名の通り、電子署名アルゴリズム(Digital Signature Algorithm:DSA)において楕円曲線暗号を用いるものであり、bitcoinの電子証明にも利用されています。

Secp256k1

簡単に言ってしまえば点の集合です。どんな点の集合かと言いますと、以下の式に従う点の集合です。

y^2 = x^3 + 7 mod 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1

どのような点の集合になるか実装してみました。

"""
Python 3.5.4 :: Anaconda, Inc
"""
import math
import numpy as np
from matplotlib import pyplot as plt

p = 17

xlist = []
ylist = []

for x in range(1,p+1):
    for y in range(1,p+1):
        if (((x**3 + 7 - y**2) % p) == 0):
            xlist.append(x)
            ylist.append(y)


plt.plot(xlist, ylist, ".")

plt.title('Secp256k1 Graph (p = 17)')
plt.xlabel('X-Axis')
plt.ylabel('Y-Axis')

plt.show()

img-01 img-02 img-03

bitcoinでは

p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1

で求められる点のどれか一つが公開鍵になります。