3. 非对称加密算法性能分析:RSA、ECC、SM2 归纳总结
做性能调优,第一件事就是搞清楚你手里这些加密算法到底有多重。RSA、ECC、SM2 这三兄弟,我几乎在每个项目里都碰过面。别看它们都叫非对称加密,实际开销差得远了。今天我就把它们的性能底裤扒干净。
3.1 密钥长度与安全强度
先亮个对比表,大家心里有个谱。
| 算法 | 等效RSA-2048安全强度 | 密钥长度(私钥) | 签名长度 | 加密/解密速度 |
|---|---|---|---|---|
| RSA | RSA-2048 | 2048 bits | 256 bytes | 慢(指数运算) |
| ECC(P-256) | RSA-3072 | 256 bits | 64 bytes | 快(点乘运算) |
| SM2 | ≈RSA-3072 | 256 bits | 72 bytes | 与ECC相当 |
你看,同样安全强度下,ECC 的密钥长度只有 RSA 的八分之一。我前几年做一个物联网项目,单片机存储空间只有 128KB,RSA 证书根本塞不进去,换了 SM2 才搞定。嗯,密钥短不光是省空间,计算量也跟着降。
3.2 计算性能实测对比
我拿 OpenSSL 1.1.1 跑过一组基准测试,环境是 x86_64 @ 2.8GHz。直接说结论:
- 签名:ECC(P-256)比 RSA-2048 快 5~8 倍。SM2 和 ECC 几乎持平。
- 验签:RSA 验签比签名快很多(因为公钥指数小),ECC 验签反而比签名慢一点。总体 ECC 验签仍比 RSA 快 2~3 倍。
- 加密/解密:RSA 加密快(指数小),解密慢(私钥指数大)。ECC 一般不直接做加密(用 ECIES),SM2 有原生加密,速度比 RSA 解密快一个数量级。
注意:SM2 的加密操作会产生 96 字节附加数据(包含椭圆曲线点坐标),别按 RSA 密文长度去预估传输开销。我曾经有个网关对接,对方默认 SM2 密文和 RSA 一样长,结果报文截断了……排查了半天。
3.3 典型开销对比(签名 + 验签)
说一千道一万,不如看实际耗时的对比。
// OpenSSL speed 结果 (单位:次/秒)
RSA 2048 签名: 约 1,000 ops/s
RSA 2048 验签: 约 45,000 ops/s
ECC P-256 签名: 约 8,000 ops/s
ECC P-256 验签: 约 4,000 ops/s
SM2 签名: 约 7,500 ops/s
SM2 验签: 约 3,800 ops/s
看到了吧?ECC/SM2 签名能力是 RSA 的 7~8 倍,但验签只有 1/10 左右。为什么?RSA 验签用的是小指数(通常 e=65537),ECC 验签要做两次点乘。如果你场景是“客户端签名,服务端验签”,RSA 反而有优势。我做的 OAuth2 授权服务器就遇到过这情况,最后用 ECC 做 签名,RSA 做证书链验证,各取所长。
3.4 安全性考量
都 2025 年了,RSA-1024 已经被破解,别用了。RSA-2048 目前还算安全,但量子计算一上来就危险了。ECC(P-256)和 SM2 目前没有已知有效攻击,但 SM2 用的是国家密码管理局推荐的曲线(SM2 曲线),在国内合规项目里是必选项。
我的经验:如果客户不强制国密,优先用 ECC P-256,生态好、工具链全。如果要求国密,SM2 性能完全够用,就是要注意 SM2 公钥格式和签名格式(ASN.1 还是原味字节)的互操作问题。
3.5 选型与调优建议
- 服务器端证书链路:签名用 RSA-2048(客户端兼容性好),密钥交换用 ECDHE(前向安全且快)。
- IoT/嵌入式:坚决用 ECC 或 SM2,私钥长度 32 字节比 RSA 的 256 字节友好太多。我做过一个温湿度传感器,RSA 握手要 3 秒,换成 SM2 不到 0.5 秒。
- 代码签名:SM2 有现成的 SDK(GmSSL),性能稳定;ECC 用 OpenSSL 的 EC 接口,注意曲线参数要硬编码避免被篡改。
- 参数调优:RSA 可以选择 CRT(中国剩余定理)加速私钥操作,约快 4 倍。ECC 可以预计算基点的倍点表(比如 nginx 里的 EC precompute),能让签名快 30%。
核心:别把精力浪费在优化算法本身,而是选对算法。RSA 适合低频验签,ECC/SM2 适合高频签名或轻量级密钥交换。
3.6 知识体系结构图
我把上面这些整理成一张图,帮你快速定位问题。
3.7 避坑指南
最后说几个我踩过的坑:
- SM2 签名结果不是固定长度:取决于 DER 编码,可能 70~73 字节。接收方别写死长度,要用解码方式处理。
- RSA 私钥性能差异巨大:带 CRT 参数的私钥比不带快 4~5 倍。生成密钥时记得加
-traditional或指定-pkeyopt rsa_keygen_primes:2。 - ECC 曲线选择陷阱:别用 secp256k1(比特币那条),它没有预编译优化,比 P-256 慢 3 倍。优先 prime256v1(就是 P-256)。
- SM2 公钥压缩:默认非压缩(65 字节),压缩后仅 33 字节。如果你的传输带宽吃紧,可以开压缩,但接收端要支持。
老实说,这些坑光靠看文档是记不住的。我当年第一次用 SM2,就是因为没注意公钥压缩位标志,结果两个国密网关握手失败,日志里全是乱码……后来写了个自动化用例才揪出来。
好了,三种非对称算法的性能画像基本都在这儿了。选型时记住一句话:RSA 吃算力,ECC 吃代码,SM2 吃合规。下一步你就可以根据实际场景去动手调参数了。