椭圆曲线标量乘法(Elliptic Curve Scalar Multiplication)是在椭圆曲线点集上把一个点 G 按“点加法”重复相加 d 次的运算,写作 dG 或 d * G,常用来从 私钥 生成 公钥。
核心问题
ECC 需要一个“正向容易、反向困难”的运算。标量乘法提供了这个结构:
正向:已知整数 d 和点 G,计算 Q = dG 很快
反向:已知点 Q 和点 G,反推出 d 很难这里 d 是私钥,G 是公开基点,Q 是公钥点。实际应用中,G 通常来自标准曲线参数,例如 P-256、secp256k1 或 Ed25519 的基点。反向问题通常称为椭圆曲线离散对数问题。
核心机制
密码学椭圆曲线通常不是画在普通实数平面上,而是在有限域里计算。可以粗略理解为所有坐标运算都要取模 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的比特,可能被侧信道攻击利用。