· 抽象代数(区块链密码学向)

5 · 椭圆曲线(Elliptic Curve)

抽象代数在区块链里最重要的一次落地。理解椭圆曲线群上的点加法、标量乘与双线性配对(Pairing)。

这是抽象代数在区块链里最重要的一次落地。比特币、以太坊的钱包地址、签名全都靠它。核心口号:椭圆曲线上的点构成一个群,签名就是这个群里的运算


一、曲线与点群

椭圆曲线(短魏尔斯特拉斯形式):

y2=x3+ax+by^2 = x^3 + ax + b

在密码学里,x、y 取自有限域 Fp\mathbb{F}_p,所以曲线其实是一堆离散的点。这些点 加上一个「无穷远点」O\mathcal{O},在「点加法」下构成一个阿贝尔群O\mathcal{O} 是单位元。

二、点加法的几何意义

两点 P、Q 相加:过 P、Q 作一条直线,交曲线于第三点,关于 x 轴对称得到 P+QP+Q。两点重合(P+PP+P)则用切线。这套「几何作图」翻译成 Fp\mathbb{F}_p 上的代数公式,就是钱包里真正跑的代码。

三、标量乘与 ECDLP

标量乘kP=P+P++Pkk\cdot P = \underbrace{P+P+\cdots+P}_{k},即把 P 自加 k 次。(若把群运算写成乘法,这就是「求 k 次幂」gkg^k 的加法版本。)

为什么用椭圆曲线而不是 RSA:同等安全强度下,ECC 密钥更短(256 位 ECC ≈ 3072 位 RSA)。区块链要把公钥/签名上链,短就是钱。

四、配对(Pairing)——ZK 与 BLS 的魔法

配对是一个双线性映射 e(aP,bQ)=e(P,Q)abe(aP, bQ) = e(P,Q)^{ab}。它让「乘法在指数上搬动」,是以下东西的核心:

五、数字例题(步步算)

曲线 y2=x3+2x+2y^2=x^3+2x+2F17\mathbb{F}_{17},取 P=(5,1)P=(5,1),算 2P2P

切线斜率 λ=3x2+a2y=325+22=772mod17\lambda=\dfrac{3x^2+a}{2y}=\dfrac{3\cdot25+2}{2}=\dfrac{77}{2}\bmod1777977\equiv921=92^{-1}=9(因 29=1812\cdot9=18\equiv1),所以 λ=99=8113\lambda=9\cdot9=81\equiv13

x3=λ22x=16910=159159917=6x_3=\lambda^2-2x=169-10=159\equiv159-9\cdot17=6y3=λ(xx3)y=13(56)1=143y_3=\lambda(x-x_3)-y=13(5-6)-1=-14\equiv3。所以 2P=(6,3)2P=(6,3)

六、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 对应的公钥

七、动手想一想

  1. 为什么点加法需要一个「无穷远点」?
  2. 私钥泄露为什么等于资产丢失,但公钥公开却安全?
  3. 为什么签名里的随机数 k 绝不能重用?

答案:(1) 作为群的单位元(“什么都不加”),也对应竖直线与曲线的“第三交点”。(2) 公钥=私钥×G 是单向的,由 Q 反推 k 是 ECDLP 难题。(3) ECDSA 里重用 k 会让两个签名联立解出私钥——历史上索尼 PS3、部分钱包都因此被盗。

小结:椭圆曲线点在点加法下构成一个阿贝尔群;公钥=私钥×基点是单向的(ECDLP 难),这就是区块链签名安全的根。