SM4 是什么
SM4 是中国商用密码标准中的对称分组算法,标准号 GB/T 32907-2016(早期密码行业标准 GM/T 0002-2012):分组 128 位、密钥 128 位、32 轮迭代,采用与 AES 类似的 SPN 结构但参数、S 盒与轮函数完全不同,两者不可互相替代。它主要出现在 TLCP 传输加密、WAPI 无线认证与国产密码设备里。
基本信息
| 标准 | GB/T 32907-2016 / GM/T 0002-2012 |
|---|---|
| 分组长度 | 128 位(16 字节) |
| 密钥长度 | 128 位(仅一种) |
| 轮数 | 32 轮 |
| 结构 | SPN,轮函数含非线性变换与线性变换 |
| 工作模式 | ECB/CBC/CTR/GCM 等,国密协议多用 GCM 或 CBC |
| 常见载体 | OpenSSL(1.1.1 起)、国密网关、密码机、国产中间件 |
典型使用场景
- TLCP 传输加密:国密站点与网关之间以 SM4-GCM 或 SM4-CBC 保护数据面
- 国密改造项目:金融、政务系统按合规要求替换 AES/SHA 系列算法
- WAPI 无线认证:终端与接入点之间的数据加密
- 国产密码设备:密码机与加密卡对外提供 SM4 加解密接口
- 数据静态加密:部分国产数据库与存储产品以 SM4 做透明加密
- 协议与设备互通测试:验证对端实现是否符合标准测试向量
OpenSSL 使用示例
OpenSSL 使用示例
# 口令派生密钥后加密文件,salt 与迭代次数随文件保存
openssl enc -sm4-cbc -pbkdf2 -salt -in data.txt -out data.sm4
# 解密(参数需与加密一致)
openssl enc -d -sm4-cbc -pbkdf2 -in data.sm4 -out data.txt
# 显式指定 16 字节密钥与 IV,便于与国密设备对接
openssl enc -sm4-cbc -K 0123456789abcdeffedcba9876543210 -iv 000102030405060708090a0b0c0d0e0f -in data.txt -out data2.sm4
# 测量本机 SM4 吞吐,判断是否需要硬件密码模块
openssl speed -elapsed -evp sm4-cbc
# 确认当前 OpenSSL 是否提供 SM4(老版本可能缺失)
openssl list -cipher-algorithms | grep -i sm4SM4 与 AES 对照
| 维度 | SM4 | AES |
|---|---|---|
| 标准来源 | GB/T 32907(中国商用密码) | FIPS 197(美国 NIST) |
| 分组 / 密钥 | 128 位 / 仅 128 位 | 128 位 / 128、192、256 位 |
| 轮数 | 32 轮 | 10、12、14 轮 |
| 典型协议 | TLCP、WAPI | TLS、IPsec、WPA2/3 |
| 合规场景 | 国内等保与国密改造项目 | 国际通用与出口场景 |
| 硬件加速 | 依赖国产密码模块或软件优化 | x86 AES-NI、ARM 密码扩展广泛可用 |
TLCP(GB/T 38636)中 SM4 与 GCM 组成认证加密套件(如 ECC_SM4_GCM_SM3),一次完成加密与完整性校验;单独使用 SM4-CBC 仍要面对填充与完整性风险,做法与 AES-CBC 相同:随机 IV、加密后追加 MAC、统一错误响应。
部分老版本 OpenSSL 与第三方库对 SM4 的支持只覆盖 ECB/CBC,缺少 GCM 或缺少 HMAC-SM3 优化。集成前先确认库版本与 provider 配置,不要假设「有 SM4 就有全套国密能力」。
国密项目落地不只是换算法:证书体系(SM2 双证书)、协议栈(TLCP 版本)、随机数源与密码模块认证都要同步评估。跨厂商互通问题多数出在这些外围环节,而不是 SM4 本身。
TLCP 常见套件
| 套件 | 组成 | 说明 |
|---|---|---|
| ECC_SM4_GCM_SM3 | SM2 签名证书 + SM4-GCM + SM3 | 无前向保密,兼容性较好 |
| ECDHE_SM4_GCM_SM3 | 临时密钥交换 + SM4-GCM + SM3 | 具备前向保密,新系统优先选用 |
| ECC_SM4_CBC_SM3 | SM4-CBC + SM3 校验 | 兼容老设备,需注意 CBC 相关风险 |
| ECDHE_SM4_CBC_SM3 | 临时密钥交换 + SM4-CBC + SM3 | 兼容与安全折中,条件允许时仍优先 GCM |
国密站点通常使用双证书体系:一张签名证书用于握手认证,一张加密证书用于密钥交换。部署时要确认两套证书都在有效期内、都由对端信任的 CA 签发,否则会出现在普通浏览器正常、国密通道却握手失败的割裂现象。
SM4 在缺少专用指令的通用 CPU 上通常慢于有 AES-NI 加速的 AES。高吞吐场景应评估密码卡或国密网关卸载,或选择带 SM4 硬件扩展的国产处理器;不要直接套用 AES 的吞吐数据做容量规划。