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位弱”的错觉拒绝迁移,结果评估出来后自己打了脸。

两种密码的数学结构对比图

RSA vs SM2 数学结构对比 RSA: 大整数分解 大素数 p, q 模数 n = p×q 从 n 分解出 p,q → 困难 SM2: 椭圆曲线离散对数 椭圆曲线 y² = x³ + ax + b 基点 G, 私钥 d, 公钥 P=dG 从 P,G 求 d → 困难 核心区别 RSA依赖大整数分解的“大”,密钥长、运算慢 SM2依赖椭圆曲线离散对数的“密”,密钥短、效率高 两者均被量子计算威胁,但SM2在同等安全下资源消耗更少 vs
以上图中的“从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字节,多出来的是冗余。迁移前一定要查标准文档,别自己加戏。