为什么你手机上的现代密钥越来越短却越来越安全。答案藏在一条曲线的几何里。
RSA 用 3072 位密钥,椭圆曲线只用 256 位就达到同等安全——密钥小 12 倍,握手更快、更省电。今天的 TLS、Signal、比特币、以太坊,公钥部分几乎全是椭圆曲线。它听起来高深,但核心只是一条曲线上的一种奇特"加法"。
椭圆曲线是形如下式的方程画出的对称曲线:
关键不在曲线本身,而在数学家为曲线上的点定义的一种"加法"。它的几何规则出奇地简单:
这套规则看着随意,却满足加法该有的一切性质(交换、结合、有零元、有逆元)。于是"点 + 点 = 点"成了一个自洽的运算。下面亲手玩一下:
密码学不用连续曲线(实数不精确、无法做等价的"离散对数难")。它把曲线放到第 14 章那个"素数钟面"上——所有坐标都 mod p。于是平滑的曲线碎成一片离散的点,像撒在网格上的星星,毫无规律。但点加法的代数规则原样保留(几何直觉没了,公式还在)。
接下来是关键类比。既然点能相加,就能"自乘":
这叫标量乘法,它就是椭圆曲线版的"模幂"。而它同样是个单向函数:
k 和 G,算 k·G 很快(用"倍点-相加",类似平方-乘)。G 和 k·G,反推 k——这是椭圆曲线离散对数问题(ECDLP),极难。看出来了吗?这和第 15 章的 DH 完全同构:把"底数 g"换成"基点 G","私钥指数 x"还是私钥 k,"公钥 gˣ"换成"公钥 k·G"。所有基于离散对数的协议(DH、签名)都能原样搬到椭圆曲线上,得到 ECDH、ECDSA——这就是下一章和 TLS 的主角。
核心原因:攻破椭圆曲线离散对数,没有攻破 RSA 那样的"捷径"。分解大数有亚指数级算法(数域筛法),所以 RSA 必须把密钥堆得很大来补偿;而 ECDLP 目前只有完全指数级的攻击,于是小得多的密钥就能达到同样的安全。
| 对称强度 | RSA/DH 密钥 | 椭圆曲线密钥 |
|---|---|---|
| 112 位 | 2048 位 | 224 位 |
| 128 位 | 3072 位 | 256 位 |
| 256 位 | 15360 位 | 512 位 |
对手机来说,这个差距是实打实的:更短的密钥意味着更快的握手、更小的证书、更省的电池和流量。这就是移动时代全面倒向椭圆曲线的根本原因。
P-256(secp256r1):NIST 标准曲线,TLS 证书、Android Keystore、WebCrypto 默认之一。
Curve25519 / X25519:Bernstein 设计,专为"难以用错"而生——性能好、抗侧信道、没有 NIST 曲线那些"参数从哪来"的疑虑。ECDH 用它的变体 X25519,签名用 Ed25519。Signal、WireGuard、SSH、TLS 1.3 都爱用。
secp256k1:比特币和以太坊专用曲线(第 24 章会再见到它)。
如果你在选:新项目优先 X25519 / Ed25519,要和现有 PKI/证书体系兼容就用 P-256。
① 曲线选择有讲究:不是随便一条 y²=x³+ax+b 都安全,有些曲线存在特殊弱点。用标准曲线,别自造。
② 无效曲线攻击:如果实现没校验"对方给的公钥点确实在曲线上",攻击者能发一个特制的"曲线外点"套出你的私钥信息。好的库会做点校验。
③ 签名随机数是命门:ECDSA 每次签名要一个一次性随机数 k,它一旦重复或可预测,私钥立刻泄露——这就是下一章 PS3 破解和一系列真实事故的根源。
老规矩:用经过审计的库(Android Keystore、Tink、libsodium),别自己实现曲线运算。本章 Demo 的小曲线只为教学。
我们现在有了两种单向陷门:大数分解(RSA)和椭圆曲线离散对数(ECC)。它们都能用来签名——用私钥产出只有你能产出、人人可验的凭据。但"签名"从原语到真正能信任一个网站,中间还隔着哈希、证书和整条信任链。下一章,我们把数字签名讲透,并亲手用浏览器原生的 ECDSA 签一次、验一次。
k·G。