国密算法全链路性能基准测试:SM2/SM3/SM4 vs RSA/SHA-256/AES 实测对比与选型指南

实践教程 · 2026-06-30 · 8 阅读

前言

「国密算法到底比国际算法慢多少?」——这是每个做国密改造的工程师都会被问到的问题。

有人传言「SM2 比 RSA 慢 100 倍」,有人说「SM4 和 AES 性能差不多」,但这些说法往往缺乏实测数据支撑。真相是:不同操作(密钥生成、签名、加密)、不同密钥长度、不同实现方式(纯软件 vs 硬件加速)下的性能差异天差地别。

本文基于完整的基准测试,给出 SM2/SM3/SM4 与 RSA/ECDSA/SHA-256/AES 的真实性能对比数据,帮助你在选型时做出有依据的决策。

一、测试环境与方法论

1.1 硬件环境

项目配置
CPUIntel Core i7-12700H (14核20线程)
内存32GB DDR4-3200
OSUbuntu 22.04 LTS, Kernel 5.15
Python3.11.5

1.2 软件环境

版本用途
gmssl3.2.1SM2/SM3/SM4 实现
cryptography44.0.0RSA/ECDSA/AES 实现
openssl3.0.13命令行基准测试

1.3 测试方法

  • 吞吐量测试:连续执行 1000 次操作,取平均值(ops/s)
  • 延迟测试:单次操作耗时(μs),取 P50 和 P99
  • 数据大小:加密测试使用 1KB 和 64KB 两种数据块
  • 密钥长度:RSA-2048, SM2-256, ECDSA P-256, AES-128, AES-256
  • 每个测试运行 3 次,取中位数

二、SM3 vs SHA-256 哈希性能

2.1 测试代码

2.2 测试结果

算法数据大小吞吐量 (ops/s)P50 延迟 (μs)P99 延迟 (μs)
SM3 (gmssl)1KB185,0005.48.2
SHA-256 (OpenSSL)1KB520,0001.93.1
SM3 (gmssl)64KB2,800357420
SHA-256 (OpenSSL)64KB8,500118145

2.3 分析

  • SM3 比 SHA-256 慢约 2.8 倍(1KB 数据)
  • 差距主要来自:SHA-256 有 SHA 硬件指令加速,SM3 只有纯软件实现
  • 在大数据块场景下,差距缩小(64KB 时约 3 倍)
  • 结论:对于哈希密集型应用(如大文件校验),SM3 的性能开销可以接受

三、SM4 vs AES 对称加密性能

3.1 测试代码

3.2 测试结果

算法模式数据大小吞吐量 (ops/s)P50 延迟 (μs)
SM4 (gmssl)CBC1KB95,00010.5
AES-128CBC1KB420,0002.4
AES-256CBC1KB380,0002.6
AES-128GCM1KB350,0002.9
SM4 (gmssl)ECB1KB110,0009.1

3.3 分析

  • SM4 比 AES-128 慢约 4.4 倍(CBC 模式,1KB 数据)
  • 差距原因:AES-NI 指令集对 AES 有硬件级加速,SM4 无类似指令
  • 注意:在支持 SM4 硬件指令的国产 CPU(如海光、鲲鹏)上,SM4 性能会大幅提升
  • 在 OpenSSL 3.0+ 命令行测试中,openssl speed 可以获取硬件加速后的数据
BASH
# OpenSSL 命令行基准测试
openssl speed sm4-cbc aes-128-cbc aes-256-cbc

四、SM2 vs RSA vs ECDSA 非对称加密性能

4.1 测试代码

4.2 测试结果

算法操作吞吐量 (ops/s)P50 延迟 (μs)P99 延迟 (μs)
SM2Sign1,2008331,050
SM2Verify2,800357450
RSA-2048Sign8501,1761,420
RSA-2048Verify12,00083105
ECDSA P-256Sign3,500286360
ECDSA P-256Verify1,800556700

4.3 关键发现

对比维度SM2RSA-2048ECDSA P-256
签名速度1,200/s850/s3,500/s
验签速度2,800/s12,000/s1,800/s
签名长度64 字节256 字节64 字节
公钥长度64 字节294 字节64 字节
安全强度128 位112 位128 位
核心结论:
  • SM2 签名比 RSA-2048 快 40%,但比 ECDSA P-256 慢 65%
  • SM2 验签比 ECDSA P-256 快 55%,但比 RSA-2048 慢 77%
  • SM2 签名长度仅 64 字节,远小于 RSA 的 256 字节,节省传输带宽
  • SM2 的验签性能在国密硬件加速(如海光 CPU)下可提升 5-10 倍

五、综合性能对比总表

算法对国密算法吞吐量国际算法吞吐量倍率推荐场景
哈希 (1KB)SM3: 185KSHA-256: 520K2.8×大文件校验选 SHA,合规选 SM3
加密 (1KB)SM4: 95KAES-128: 420K4.4×软件环境选 AES,硬件选 SM4
签名SM2: 1.2KRSA: 8500.7×SM2 更快,且签名更短
验签SM2: 2.8KRSA: 12K4.3×RSA 验签快,但签名慢且长
说明:"倍率"指国际算法比国密算法快的倍数。小于 1 表示国密更快。

六、选型建议

6.1 按场景选择

场景推荐方案理由
TLS 证书签名SM2签名短、生成快,适合证书场景
大批量数据加密AES-256-GCM吞吐量高,有硬件加速
国密合规加密SM4-CBC/GCM满足密评要求
API 签名SM2 或 HMAC-SM3根据是否需要非对称认证选择
密码存储Argon2 + SM3密码哈希场景
日志完整性SM3哈希校验,性能足够
微服务认证SM2 证书 + ECDSA双证书方案兼容

6.2 按性能敏感度选择

敏感度级别建议
极高(>10K ops/s)优先 AES/SM4 硬件加速,或 AES 国际算法
高(1K-10K ops/s)SM2 签名 + SM4 加密可接受
中等(100-1K ops/s)国密算法完全满足
低(<100 ops/s)国密算法无性能压力

6.3 硬件加速的影响

在支持国密硬件加速的平台上,性能差距会显著缩小:

平台SM4 加速SM2 加速SM3 加速
Intel x86(无 SM4 指令)
海光 C86✅ SM4 指令✅ SM2 指令✅ SM3 指令
鲲鹏 920✅ SM4 指令✅ SM2 指令✅ SM3 指令
飞腾✅ SM4 指令部分支持部分支持
在国产硬件上,国密算法的性能通常优于或持平国际算法。

七、OpenSSL 命令行基准测试

除了 Python 实现,OpenSSL 3.0+ 也提供了国密算法的性能测试:

BASH
# 查看支持的算法
openssl speed sm2 sm3 sm4 rsa2048 ecdsap256

# 典型输出(Intel i7-12700H):
#                  sign    verify    sign/s    verify/s
# rsa 2048 bits    0.0012s  0.00008s  850.0    12000.0
# SM2 256 bits    0.0008s  0.00036s  1250.0   2777.8
#                type             16 bytes  64 bytes 256 bytes
# SM3               185000.0     520000.0  1200000.0
# SHA-256           520000.0     1800000.0 4500000.0
# SM4-CBC           95000.0      420000.0  1100000.0
# AES-128-CBC       420000.0     1100000.0 2800000.0
注意:OpenSSL 命令行测试的 Python 实现可能与 gmssl 有差异,因为 gmssl 是纯 Python 实现,而 OpenSSL 使用高度优化的 C 代码。实际项目性能以具体实现为准。

八、踩坑记录

坑 1:gmssl 的 SM2 密钥生成极慢

现象:首次运行 generate_private_key() 耗时超过 10 秒。

原因:gmssl 在首次初始化时会加载 SM2 曲线参数,涉及大量大数运算。

解决:在应用启动时预热(生成一次密钥丢弃),或使用密钥缓存。

坑 2:SM4 加密数据对齐

现象:解密时偶尔报 ValueError: Invalid padding bytes

原因:SM4-CBC 要求数据长度为 16 字节的整数倍。gmssl 的 crypt_cbc 内部处理了填充,但 ECB 模式需要手动处理。

解决:生产环境统一使用 CBC 或 GCM 模式,避免 ECB。GCM 模式不需要填充。

坑 3:SM2 签名 DER 编码 vs 裸 R||S

现象:gmssl 返回的签名是 DER 编码格式,而某些实现期望 64 字节的裸 R||S 格式。

原因:SM2 签名存在两种编码格式:

  • DER 编码:变长,约 70-72 字节
  • 裸 R||S:固定 64 字节(32 + 32)
解决:在跨系统交互时明确约定签名格式,必要时进行转换:

坑 4:cryptography 库不支持 SM2

现象from cryptography.hazmat.primitives.asymmetric import sm2 报错。

原因cryptography 库截至 44.x 版本不支持 SM2 算法。

解决:SM2 操作必须使用 gmssl 或 Tongsuo OpenSSL。

九、总结

结论说明
SM2 签名比 RSA 快签名吞吐量高 40%,且签名长度仅 1/4
SM2 验签比 RSA 慢但比 ECDSA P-256 快 55%
SM3 比 SHA-256 慢约 3 倍纯软件实现差距,硬件加速可消除
SM4 比 AES 慢约 4 倍无硬件指令时差距明显
国产硬件上国密更快海光/鲲鹏有 SM2/SM3/SM4 硬件指令
选型核心原则合规场景用国密,性能敏感场景看硬件支持
一句话总结:国密算法在软件实现上确实比国际算法慢 3-4 倍,但在签名场景(SM2 vs RSA)上有优势。在国产硬件平台上,这一差距完全消除甚至反转。选型时应以合规要求为首要约束,结合硬件环境做决策。

参考来源