pythonで ECDSAのsecp256k1曲線を用いて秘密鍵を作りそこから公開鍵を算出する

技術メモ

今回は ECDSAのsecp256k1曲線を用いて秘密鍵を作りそこから公開鍵を作成してみる。

ECDSA

wikipediaより

ECDSAを使うと以下ができる
– 秘密鍵とデータで署名を作成する
– 署名とデータと公開鍵で、紐づく秘密鍵で署名したか検証する

secp256k1

bitcoin wikiのページ
ビットコインが使用する楕円曲線の方程式と、定数を定めた曲線。

以下ソースと bitcoin wiki のページを見比べてもらった方が早い。

pycoinのsecp256k1の定義ソース
https://github.com/richardkiss/pycoin/blob/64cc393e084e7ee15631130fa6ca5e4999093084/pycoin/ecdsa/secp256k1.py

from .ellipticcurve import CurveFp, Point

# Certicom secp256-k1
_a = 0x0000000000000000000000000000000000000000000000000000000000000000
_b = 0x0000000000000000000000000000000000000000000000000000000000000007
_p = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f
_Gx = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
_Gy = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8
_r = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141

generator_secp256k1 = Point(CurveFp(_p, _a, _b), _Gx, _Gy, _r)

CurveFp というクラスで楕円曲線を扱ってる。

https://github.com/richardkiss/pycoin/blob/64cc393e084e7ee15631130fa6ca5e4999093084/pycoin/ecdsa/ellipticcurve.py#L48

class CurveFp(object):
    """Elliptic Curve over the field of integers modulo a prime."""
    def __init__(self, p, a, b):
        """The curve of points satisfying y^2 = x^3 + a*x + b (mod p)."""
        self.__p = p
        self.__a = a
        self.__b = b
  :
  :

秘密鍵作成〜公開鍵を算出

https://github.com/richardkiss/pycoin/blob/7fd2eed8491d85ad1b609734b9e4963aa32e9943/tests/key_test.py#L10

    def test_sign_verify(self):
        secret = 1
        private_key = Key(secret_exponent=1)
        h = b"x00" * 32
        sig = private_key.sign(h)
        self.assertTrue(private_key.verify(h, sig))
        public_key = private_key.public_copy()
        self.assertTrue(public_key.verify(h, sig))
        h160_key = Key(hash160=private_key.hash160())
        self.assertTrue(h160_key.verify(h, sig))

のあたりを参考にする。

秘密鍵作成

>>> from pycoin.key import Key
>>> private_key = Key(secret_exponent=1)
>>> private_key.as_text()
u'KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn'

ECDSAのsecp256k1曲線を用いているか?

https://github.com/richardkiss/pycoin/blob/master/pycoin/key/Key.py#L67
のあたりでECDSAの範囲内かチェックしているので、対応していると思われる。

secret_exponentを指定してKeyを作成するとwifフォーマットのhashがかえる。
https://github.com/richardkiss/pycoin/blob/master/pycoin/key/Key.py#L206

Keyクラスに渡している secret_exponent は乱数で本来なら生成しなければいけなさそう?
secret_exponentをseedに鍵をつくってる?

公開鍵を算出

>>> public_key = private_key.public_copy()
>>> public_key.as_text()
u'0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'
Sponsored Link

ビットコイン(Bitcoin)、イーサリアム(Ethereum)、リップル(Ripple)、ネム(NEM)などの仮想通貨を買うならZaifがおすすめです。

特に国内でETHを購入するなら、アルトコインでも板取引に対応しているZaif(ザイフ)が割安なのでよいですよ。

コメントはまだありません

コメントを残す

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

CAPTCHA


Ethereum(イーサリアム)
Ethereumの開発用ツールリストが公開されていた!

ALISのCTO石井さんがつぶやいてたんですが とてもありがたい #Ethereum 開発ツールの一 …

技術メモ
Counterpartyの環境構築が大変という話

暗号通貨の独自通貨を作ろうとするとEthereumが有名で簡単ですが、BitcoinでもCounte …

Ethereum(イーサリアム)
Error: The contract code couldn’t be stored, please check your gas amount.

ALISのICOソースのzeppelinバージョンを1.2から1.8にあげようとしたときにはまったエ …