SM3 是什么
SM3 是中国商用密码标准中的密码杂凑算法(GB/T 32905-2016):输出 256 位、块长 512 位、64 轮压缩,结构与 SHA-256 相近但常量、置换与消息扩展都不同,因此两者结果不可互换。它用于 SM2 签名的摘要、TLCP 的报文校验与密钥派生、以及 HMAC-SM3 与国密设备的完整性校验。
基本信息
| 标准 | GB/T 32905-2016(早期 GM/T 0004) |
|---|---|
| 输出长度 | 256 位(32 字节) |
| 块长度 | 512 位 |
| 轮数 | 64 轮 |
| 配套算法 | SM2 签名、SM4 加密、TLCP 的 MAC 与 PRF |
| 支持情况 | OpenSSL 1.1.1 起提供,部分旧版本需确认 |
| 典型用途 | 国密证书签名摘要、报文完整性、口令派生 |
典型使用场景
- 国密证书与签名:SM2 签名的摘要固定为 SM3
- TLCP 报文完整性:握手与数据面用 SM3 计算校验值
- HMAC-SM3:接口签名与消息认证的国密版本
- 口令与密钥派生:国密体系下的 KDF 底层哈希
- 文件校验:国密改造项目中替换 SHA-256 清单
- 设备与网关互通测试:用标准测试向量验证对端实现
计算与测试向量
计算与测试向量
# 标准测试向量:输入 abc 的 SM3 结果固定,可用于自检
printf '%s' abc | openssl dgst -sm3
# 输出应为 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
# 与 SHA-256 对照,确认二者结果不同(不可互换)
printf '%s' abc | openssl dgst -sha256
# 确认当前 OpenSSL 是否支持 SM3
openssl list -digest-algorithms | grep -i sm3
# 大文件流式计算
openssl dgst -sm3 /data/big.iso与 SHA-256 对照
| 维度 | SM3 | SHA-256 |
|---|---|---|
| 标准 | GB/T 32905-2016 | FIPS 180-4 |
| 输出 / 块长 | 256 位 / 512 位 | 256 位 / 512 位 |
| 轮数 | 64 轮 | 64 轮 |
| 结构细节 | 不同的常量与消息扩展 | 标准 Merkle-Damgard 参数 |
| 结果可互换 | 否 | 否 |
| 适用场景 | 国密体系与合规项目 | 国际通用场景 |
协议对接必须双方都启用 SM3:SM3 与 SHA-256 的常量与扩展过程不同,输出完全不一样,不能用「都是 256 位哈希」来假设可互相替代。对接前先用官方测试向量比对一次,能省掉大量排查时间。
HMAC-SM3 在部分库与硬件模块上支持情况不一:有的只提供 SM3 摘要而没有 HMAC 封装,有的性能欠佳。选型时把「摘要、HMAC、KDF」三类能力分别确认,不要用「支持 SM3」一句话概括。