椭圆曲线标量乘法Elliptic Curve Scalar Multiplication)是在椭圆曲线点集上把一个点 G 按“点加法”重复相加 d 次的运算,写作 dGd * G,常用来从 私钥 生成 公钥

核心问题

ECC 需要一个“正向容易、反向困难”的运算。标量乘法提供了这个结构:

正向:已知整数 d 和点 G,计算 Q = dG 很快
反向:已知点 Q 和点 G,反推出 d 很难

这里 d 是私钥,G 是公开基点,Q 是公钥点。实际应用中,G 通常来自标准曲线参数,例如 P-256secp256k1Ed25519 的基点。反向问题通常称为椭圆曲线离散对数问题。

核心机制

密码学椭圆曲线通常不是画在普通实数平面上,而是在有限域里计算。可以粗略理解为所有坐标运算都要取模 p

y^2 = x^3 + ax + b mod p

曲线上的点加上一个特殊的无穷远点 O,构成一个“群”。这个群里的加法不是普通坐标相加,而是按曲线规则得到另一个曲线点。

两个不同点相加时:

P = (x1, y1)
Q = (x2, y2)
 
lambda = (y2 - y1) * (x2 - x1)^-1 mod p
x3 = lambda^2 - x1 - x2 mod p
y3 = lambda * (x1 - x3) - y1 mod p
 
P + Q = (x3, y3)

这里的 ^-1 mod p 是模逆元,不是普通除法。也就是说,在有限域里“除以一个数”等价于“乘以这个数的模逆元”。

点自己加自己叫倍加:

P = (x1, y1)
 
lambda = (3*x1^2 + a) * (2*y1)^-1 mod p
x3 = lambda^2 - 2*x1 mod p
y3 = lambda * (x1 - x3) - y1 mod p
 
2P = (x3, y3)

标量乘法就是反复使用点加法和点倍加:

5G  = G + G + G + G + G
13G = 8G + 4G + G

实际程序不会真的加 d 次,而是像快速幂一样使用 double-and-add、window method 等算法,把大整数 d 拆成二进制位,反复倍加并选择性累加。

工程用途

  • 生成 ECC 公钥:私钥 d 生成公钥 Q = dG
  • ECDSA 签名:每次签名会计算一次 R = kG,其中 k 是一次性数。
  • ECDSA 验签:验签公式会计算 u1G + u2Q,检查它是否回到签名时的点。
  • ECDH 密钥交换:一方用自己的私钥乘以对方公钥点,得到共享点。

实现关注点包括曲线参数、坐标格式、点压缩、无穷远点处理、模逆元计算、常数时间实现和输入点合法性检查。

边界与常见坑

  • 不是普通乘法dG 不是 (d*x, d*y),而是曲线点加法重复运算。
  • 不是实数曲线作图:密码学实现通常在有限域中取模计算,不使用浮点数。
  • 除法要用模逆元:公式里的 / 在程序里是乘以模逆元。
  • 点合法性必须检查:接受攻击者提供的无效曲线点,可能导致私钥信息泄露。
  • 实现要避免侧信道:标量乘法如果分支、内存访问或时间暴露 d 的比特,可能被侧信道攻击利用。

相关术语