btc: 秘密鍵の最小値
2025/04/22
調べごとをしていて Bitcoin の秘密鍵(secp256k1上)の上限・下限が気になった。
中途半端な値だったような記憶があるがまったく覚えてない。
下限は 1
なの?
そうだっけ??
こういうのは自分で確認せねば。
/** Verify an elliptic curve secret key.
*
* A secret key is valid if it is not 0 and less than the secp256k1 curve order
* when interpreted as an integer (most significant byte first). The
* probability of choosing a 32-byte string uniformly at random which is an
* invalid secret key is negligible. However, if it does happen it should
* be assumed that the randomness source is severely broken and there should
* be no retry.
*
* Returns: 1: secret key is valid
* 0: secret key is invalid
* Args: ctx: pointer to a context object.
* In: seckey: pointer to a 32-byte secret key.
*/
下限は “not 0” なので 1
ですな。
上限は “less than the secp256k1 curve order” なので下リンクの “order n of G” から 1を引いた FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364140
、でよいのかな。
チェックは関数にお任せするのだが、OP_CAT
のことを調べていて k
と x
を 1
にするとあったので下限が気になったのだ。
サンプルスクリプトは OP_CHECKSIG
で終わるけどそうするとスタックに True/False
が残るんじゃないっけ?
みたいなことも気になった。
どのサイトも OP_CHECKSIG
で終わるスクリプトで <s>
しかスタックに残らないって書いてるのよね。
btcdeb --allow-disabled-opcodes
で OP_CAT
を動かしてみたけど、シュノア署名できるライブラリが libsecp256k1
しか扱いきらんので最後までできんちゃんねー。
まあ、スタックに与えた数値も適当だし。
$ btcdeb --verbose --allow-disabled-opcodes '[OP_2DUP OP_CAT OP_ROT OP_DUP 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 OP_EQUALVERIFY OP_CHECKSIG]' 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 0x69BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
.....
.....
.....
#0006 OP_CHECKSIG
btcdeb>
EvalChecksig() sigversion=0
Eval Checksig Pre-Tapscript
error: Non-canonical DER signature