密语 · CIPHER | 目录 CH.17 / 26
绝密
Phase 4 · 公钥革命

椭圆曲线

为什么你手机上的现代密钥越来越短却越来越安全。答案藏在一条曲线的几何里。

阅读 ~15 分钟 前置 第 14、15 章 Demo 点加法几何 + 有限域标量乘

RSA 用 3072 位密钥,椭圆曲线只用 256 位就达到同等安全——密钥小 12 倍,握手更快、更省电。今天的 TLS、Signal、比特币、以太坊,公钥部分几乎全是椭圆曲线。它听起来高深,但核心只是一条曲线上的一种奇特"加法"。

一、一条曲线,和它古怪的加法

椭圆曲线是形如下式的方程画出的对称曲线:

y² = x³ + a·x + b

关键不在曲线本身,而在数学家为曲线上的点定义的一种"加法"。它的几何规则出奇地简单:

这套规则看着随意,却满足加法该有的一切性质(交换、结合、有零元、有逆元)。于是"点 + 点 = 点"成了一个自洽的运算。下面亲手玩一下:

DEMO 点加法的几何(实数曲线)
红=P,蓝=Q,虚线=过两点的直线,它与曲线的第三个交点翻折后(绿=P+Q)。点"模式"切到 2P 看切线倍点。这是给直觉用的连续曲线;真正的密码学发生在下面的"点阵"版本里。

二、把曲线搬到有限域:点变成星空

密码学不用连续曲线(实数不精确、无法做等价的"离散对数难")。它把曲线放到第 14 章那个"素数钟面"上——所有坐标都 mod p。于是平滑的曲线碎成一片离散的点,像撒在网格上的星星,毫无规律。但点加法的代数规则原样保留(几何直觉没了,公式还在)。

接下来是关键类比。既然点能相加,就能"自乘":

k·G = G + G + … + G  (k 个 G 相加)

这叫标量乘法,它就是椭圆曲线版的"模幂"。而它同样是个单向函数:

看出来了吗?这和第 15 章的 DH 完全同构:把"底数 g"换成"基点 G","私钥指数 x"还是私钥 k,"公钥 gˣ"换成"公钥 k·G"。所有基于离散对数的协议(DH、签名)都能原样搬到椭圆曲线上,得到 ECDHECDSA——这就是下一章和 TLS 的主角。

DEMO 有限域上的标量乘 k·G
y² = x³ + 2x + 2 mod 17
基点 G=(5,1)。拖动 k,看 k·G 在这 19 个点之间"跳跃"。给你最终落点、让你反推走了几步(k),就是 ECDLP——在真实的 256 位曲线上,这个"几步"无人能算出。

三、为什么钥匙能小这么多

核心原因:攻破椭圆曲线离散对数,没有攻破 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
  • 放到有限域上,标量乘是单向函数:算 k·G 容易,反推 k(ECDLP)极难——DH/签名可原样搬来(ECDH/ECDSA)。
  • ECDLP 无亚指数攻击,故同等安全下密钥远小于 RSA(128 位安全:256 位 vs 3072 位),更适合移动端。
  • 常用曲线:P-256、Curve25519/X25519、Ed25519、secp256k1;务必用标准曲线与审计过的库。