第二章 椭圆曲线密码学基础
说实话,我刚接触椭圆曲线时,也觉得这东西挺抽象的。一条曲线,几个点,怎么就成密码学了?直到我在一个国产化项目中,需要把RSA替换成SM2,才真正体会到——不理解椭圆曲线,你连密钥长度为什么那么短都说不清楚。
这一章,咱们就把椭圆曲线密码学(ECC)的底裤扒开。不扯虚的,直接上干货。
2.1 有限域 GF(p)——密码学的“数字沙盘”
椭圆曲线要在有限域上才能用于密码学。什么叫有限域?说白了,就是一个元素个数有限的集合,里面的数可以做加减乘除,结果还在这个集合里。
SM2用的是素数域GF(p),p是一个大素数。我习惯把GF(p)想象成一个“数字沙盘”——所有运算都在这个沙盘里进行,永远不会跑出去。
GF(p)的定义:
- 集合:{0, 1, 2, ..., p-1}
- 加法:模p加法
- 乘法:模p乘法
- 每个非零元素都有乘法逆元
举个例子,GF(7)里:
- 3 + 5 = 8 mod 7 = 1
- 4 × 6 = 24 mod 7 = 3
- 2的逆元是4,因为2×4=8 mod 7=1
嗯,这里要注意:GF(p)里的运算都是模p的。你想想看,如果p是256位的素数,那这个沙盘就大到天文数字级别了。
2.2 椭圆曲线方程——不只是数学公式
SM2使用的椭圆曲线方程是:
y² = x³ + ax + b (mod p)
其中4a³ + 27b² ≠ 0 (mod p),保证曲线没有奇点。
SM2国标中,a和b是固定的参数。我个人习惯把这条曲线想象成一个“甜甜圈”在二维平面上的投影——当然,在有限域上它看起来更像一堆散点。
为什么是y² = x³ + ax + b?
这个形式叫Weierstrass标准型。几乎所有主流ECC标准(包括SM2、secp256k1、P-256)都基于这个形式。它保证了群运算的封闭性和可计算性。
2.3 点加与倍点运算——ECC的核心操作
椭圆曲线上的点可以“相加”。这个加法不是普通加法,而是几何意义上的加法。
2.3.1 点加(Point Addition)
给定两个不同的点P和Q,P+Q = R的计算规则:
- 过P和Q做直线
- 直线与曲线交于第三点R'
- R'关于x轴的对称点就是R
公式表达:
λ = (y₂ - y₁) / (x₂ - x₁) mod p
x₃ = λ² - x₁ - x₂ mod p
y₃ = λ(x₁ - x₃) - y₁ mod p
2.3.2 倍点运算(Point Doubling)
当P=Q时,就是倍点运算:
λ = (3x₁² + a) / (2y₁) mod p
x₃ = λ² - 2x₁ mod p
y₃ = λ(x₁ - x₃) - y₁ mod p
我曾经踩过的坑:在实现倍点运算时,分母2y₁可能为0。如果y₁=0,那这个点的倍点结果就是无穷远点。很多初学SM2的人会忽略这个边界情况,导致程序崩溃。
2.4 离散对数问题——ECC安全的基石
椭圆曲线上的离散对数问题(ECDLP)是这样的:
给定基点G和点Q = kG,求k。
说白了,就是已知起点和终点,让你猜走了多少步。在普通加法里,这很容易。但在椭圆曲线上,这几乎不可能——至少目前没有多项式时间算法。
为什么ECDLP这么难?
- 没有类似“指数运算”的对称性
- Pollard's rho算法复杂度是O(√n),n是群的阶
- 量子计算机可以用Shor算法破解,但那是另一回事
我记得有一次做安全评估,有人问:“为什么SM2的256位密钥比RSA的2048位还安全?”答案就在这里——ECDLP的难度决定了ECC可以用更短的密钥达到同等安全强度。
2.5 知识体系总览
下面这张图把本章的核心逻辑串起来了:
2.6 关键参数对比
不同椭圆曲线标准的核心参数差异很大。我整理了一个对比表,方便你理解SM2的位置:
| 参数 | SM2 | secp256k1 | P-256 |
|---|---|---|---|
| p(素数) | 256位 | 256位 | 256位 |
| a | 固定值 | 0 | 固定值 |
| b | 固定值 | 7 | 固定值 |
| G(基点) | 国标定义 | 标准定义 | NIST定义 |
| n(阶) | ≈ 2²⁵⁶ | ≈ 2²⁵⁶ | ≈ 2²⁵⁶ |
| 安全强度 | 128位 | 128位 | 128位 |
我的建议:如果你在做国产化项目,直接用SM2。如果做国际通用场景,P-256更稳妥。secp256k1主要用于区块链(比如比特币),日常应用不推荐。
2.7 本章小结
椭圆曲线密码学的基础可以概括为三句话:
- 有限域GF(p)提供了运算的“沙盘”
- 椭圆曲线方程定义了点的集合
- 点加和倍点构成了标量乘法,而标量乘法的逆就是ECDLP