几乎每个加密货币钱包说明书都会提到“椭圆曲线数字签名”,而比特币和以太坊选用的那条曲线有同一个名字:secp256k1。已有文章讲过交易是怎么签名的,本文换一个更底层的问题:签名发生的那块“数学场地”本身长什么样,为什么大家不约而同选了它。
一条曲线和四个参数
secp256k1 的定义可以压缩成一行方程:在整数取模运算下满足 y 平方等于 x 立方加 7 的点的集合,再加上一个无穷远点。让它成为密码学工具的是四个参数。第一个是素数 p,决定了坐标取值范围,secp256k1 用的是一个约 78 位十进制数字的大素数,点坐标就在这个范围内取模运算。第二个是基点 G,曲线上事先约定的一名“起跑点”。第三个是阶 n,从 G 出发不断做“倍点”运算,走 n 步恰好回到无穷远点,n 是一个接近 2 的 256 次方的大素数,私钥的合法范围就是 1 到 n 减 1。第四个是曲线系数 7(另一个系数为 0),它看似随意,实则经过选择以兼顾运算速度与抗特定数学攻击的特性。
为什么长度是 256 位
椭圆曲线密码的安全建立在“给定私钥乘出来的公钥点,反推私钥在计算上不可行”这一离散对数难题上。已知最优的通用求解算法大约需要与阶的平方根成正比的运算量,所以 256 位的阶提供的安全强度约是 128 位,这也是行业常说“secp256k1 约等于 128 位安全等级”的由来。作为对照,比特币和以太坊的哈希输出是 256 位,但因为生日攻击,其碰撞安全强度同样是 128 位量级——两套体系在强度设计上取向一致。
场地与打法:曲线不是签名
值得澄清一个常见混淆:secp256k1 是曲线,ECDSA 与 Schnorr 是在这条曲线上进行签名的两套不同打法。同一条曲线上可以运行多种签名算法;比特币在 2021 年Taproot激活后新增了Schnorr签名的使用选项,而曲线本身没有更换。以太坊从创世起使用ECDSA配keccak256哈希。换句话说,比较“比特币签名”和“以太坊签名”的差异时,多数区别出在哈希函数与签名格式上,曲线这一层两家是相同的。
工程层面的一点历史
早期实现依赖通用密码库,速度慢且容易出实现缺陷。Bitcoin Core 后来自带了一个名为 libsecp256k1 的专用实现,把这条曲线上的运算做成了高度优化的独立库,之后不少其他项目也复用它。这个细节说明一件事:算法标准之外,实现质量同样是安全边界的一部分,历史上出过问题的多是实现漏洞而非曲线本身被攻破。
倍点运算的一个直觉
曲线上的“加法”不是把数字相加:取曲线上两点,画一条直线穿过它们,直线与曲线的第三个交点关于横轴的镜像点,就是这两点之和;两点重合时改用切线,称为倍点。私钥参与的运算是把基点 G 反复做这种倍加,一个 256 位的私钥对应两百多轮迭代,得到的公钥点是整条流水线的终点。正向算快、反向解(从终点回推步数)难,这个不对称就是全部安全性的来源。
快速问答
问:私钥长度超过曲线阶会怎样?答:不在合法范围内的随机数需要取模或重摇,各实现有标准处理方式,正规钱包不会让用户直接察觉。问:量子计算会不会立刻击穿这条曲线?答:理论上足够强大的量子算法可以解椭圆曲线离散对数,这是整个行业转向抗量子方案的动机之一,但以现有设备远未达到,且各公链尚未统一抗量子路线。问:可以自定义一条曲线吗?答:技术上可以,但没做过公开安全评审的曲线不适合承载资产,钱包和协议只应使用经过广泛分析的标准曲线。
风险提示:本文是密码学基础科普,不构成投资建议。任何声称通过更换曲线、修改参数即可提升安全性的产品宣传,都值得先核对其是否经过公开评审。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。