secp256k1 是 SEC 2 标准定义的一条 256 位素数域椭圆曲线,常与 ECDSA 一起用于比特币、以太坊和许多区块链钱包的交易签名。
核心问题
secp256k1 解决的是“在区块链系统里使用哪一套固定椭圆曲线参数来生成公钥和签名”的问题。它和 P-256 一样都是 256 位素数域曲线,但不是同一条曲线,不能互换。
在比特币里,私钥是一个随机整数,公钥是该私钥作用在 secp256k1 的公开基点 G 上得到的曲线点,交易签名证明私钥持有者授权花费对应资产。
核心机制
secp256k1 使用短 Weierstrass 方程:
y^2 = x^3 + 7 mod p其中:
p = 2^256 - 2^32 - 977
a = 0
b = 7
h = 1曲线参数同样可以写成:
T = (p, a, b, G, n, h)| 符号 | 含义 |
|---|---|
p | 素数域大小 |
a, b | 曲线方程参数,secp256k1 中 a = 0, b = 7 |
G | SEC 2 固定的公开基点 |
n | 基点阶,私钥通常取 1 <= d < n |
h | 余因子,secp256k1 中为 1 |
密钥关系仍然是:
Q = dG这里 d 是 私钥,Q 是 公钥,dG 是 椭圆曲线标量乘法。曲线名里的 k 表示它是 Koblitz 型曲线;这类结构允许一些实现做 endomorphism/GLV 之类优化,但安全使用仍依赖正确的标量乘法、签名算法和随机数/确定性 nonce。
工程用途
- 比特币交易签名:传统交易使用 ECDSA over secp256k1,Taproot 使用同一曲线上的 Schnorr 签名。
- 以太坊账户:账户地址从 secp256k1 公钥派生,交易由私钥签名。
- 硬件钱包和冷钱包:私钥保存在安全芯片或离线设备中,只输出签名。
- 区块链身份和消息签名:很多链上/链下授权沿用 secp256k1 公钥体系。
观察点包括公钥压缩格式、低 s 规范化、签名恢复参数、链 ID、防重放规则和地址派生方式。签名验证只证明“这把私钥签过”,资产归属还取决于链上脚本、账户模型和交易规则。
边界与常见坑
- secp256k1 不是 P-256:两者公钥、签名、OID 和库参数都不同,错用曲线会导致验签失败。
- 区块链地址不是公钥本身:地址通常是公钥经过哈希、截断和编码后的标识。
- 签名不等于交易有效:签名正确还要检查 nonce、余额、脚本、链 ID、gas、UTXO 状态等规则。
- ECDSA nonce 错误仍会泄露私钥:重复或可预测的
k会暴露私钥,钱包实现通常使用确定性签名。 - 签名格式有协议差异:DER、raw
r || s、recoverable signature、低s规范化在不同系统里要求不同。 - 合规环境要确认曲线可用性:secp256k1 是 SEC 2 曲线,但不等同于 NIST P-256;受监管系统常要求明确算法白名单。