一、引言
橢圓曲線密碼學(Elliptic Curve Cryptography, ECC)是現代公鑰密碼學的核心工具之一。
相比傳統的 RSA,ECC 可以用 更短的密鑰長度 提供 同等甚至更高的安全性,因此被廣泛應用于區塊鏈、TLS、移動設備加密等場景。
要理解 ECC,必須先了解它背后的數學結構 —— 橢圓曲線上的點運算。本文將從基礎開始,逐步介紹橢圓曲線的數學原理。
二、橢圓曲線方程
一個橢圓曲線通常由如下方程表示:
y2=x3+ax+b y^2 = x^3 + ax + b y2=x3+ax+b
其中 a,ba, ba,b 是常數,要求曲線 無奇異點(即沒有自相交和尖點),滿足:
4a3+27b2≠0 4a^3 + 27b^2 \neq 0 4a3+27b2=0
在實數范圍內,這條曲線看起來像一條光滑的對稱曲線:
- 關于 x 軸對稱
- 呈“S”形或“波浪”形
但在密碼學中,我們不會在實數范圍上研究,而是定義在 有限域 Fp\mathbb{F}_pFp?(模素數 ppp)上的橢圓曲線。
三、有限域上的橢圓曲線
在有限域中,所有運算都取模 ppp:
y2≡x3+ax+b(modp) y^2 \equiv x^3 + ax + b \pmod p y2≡x3+ax+b(modp)
例如:
選擇 p=17,a=2,b=2p = 17, a = 2, b = 2p=17,a=2,b=2,曲線為:
y2≡x3+2x+2(mod17) y^2 \equiv x^3 + 2x + 2 \pmod{17} y2≡x3+2x+2(mod17)
我們可以枚舉 x∈[0,16]x \in [0,16]x∈[0,16],找到滿足條件的點 (x,y)(x,y)(x,y),這就是曲線上的點集。
四、點運算(群結構)
ECC 的核心不是曲線方程本身,而是 曲線點上的運算規則。
橢圓曲線上的點(包括一個“無窮遠點” OOO)形成一個 群,支持以下運算:
-
點加法 P+QP+QP+Q
- 幾何直觀:過兩點作直線,直線與曲線相交于第三點 RRR,再取 RRR 關于 x 軸的對稱點。
- 特殊情況:P=QP=QP=Q 時,用切線定義加法。
-
點倍乘 kPkPkP
- 相當于 P+P+...+PP+P+...+PP+P+...+P(共 kkk 次)。
- 在 ECC 中,公鑰計算就是 點倍乘。
五、ECC 的安全性來源
- 容易:給定 PPP 和整數 kkk,計算 Q=kPQ = kPQ=kP 很快。
- 困難:給定 PPP 和 QQQ,求 kkk 很難(橢圓曲線離散對數問題,ECDLP)。
這種 單向性 是 ECC 的安全核心。
六、Go 語言小實驗:有限域橢圓曲線點加法
下面我們用 Go 寫一個小程序,在有限域 p=17p=17p=17 上實現橢圓曲線點加法。
package mainimport ("fmt""math/big"
)// 橢圓曲線參數: y^2 = x^3 + ax + b mod p
var p = big.NewInt(17)
var a = big.NewInt(2)
var b = big.NewInt(2)// 點結構
type Point struct {x, y *big.Intinf bool // 是否是無窮遠點
}// 取模
func mod(v *big.Int) *big.Int {r := new(big.Int).Mod(v, p)if r.Sign() < 0 {r.Add(r, p)}return r
}// 逆元
func modInverse(v *big.Int) *big.Int {return new(big.Int).ModInverse(v, p)
}// 點加法
func add(P, Q Point) Point {// 處理無窮遠點if P.inf {return Q}if Q.inf {return P}var m *big.Intif P.x.Cmp(Q.x) == 0 && P.y.Cmp(Q.y) == 0 {// P == Q, 切線斜率num := new(big.Int).Mul(big.NewInt(3), new(big.Int).Mul(P.x, P.x))num.Add(num, a)den := new(big.Int).Mul(big.NewInt(2), P.y)m = new(big.Int).Mul(num, modInverse(den))} else {// P != Q, 直線斜率num := new(big.Int).Sub(Q.y, P.y)den := new(big.Int).Sub(Q.x, P.x)m = new(big.Int).Mul(num, modInverse(den))}m = mod(m)xr := mod(new(big.Int).Sub(new(big.Int).Sub(new(big.Int).Mul(m, m), P.x), Q.x))yr := mod(new(big.Int).Sub(new(big.Int).Mul(m, new(big.Int).Sub(P.x, xr)), P.y))return Point{xr, yr, false}
}func main() {P := Point{big.NewInt(5), big.NewInt(1), false}Q := Point{big.NewInt(6), big.NewInt(3), false}R := add(P, Q)fmt.Printf("P=(%v,%v), Q=(%v,%v)\n", P.x, P.y, Q.x, Q.y)fmt.Printf("P+Q=(%v,%v)\n", R.x, R.y)
}
運行結果示例:
P=(5,1), Q=(6,3)
P+Q=(10,6)
說明在有限域上,橢圓曲線點運算是完全可行的。
七、總結
本文介紹了橢圓曲線的數學基礎,包括:
- 橢圓曲線方程及有限域定義
- 點加法和點倍乘運算
- ECC 的安全來源 —— 橢圓曲線離散對數問題