GM/T 0004-2012 SM3 密码杂凑算法标准解读:从规范框架到密评合规

标准规范 · 2026-11-06

概述

GM/T 0004-2012《SM3密码杂凑算法》是由国家密码管理局发布的商用密码行业标准,于2012年3月21日发布,2012年7月1日实施。该标准规定了SM3密码杂凑算法的技术要求,包括算法描述、测试向量和规范符合性判定方法。

SM3算法是我国自主设计的密码杂凑算法,输出长度为256比特,安全性与SHA-256相当。该标准与GB/T 32905-2016《信息安全技术 SM3密码杂凑算法》构成完整的标准体系,其中GM/T 0004是行业标准,GB/T 32905是对应的国家标准。

标准结构

GM/T 0004-2012标准共分为六个章节:

章节内容说明
第1章范围明确标准的适用范围
第2章规范性引用文件列出标准引用的相关文件
第3章术语和定义定义标准中使用的术语
第4章算法描述详细描述SM3算法的数学原理和实现步骤
第5章测试向量提供用于验证实现正确性的标准测试向量
第6章规范符合性判定说明如何判定实现是否符合标准要求

标准层级关系

CODE
GM/T 0004-2012(行业标准)
    ├── 对应国家标准:GB/T 32905-2016
    ├── 配套标准:GM/T 0002-2012(SM2椭圆曲线公钥密码算法)
    └── 应用场景:GM/T 0009-2012(SM2密码算法使用规范)

核心要求解读

4.1 算法描述

标准第4章详细规定了SM3算法的完整实现细节:

消息填充规则:

  • 对原始消息进行填充,使其长度满足 $len \equiv 448 \pmod{512}$ 比特
  • 填充内容包括:1位"1"、若干位"0"、以及64比特的原始消息长度
  • 最终消息被分为512比特的块序列
压缩函数设计:
  • 采用Merkle-Damgård迭代结构
  • 初始值 $IV$ 为固定常量(与SHA-256不同)
  • 每轮使用64个常数 $T_t$($t = 0, 1, \ldots, 63$)
  • 消息扩展函数 $MM_i$ 将512比特输入扩展为132比特
布尔函数与置换函数:
  • 标准定义了四个布尔函数 $FF_0, FF_1, \ldots, FF_3$ 和四个置换函数 $GG_0, GG_1, \ldots, GG_3$
  • 这些函数在不同轮数中使用不同的组合

4.2 关键参数

参数值说明
输出长度256 bit与SHA-256相同
分组长度512 bit与SHA-256相同
轮数64与SHA-256相同
结构Merkle-Damgård经典迭代结构
初始值 IV固定常量标准附录A定义
常数 T_t64个32位常量部分基于 $\pi$,部分基于 $e$

4.3 测试向量

标准第5章提供了三组测试向量:

测试向量1(空消息):

CODE
消息 M = ""(空字符串)
期望杂凑值 H(M) = 
    1ab21d83a3105a4c2d5c2e5c8e5f1e5c8e5f1e5c8e5f1e5c8e5f1e5c8e5f1e5c

测试向量2(短消息):

CODE
消息 M = "abc"
期望杂凑值 H(M) = 
    66c7f0f4420edb2a2b0de386b32b983f2b2e5e1e5c8e5f1e5c8e5f1e5c8e5f1e5c

测试向量3(长消息):

CODE
消息 M = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
期望杂凑值 H(M) = 
    debe9fcc93d65556bb5c797aa2d7e5e5c8e5f1e5c8e5f1e5c8e5f1e5c8e5f1e5c
注意:以上测试向量为示例格式,实际测试向量请以标准原文为准。标准附录B提供了完整的测试向量数据。

与GB/T 32905-2016的关系

GM/T 0004-2012与GB/T 32905-2016是同一算法的两个标准版本:

维度GM/T 0004-2012GB/T 32905-2016
标准类型密码行业标准国家标准
发布机构国家密码管理局国家标准化管理委员会
发布时间2012年3月21日2016年12月30日
实施时间2012年7月1日2017年7月1日
技术内容相同相同
适用范围商用密码产品更广泛的信息化领域
选择建议:
  • 密码产品研发:优先遵循GM/T标准
  • 通用信息化系统:可采用GB/T标准
  • 密评合规:两者均可作为依据

密评合规要点

5.1 合规判定标准

根据GM/T 0034-2014《基于SM2算法的证书认证系统密码及其相关安全技术规范》和GM/T 0054-2018《信息系统密码应用基本要求》,SM3算法的合规要求包括:

  • 算法合规性:必须使用标准定义的完整算法,不得修改压缩函数或替换布尔函数
  • 输出长度合规:必须输出完整的256比特杂凑值,不得截断
  • 测试向量验证:实现必须通过标准附录B提供的测试向量验证
  • 实现完整性:必须完整实现消息填充、压缩函数和输出变换三个步骤

5.2 常见不合规情况

不合规项原因分析修复建议
使用自定义IV修改了初始值恢复为标准定义的IV
输出截断只使用前128比特输出完整256比特
替换布尔函数使用了不同的FF/GG函数恢复为标准定义的函数
消息填充错误未按标准格式填充按照标准第4.1节重新实现

5.3 测试向量验证方法

实施单位应使用标准附录B的测试向量验证实现正确性:

PYTHON
from gmssl.sm3 import sm3_hash
from gmssl.func import bytes_to_list

# 测试向量1:空消息
msg1 = b""
result1 = sm3_hash(bytes_to_list(msg1))
print(f"Test 1: {result1}")  # 应与标准附录B一致

# 测试向量2:abc
msg2 = b"abc"
result2 = sm3_hash(bytes_to_list(msg2))
print(f"Test 2: {result2}")  # 应与标准附录B一致

工程实施建议

6.1 库选型建议

库名称支持情况推荐场景
gmssl✅ 完整支持国密产品开发
OpenSSL (国密版)✅ 支持通用服务器应用
Bouncy Castle✅ 支持Java应用
cryptography⚠️ 有限支持Python应用(需确认版本)

6.2 实现注意事项

  • 大小端问题:标准定义的常量和初始值均为大端序,确保实现时使用正确的字节序
  • 性能优化:SM3的64轮运算可考虑使用查表法加速,但需注意侧信道安全
  • 内存安全:避免在内存中长时间保留中间计算结果,使用后立即清零

6.3 与其他算法的对比

算法标准编号输出长度安全强度适用场景
SM3GM/T 0004-2012256 bit128 bit国密场景
SHA-256FIPS 180-4256 bit128 bit国际场景
SHA-3FIPS 202224/256/384/512 bit112/128/192/256 bit新系统设计

总结

GM/T 0004-2012是SM3密码杂凑算法的权威规范,其核心价值在于:

  • 定义了完整的算法规格:从消息填充到压缩函数到输出变换的完整流程
  • 提供了可验证的测试向量:确保不同实现的互操作性
  • 明确了合规判定标准:为密评提供技术依据
实施单位应严格遵循标准定义,不得随意修改算法参数或替换内部组件。同时,应定期进行测试向量验证,确保实现的持续合规性。

相关实践

参考来源

  • GM/T 0004-2012《SM3密码杂凑算法》
  • GB/T 32905-2016《信息安全技术 SM3密码杂凑算法》
  • GM/T 0009-2012《SM2密码算法使用规范》
  • GM/T 0054-2018《信息系统密码应用基本要求》