Secp256k1
secp256k1是比特币用于公钥密码学的一条标准化椭圆曲线,也是Standards for Efficient Cryptography Group在SEC 2中公布的域参数集之一。[1]
该曲线定义在模数为p = 2^256 − 2^32 − 977的素数域上,方程为y^2 = x^3 + 7。SEC 2还规定生成点G、它的素数阶n以及余因子1。这个名称指的是这些参数,而不是签名格式或编码。
域参数
按照SEC命名规则,sec表示该标准,p表示素数域曲线,256表示域大小,k表示与Koblitz曲线相关,1表示序号。SEC 2估计其安全级别为128位,并给出以下精确数值:[1]
| 参数 | 数值 |
|---|---|
p |
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
|
a、b |
0、7
|
压缩G |
0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
|
n |
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
|
h |
1
|
这种与Koblitz曲线相关的结构允许专门的算术优化,包括可高效计算的自同态。libsecp256k1把这类方法与预计算表等优化结合使用。性能取决于具体实现,不能据此给出通用的加速百分比。[2]
密钥与签名
比特币私钥是曲线阶所规定有效范围内的标量。相应公钥是生成点与该标量相乘得到的曲线点。实用安全假设是:从公开点反推出私有标量在计算上不可行。
比特币历史上在secp256k1上使用椭圆曲线数字签名算法(ECDSA)。Taproot又在同一曲线上引入BIP 340 Schnorr签名。BIP 340固定公钥和签名编码,使用仅含x坐标的公钥,并规定兼容签名器的确定性nonce生成要求。[3]
SEC 1用02或03前缀加x坐标表示压缩公钥点,用04加两个坐标表示未压缩公钥点。[4]BIP 340的32字节仅x坐标公钥是另一种比特币约定,不应与任何SEC 1表示混淆。
BIP 32分层确定性钱包也使用secp256k1派生私有和公开子密钥。扩展密钥包含链码和元数据,通常用Base58Check序列化;这种文本编码与椭圆曲线运算是不同层次。[5]
实现
正确实现必须验证标量和曲线点,安全生成nonce,防御侧信道,并谨慎解析签名和公钥。Bitcoin Core及相关软件使用专门的libsecp256k1库。它实现ECDSA和兼容BIP 340的Schnorr签名,并让依赖秘密的操作使用常数时间代码。[2]
secp256k1本身不加密钱包文件、不保存密钥,也不会独自把私钥变成地址。地址构造和钱包序列化还需要哈希、脚本、网络标识和编码。
参见
参考资料
- ↑ 1.0 1.1 Standards for Efficient Cryptography Group,“SEC 2: Recommended Elliptic Curve Domain Parameters”,2.0版,2010年1月。
- ↑ 2.0 2.1 bitcoin-core/secp256k1 repository,2026年9月15日查阅。
- ↑ BIP 340: Schnorr Signatures for secp256k1,2026年9月15日查阅。
- ↑ Standards for Efficient Cryptography Group,“SEC 1: Elliptic Curve Cryptography”,2.0版,2009年5月。
- ↑ BIP 32: Hierarchical Deterministic Wallets,2026年9月15日查阅。