RSA和SM2算法原理对比:数学基础
做密码迁移,绕不开数学。很多人一听“数学基础”就头大——别急,我尽量说人话。
RSA和SM2,一个靠大整数分解,一个靠椭圆曲线离散对数。说白了,一个是拆积木,一个是找路灯下的点。咱们先拆开看。
RSA的数学根基:大整数分解
RSA的安全,全压在一个假设上:给定两个大素数p和q,把它们乘起来得到n很容易,但从n反推出p和q,难。
- 密钥生成:选两个大素数(比如1024位),算n = p×q
- 公钥:(n, e),e通常选65537
- 私钥:d,满足e×d ≡ 1 mod φ(n)
- 加密:c = m^e mod n
- 解密:m = c^d mod n
我在项目中遇到过客户问:“为什么RSA 2048位才算安全?”其实1999年512位RSA就被破解了,现在2048位也只是勉强扛住常规攻击。你想想看,随着量子计算发展,RSA的数学基础会被Shor算法直接捅穿。
大整数分解目前没有多项式时间算法,但量子计算可以。这决定了RSA的“寿数”是有限的。
SM2的数学根基:椭圆曲线离散对数
SM2用的是椭圆曲线上的点群。简单说,我们在一条曲线y² = x³ + ax + b上定义加法运算,然后基于“点乘”做公钥密码。
- 参数:国密标准选用一条256位素数域上的曲线(sm2p256v1)
- 私钥:随机整数d (1 < d < n-1)
- 公钥:点P = d × G(G是基点)
- 从P反推d,就是椭圆曲线离散对数问题(ECDLP)
- 签名/密钥交换都基于这个运算
注意,ECDLP的难度比大整数分解高得多。256位SM2的破解难度,相当于3072位RSA。这也是为什么用更短的密钥就能达到同等安全等级。
我在做金融系统迁移时,一个常见误解是“SM2 256位比RSA 2048位弱”。实际正好相反——SM2 256位约等于RSA 3072位的安全强度。
核心差异对比
| 特性 | RSA | SM2 |
|---|---|---|
| 困难问题 | 大整数分解 | 椭圆曲线离散对数 |
| 当前推荐密钥长度 | 2048 / 3072位 | 256位 |
| 同等安全强度 | 需更长密钥 | 密钥更短,效率更高 |
| 运算核心 | 模幂运算 | 标量乘法(点加+倍点) |
| 量子抗性 | 极弱(Shor算法秒杀) | 同样极弱(同属ECC) |
| 标准来源 | PKCS#1 / FIPS 186 | GM/T 0003-2012 |
密钥强度与安全等级
很多人问:“迁移后我的系统真的更安全了吗?”答案取决于你原来的RSA位数。
- RSA 1024位 → 已不推荐,迁移到SM2 256位是显著提升
- RSA 2048位 → 与SM2 256位安全等级相当
- RSA 3072位 → 略高于SM2 256位,但SM2 384位可对标
我记得有一次给某政务平台做评估,他们还在用RSA 1024位做数字签名。我当时就说:这等于给保险柜配了个塑料锁。换SM2 256位后,密钥体积缩小了8倍,签名速度还快了一截。
我这里要提一个坑:SM2的密钥长度不能简单用“位”来和RSA等比。因为两种密码的底层困难问题不同,安全边界也不同。我曾经见过有人用“SM2 256位比RSA 2048位弱”的错觉拒绝迁移,结果评估出来后自己打了脸。
两种密码的数学结构对比图
以上图中的“从n分解出p,q”和“从P,G求d”,就是两个密码体系的硬骨头。谁都不能在多项式时间内搞定(至少在通用计算机上)。迁移时,你只需要关心密钥长度是否满足当前的安全要求。
迁移中的数学考量
做迁移,你不需要成为数学家,但必须理解两个关键点:
- 长度不等价:不要用RSA的密钥长度直接对应SM2的密钥长度。用表格里的“同等安全强度”来选。
- 算法族不同:RSA的签名/加密模式(PKCS#1 v1.5, OAEP)和SM2的签名/加密模式(GM/T 0003.2-2012)差异很大。迁移不是简单的密钥替换,是整体算法替换。
- 性能差异:SM2签名快,验签稍慢(运算量不一样)。我在做负载测试时发现,如果验签频率极高,需要注意CPU预算。
我曾经踩过一个坑:把SM2的私钥长度(32字节)直接当成“安全等级不够”,非要改成64字节。结果发现国密标准里SM2的私钥就是32字节,多出来的是冗余。迁移前一定要查标准文档,别自己加戏。