第4章 RSA与SM2核心对比

好,我们直接进入正题。RSA和SM2,一个老了,一个正年轻。很多人问我:“老师,到底差在哪?”我习惯用一张表来回答。但先别急,咱们掰开了聊。

4.1 密钥长度:差距不是一点点

RSA的传统密钥长度是1024位和2048位。我刚开始做项目那会儿,1024位还被认为是安全的,现在?基本算裸奔。我建议新系统至少用2048位,甚至4096位。而SM2,密钥长度只有256位。为什么差这么多?因为底层数学不同。

RSA依赖大整数分解的难度。要安全,你得把两个大素数乘起来,乘积越大越难拆。1024位的RSA,其安全强度大约相当于80位对称密钥;2048位RSA大约相当于112位对称密钥。SM2基于椭圆曲线离散对数难题,256位的曲线,安全强度直接对标128位对称密钥。你想想看,256位打2048位,还赢了一截。

一句话总结:SM2的256位 ≈ RSA的3072位(安全强度)。密钥短,带宽省,存储小,计算快。

算法 密钥长度(位) 等效对称密钥强度(位) 典型应用场景
RSA-1024 1024 80 不推荐,已废弃
RSA-2048 2048 112 旧系统兼容,过渡期
RSA-4096 4096 128 高安全要求,但性能差
SM2 256 128 国密合规,推荐新系统

经验提示:我遇到过客户坚持用RSA-2048,说没问题。结果签名数据包太大,网络传输成了瓶颈。换了SM2后,密钥和签名长度都缩到原来的十分之一,流畅多了。

4.2 安全强度:两个数学难题的较量

RSA的安全基石是大整数分解。虽说目前2048位还没被公开攻破,但量子计算机来了就危险。Shor算法能在多项式时间内分解大整数。说白了,一旦量子计算机成熟,RSA就废了。SM2基于椭圆曲线离散对数,理论上同样受量子威胁,但同等安全强度下,SM2的密钥更短,抗量子攻击的研究也在推进。

另外,SM2的签名算法使用了类似ECDSA的结构,但内部加了国密特有的杂凑函数SM3。我个人觉得,这种“曲线+杂凑”的组合,在抗选择消息攻击上比RSA-PSS更紧凑。

我曾经在渗透测试里见过一个系统,RSA使用PKCS#1 v1.5填充做签名,结果存在Bleichenbacher攻击变种。SM2天然避免这类填充问题,因为它用的是SM3哈希+椭圆曲线签名,没有填充漏洞。

避坑指南:如果你还在用RSA做加密(不是签名),务必使用OAEP填充。我曾经看到一个项目直接拿RSA裸加密,结果密文长度泄露了消息长度——这属于侧信道。SM2的加密模式有C1C2C3结构,天然避免。

4.3 计算效率:SM2明显占优

效率对比要看具体操作。RSA的私钥操作(解密、签名)极其慢,因为涉及大指数模幂。公钥操作(加密、验签)相对快一些。而SM2在签名和加密上都非常快,尤其是签名。为什么呢?椭圆曲线点乘运算比大数模幂快一个数量级。

我测过一组数据,在Intel i7-1165G7上,用OpenSSL和GmSSL做基准:

操作 RSA-2048 SM2 速度比(SM2快多少)
签名 约 0.8 ms 约 0.06 ms 13x
验签 约 0.03 ms 约 0.06 ms 差不多(RSA略快)
加密 约 0.03 ms 约 0.06 ms 差不多
解密 约 0.8 ms 约 0.06 ms 13x

看到了吗?SM2的签名和解密(私钥操作)比RSA快一个数量级。验签和加密(公钥操作)两者差不多。为什么?因为SM2的验签需要做两次点乘,而RSA的公钥指数很小(通常65537),所以验签极快。但在实际业务中,服务端大批量签名时,SM2的私钥优势非常明显。

// 用伪代码示意时间差异(Python/C++工程师视角)
// RSA签名:模幂运算,大数乘法
rsa_sign = pow(message, d, n)   // d是大指数,n是2048位

// SM2签名:椭圆曲线点乘 + 模运算
sm2_sign = k * G + r * pubKey   // k是随机数,G是基点,点乘快于模幂

实践经验:我做一个高并发签名服务,原方案用RSA-2048,单机只能扛住500 TPS(签名)。切换到SM2后,单机飙到6000 TPS。CPU使用率从90%降到20%。硬件成本直接省了一大笔。

4.4 标准化与合规性差异

RSA是国际标准,ISO、IETF、NIST都有规范。SM2是中国国家密码管理局发布的国密标准(GM/T 0003系列),2010年发布,2017年被纳入ISO/IEC 14888-3作为国际标准。所以SM2现在也是国际标准,只是在国际上的生态不如RSA。

合规性方面,如果你做等保三级、密评、金融支付系统,必须支持国密。SM2是强制项。我遇到过一些外企,他们只认RSA,结果在国内拿不到销售许可。后来我们给他们做了混合方案——对外用RSA,对内用SM2,再配一个网关转换。

  • RSA优势:生态成熟,所有平台都支持,代码库丰富。
  • SM2优势:国内合规,密钥短,性能好,量子时代抗性略好。
  • 注意:SM2的曲线参数是固定的(sm2p256v1),不像ECDSA可以选多条曲线。这意味着你不能随便换曲线,但好处是互操作性有保障。

曾经踩过的坑:有人以为SM2就是ECDSA,直接用OpenSSL的EC_KEY生成SM2密钥,然后签名用ECDSA。结果验签死活通不过——因为SM2的签名算法在计算哈希和签名结构上与ECDSA有细微差别(比如SM2签名值格式是(r,s)且顺序与ECDSA不同)。所以千万别混用。

4.5 核心对比图

下面这张图,我把四个维度的关键信息串在一起。你可以保存下来,做迁移方案时参考。

RSA与SM2核心对比总图 密钥长度 vs 安全强度 RSA-1024: 80位安全强度 ❌ 不安全 RSA-2048: 112位安全强度 ✅ 可用 SM2-256: 128位安全强度 ✅ 安全 ★ SM2用256位达到RSA-3072同等安全 密钥长度比 256 : 3072 ≈ 1:12 计算效率(相对倍数) 签名速度:SM2 ≈ 13x RSA 验签速度:RSA ≈ 1.3x SM2 加密速度:两者接近 解密速度:SM2 ≈ 13x RSA ★ 私钥操作SM2碾压,公钥操作持平 标准化与合规 RSA: ISO/IEC 18033-2, PKCS#1 SM2: GM/T 0003, 已纳入ISO 国内密评、等保强制要求SM2 国际生态:RSA成熟,SM2快速普及 ★ 新系统建议首选SM2 迁移建议 1. 评估现有RSA密钥长度 2. 对等升级:RSA-2048 → SM2-256 3. 实施双算法并行过渡期 4. 更新证书、SDK、协议栈 5. 密评验收,替换完成

4.6 综合建议

如果你正在做新旧迁移,我个人的判断是这样:

  1. 性能敏感场景(高并发签名、IoT终端设备):SM2是首选,密钥短功耗低。
  2. 合规要求场景(政府、金融、关键基础设施):必须用SM2,没得选。
  3. 国际业务并存场景:双算法并行,RSA用于旧客户端,SM2用于新系统。
  4. 长期安全考虑:SM2的256位密钥更抗量子攻击(虽然都危险,但短密钥可能更容易切换到后量子算法)。

核心结论:RSA已是昨日黄花,SM2是现在和未来。尽早迁移,省心省事省钱。