首页/安全/加密与证书速查/SM3 密码杂凑算法(国密)
加密算法基础95 条

SM3 密码杂凑算法(国密)

国密哈希标准(GB/T 32905-2016):输出 256 位、块长 512 位、64 轮,用于 SM2 签名、TLCP 的 PRF/MAC 与国密设备校验。

加密与证书速查安全更新于 2026-10-13

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 对照

维度SM3SHA-256
标准GB/T 32905-2016FIPS 180-4
输出 / 块长256 位 / 512 位256 位 / 512 位
轮数64 轮64 轮
结构细节不同的常量与消息扩展标准 Merkle-Damgard 参数
结果可互换否否
适用场景国密体系与合规项目国际通用场景
协议对接必须双方都启用 SM3:SM3 与 SHA-256 的常量与扩展过程不同,输出完全不一样,不能用「都是 256 位哈希」来假设可互相替代。对接前先用官方测试向量比对一次,能省掉大量排查时间。
HMAC-SM3 在部分库与硬件模块上支持情况不一:有的只提供 SM3 摘要而没有 HMAC 封装,有的性能欠佳。选型时把「摘要、HMAC、KDF」三类能力分别确认,不要用「支持 SM3」一句话概括。

易错点

  • 把 SM3 与 SM4 混用概念:SM3 是哈希,SM4 是分组加密,角色与接口完全不同
  • 假设 SM3 与 SHA-256 可互换:两者结果不同,混用表现为校验失败或签名验签不通过
  • 对接前不做测试向量自检:实现差异会被误判为配置问题,实际是算法实现不一致
  • 只在部分链路启用 SM3:TLCP 中 SM3 同时参与摘要、MAC 与密钥派生,缺一层就会握手失败
  • 忽略库与设备能力差异:老版本 OpenSSL 或密码模块可能只支持部分 SM3 用法,需提前验证

数据来源与参考

  • GB/T 32905-2016(SM3 密码杂凑算法)
  • GB/T 38636-2020(TLCP)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌