楕円曲線暗号を用いたSecp256k1
楕円曲線暗号
楕円曲線を用いて暗号化することを、楕円曲線暗号(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()
bitcoinでは
p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
で求められる点のどれか一つが公開鍵になります。