跳转到内容

Secp256k1

来自BitcoinWiki

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
ab 07
压缩G 0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
n FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
h 1

这种与Koblitz曲线相关的结构允许专门的算术优化,包括可高效计算的自同态。libsecp256k1把这类方法与预计算表等优化结合使用。性能取决于具体实现,不能据此给出通用的加速百分比。[2]

密钥与签名

比特币私钥是曲线阶所规定有效范围内的标量。相应公钥是生成点与该标量相乘得到的曲线点。实用安全假设是:从公开点反推出私有标量在计算上不可行。

比特币历史上在secp256k1上使用椭圆曲线数字签名算法(ECDSA)。Taproot又在同一曲线上引入BIP 340 Schnorr签名。BIP 340固定公钥和签名编码,使用仅含x坐标的公钥,并规定兼容签名器的确定性nonce生成要求。[3]

SEC 1用0203前缀加x坐标表示压缩公钥点,用04加两个坐标表示未压缩公钥点。[4]BIP 340的32字节仅x坐标公钥是另一种比特币约定,不应与任何SEC 1表示混淆。

BIP 32分层确定性钱包也使用secp256k1派生私有和公开子密钥。扩展密钥包含链码和元数据,通常用Base58Check序列化;这种文本编码与椭圆曲线运算是不同层次。[5]

实现

正确实现必须验证标量和曲线点,安全生成nonce,防御侧信道,并谨慎解析签名和公钥。Bitcoin Core及相关软件使用专门的libsecp256k1库。它实现ECDSA和兼容BIP 340的Schnorr签名,并让依赖秘密的操作使用常数时间代码。[2]

secp256k1本身不加密钱包文件、不保存密钥,也不会独自把私钥变成地址。地址构造和钱包序列化还需要哈希、脚本、网络标识和编码。

参见

参考资料