Pebble Coding

ソフトウェアエンジニアによるIT関連技術の備忘録

secp256k1仕様

secp256k1に関するメモです。 後ろから二番目のkは数学者Neal Koblitzのkらしいです。

曲線

 {y}^2 = {x}^3 + 7

素数

 p = {2}^{256} - {2}^{32} - 977
= 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F
= 115792089237316195423570985008687907853269984665640564039457584007908834671663
256ビット、10進で78桁

ベースポイント:

Bx = 0x79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
= 55066263022277343669578718895168534326250603453777594175500187360389116729240
256ビット、10進で77桁

By = 0x483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
= 32670510020758816978083085130507043184471273380659243275938904335757337482424
256ビット、10進で77桁

ベースポイントの位数(=素数)

L = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
= 115792089237316195423570985008687907852837564279074904382605163141518161494337
256ビット、10進で78桁

ゼロ点は無限遠点(O)となる。
python実装上は、無限遠点はx=0, y=0で表現する。

BをL倍すると最初に無限遠点になる。
 L * G = O
コファクターは1なので、Lがこの曲線上の有理点の数(無限遠点を含む)である。

 点P( x_1, y_1)と点Q(x_2, y_2)の加法公式

1) PとQのどちらかが無限遠点の場合、加算結果はもう片方の点。

2) Qが-Pと等しい、つまり x_1 = x_2, y_1 = -y_2の場合、加算結果は無限遠点。

3) PとQが同一点で y=0の場合、曲線の接線は垂直線になるので、加算結果は無限遠点。

4) PとQが同一点でy \ne 0の場合、次の2倍公式。
 x_3 = {\nu}^{2} - 2 x_1
 y_3 = {\nu} ( x_1 - x_3 ) - y_1
 {\nu} = \frac {3 {x_1}^{2} } {2 y_1}

5) 上記以外( x_1 \ne x_2)は次式。
 x_3 = {\lambda}^{2} - (x_1 + x_2)
 y_3 = {\lambda} (x_1 - x_3) - y_1
 {\lambda} = \frac {y_1 - y_2} {x_1 - x_2}

参考

Recommended Elliptic Curve Domain Parameters
http://www.secg.org/SEC2-Ver-1.0.pdf

X9.62-1998 Draft
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.202.2977&rep=rep1&type=pdf

python implementation
https://github.com/warner/python-ecdsa