Pebble Coding

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

secp256k1 ECDSA 秘密鍵の値の範囲と公開鍵の値の範囲

ECDSA の秘密鍵は1以上、群Gの位数未満です。 secp256k1 の群Gの位数は
L = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
ですが、256bitの正の値skをランダムに取り(0以上 {2}^{256}-1)、値が0だった場合と、L以上だった場合、値を取り直せばよい事になります。
sk=0の場合は、公開鍵が0になってしまい、秘匿性がなさすぎます。
skがLと{2}^{256}-1の間の値でも公開鍵は計算できますが、
同じ公開鍵  sk \cdot G = Aに対して、
 (sk - L) \cdot G = Aが成り立ち、sk - L も秘密鍵となり、1つの公開鍵に対する秘密鍵が2つ出来てしまい、マズイです。

ビットコインのsecp256k1 ライブラリでは、
関数 secp256k1_ec_pubkey_create()にこの範囲外の値を渡すと、戻り値としてエラーを返すようになっています。
公開鍵は当然ながら1以上L未満の値となります。