GM/T 0004-2012 SM3 密码杂凑算法标准解读:从规范框架到密评合规
概述
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_t | 64个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-2012 | GB/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 与其他算法的对比
| 算法 | 标准编号 | 输出长度 | 安全强度 | 适用场景 |
|---|---|---|---|---|
| SM3 | GM/T 0004-2012 | 256 bit | 128 bit | 国密场景 |
| SHA-256 | FIPS 180-4 | 256 bit | 128 bit | 国际场景 |
| SHA-3 | FIPS 202 | 224/256/384/512 bit | 112/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《信息系统密码应用基本要求》