5 · 椭圆曲线(Elliptic Curve)
抽象代数在区块链里最重要的一次落地。理解椭圆曲线群上的点加法、标量乘与双线性配对(Pairing)。
这是抽象代数在区块链里最重要的一次落地。比特币、以太坊的钱包地址、签名全都靠它。核心口号:椭圆曲线上的点构成一个群,签名就是这个群里的运算。
一、曲线与点群
椭圆曲线(短魏尔斯特拉斯形式):
在密码学里,x、y 取自有限域 ,所以曲线其实是一堆离散的点。这些点 加上一个「无穷远点」,在「点加法」下构成一个阿贝尔群, 是单位元。
二、点加法的几何意义
两点 P、Q 相加:过 P、Q 作一条直线,交曲线于第三点,关于 x 轴对称得到 。两点重合()则用切线。这套「几何作图」翻译成 上的代数公式,就是钱包里真正跑的代码。
三、标量乘与 ECDLP
标量乘:,即把 P 自加 k 次。(若把群运算写成乘法,这就是「求 k 次幂」 的加法版本。)
- 公钥 = 私钥 × 基点:,k 是私钥,Q 是公钥。
- ECDLP(椭圆曲线离散对数):已知 G、Q 反求 k——极难。正向标量乘用「倍点 + 加」 快,反向无多项式算法。
为什么用椭圆曲线而不是 RSA:同等安全强度下,ECC 密钥更短(256 位 ECC ≈ 3072 位 RSA)。区块链要把公钥/签名上链,短就是钱。
四、配对(Pairing)——ZK 与 BLS 的魔法
配对是一个双线性映射 。它让「乘法在指数上搬动」,是以下东西的核心:
- BLS 签名:可聚合成一个短签名,以太坊信标链在用。
- KZG 多项式承诺:PLONK / Danksharding 的基石。
五、数字例题(步步算)
曲线 上 ,取 ,算 。
切线斜率 。,(因 ),所以 。
;。所以 。
六、Python 代码
p, a = 17, 2
def inv(x): return pow(x, p-2, p)
def add(P, Q):
if P is None: return Q
if Q is None: return P
(x1,y1),(x2,y2) = P, Q
if x1==x2 and (y1+y2)%p==0: return None # P + (-P) = O
if P==Q:
l = (3*x1*x1 + a) * inv(2*y1) % p
else:
l = (y2-y1) * inv(x2-x1) % p
x3 = (l*l - x1 - x2) % p
y3 = (l*(x1-x3) - y1) % p
return (x3, y3)
def mul(k, P): # 倍点-加
R, base = None, P
while k:
if k & 1: R = add(R, base)
base = add(base, base); k >>= 1
return R
P = (5, 1)
print("2P =", add(P, P)) # (6, 3)
print("公钥 7·P =", mul(7, P)) # 私钥 7 对应的公钥
七、动手想一想
- 为什么点加法需要一个「无穷远点」?
- 私钥泄露为什么等于资产丢失,但公钥公开却安全?
- 为什么签名里的随机数 k 绝不能重用?
答案:(1) 作为群的单位元(“什么都不加”),也对应竖直线与曲线的“第三交点”。(2) 公钥=私钥×G 是单向的,由 Q 反推 k 是 ECDLP 难题。(3) ECDSA 里重用 k 会让两个签名联立解出私钥——历史上索尼 PS3、部分钱包都因此被盗。
小结:椭圆曲线点在点加法下构成一个阿贝尔群;公钥=私钥×基点是单向的(ECDLP 难),这就是区块链签名安全的根。