hiro99ma blog

Something technical

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 のことを調べていて kx1 にするとあったので下限が気になったのだ。

サンプルスクリプトは OP_CHECKSIG で終わるけどそうするとスタックに True/False が残るんじゃないっけ? みたいなことも気になった。 どのサイトも OP_CHECKSIG で終わるスクリプトで <s> しかスタックに残らないって書いてるのよね。

btcdeb --allow-disabled-opcodesOP_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

 < Top page


コメント(Google Formへ飛びます)

GitHub

X/Twitter

Homepage