GM/T 0009-2023 SM2密码算法使用规范:从算法标准到合规实施的桥梁
概述
SM2算法自2010年发布以来,已成为我国商用密码体系中最核心的非对称密码算法之一。然而,算法标准(GM/T 0003-2012 / GB/T 32918-2016)仅定义了SM2的数学结构和操作流程,却未明确规定"在什么场景下如何使用"——这正是GM/T 0009《SM2密码算法使用规范》的核心使命。
该标准经历了从2012年首版到2023年全面修订的演进。2023版(GM/T 0009-2023)在原有基础上进行了重大更新,新增了国密TLS协议(GM/T 0024 / RFC 8998)中SM2密钥交换的使用规范、明确了SM2公钥加密与数字信封的边界,并引入了与SM9标识密码的对比分析。
标准定位与体系关系
GM/T 0009-2023 在整个国密标准体系中处于承上启下的关键位置:
算法标准层 使用规范层 应用协议层
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ GM/T 0003 │───▶│ GM/T 0009 │───▶│ GM/T 0024 │
│ (SM2算法) │ │ (使用规范) │ │ (TLS协议) │
│ GB/T 32918 │ │ │ │ GM/T 0129 │
│ │ │ │───▶│ (SSH协议) │
└─────────────┘ └─────────────┘ └─────────────┘与相关标准的关系:
| 标准编号 | 名称 | 与GM/T 0009的关系 |
|---|---|---|
| GM/T 0003.1-2012 | SM2第1部分:总则 | 定义曲线参数和密钥格式 |
| GM/T 0003.2-2012 | SM2第2部分:数字签名 | 签名算法数学定义 |
| GM/T 0003.3-2012 | SM2第3部分:密钥交换 | 密钥交换协议数学定义 |
| GM/T 0003.4-2012 | SM2第4部分:公钥加密 | 加密算法数学定义 |
| GM/T 0003.5-2012 | SM2第5部分:参数定义 | 曲线参数 sm2p256v1 |
| GB/T 32918-2016 | SM2椭圆曲线公钥密码算法 | SM2的国家标准版本 |
| GM/T 0010-2023 | SM2密码算法加密签名消息语法规范 | SM2签名/加密的ASN.1消息格式 |
| GB/T 35275-2017 | SM2密码算法加密签名消息语法规范 | SM2消息语法的国家标准版本 |
核心内容解读
1. SM2数字签名的使用规范
#### 1.1 适用场景
GM/T 0009-2023 明确SM2数字签名适用于以下场景:
- 身份认证:验证消息发送方的身份真实性
- 数据完整性保护:确保消息在传输过程中未被篡改
- 抗抵赖:提供不可否认的证据,签名者无法否认其签名行为
标准规定了SM2签名的若干重要约束:
- 哈希算法强制使用SM3:SM2签名过程中的杂凑运算必须使用SM3算法,不得使用其他哈希函数替代。这是与ECDSA的核心区别——ECDSA可以使用任意哈希函数,而SM2签名规范中SM3是内置且不可替换的。
- Z值计算规范:SM2签名前需要计算实体信息杂凑值Z_A,其计算公式为:
Z_A = Hash_256(ENTL_A || ID_A || a || b || x_G || y_G || x_A || y_A)其中: - ENTL_A:用户标识的长度,以比特为单位 - ID_A:用户的唯一标识符 - a, b:椭圆曲线方程 y² = x³ + ax + b 的参数 - (x_G, y_G):基点G的坐标 - (x_A, y_A):用户公钥坐标
- 签名长度固定为512位:SM2签名结果 (r, s) 各占256位,合计512位(64字节),与ECDSA的变长签名不同。
- 私钥不可重用:每次签名必须使用不同的随机数 k,且k的生成必须满足GM/T 0005《随机性检测规范》的要求。
2. SM2密钥交换的使用规范
#### 2.1 协议流程
SM2密钥交换协议允许通信双方在不安全的信道上协商出一个共享密钥。GM/T 0009-2023 详细规定了交换过程中的三个关键阶段:
- 身份认证阶段:双方通过SM2数字签名验证对方身份
- 密钥协商阶段:双方交换临时公钥,计算共享密钥
- 密钥派生阶段:使用SM3算法从共享密钥派生出最终的会话密钥
2023版修订的一个重点是将SM2密钥交换与国密TLS协议(GM/T 0024)的使用进行了对齐。此前SM2密钥交换主要在点对点场景中使用,而GM/T 0024将其扩展到了TLS握手流程中——在ClientKeyExchange和ServerKeyExchange消息中使用SM2临时密钥对进行密钥协商。
#### 2.3 安全约束
- 临时密钥对必须在每次握手时重新生成
- 临时私钥在握手完成后必须立即销毁
- 不支持密钥持久化存储(与前向安全的要求一致)
3. SM2公钥加密的使用规范
#### 3.1 加密模式
SM2公钥加密提供两种使用模式:
| 模式 | 适用场景 | 密文组成 | ||||
|---|---|---|---|---|---|---|
| 直接加密 | 小数据量加密(< 256字节) | C1 | C3 | C2 | ||
| 数字信封 | 大数据量加密(通过SM4加密数据,SM2加密SM4密钥) | SM4密文 + SM2加密的密钥 |
SM2加密结果的密文采用 C1 || C3 || C2 的顺序排列,其中:
- C1:临时密钥对的公钥(65字节,未压缩格式)
- C3:SM3杂凑值,用于密文完整性验证(32字节)
- C2:加密后的密文数据
#### 3.3 与ECIES的关系
SM2公钥加密本质上是一种椭圆曲线Integrated Encryption Scheme (ECIES) 的实现。GM/T 0009-2023 在第6章专门讨论了SM2加密与ECIES标准(ANSI X9.63、ISO/IEC 18033-2)的对应关系和差异。
4. 密钥管理使用规范
#### 4.1 密钥生命周期
标准对SM2密钥的整个生命周期提出了明确要求:
生成 → 存储 → 分发 → 使用 → 轮换 → 归档 → 销毁各环节的关键要求:
| 环节 | 要求 | 参考标准 |
|---|---|---|
| 生成 | 必须使用符合GM/T 0005的随机数发生器 | GM/T 0005 |
| 私钥存储 | 必须存储于密码模块内部或受保护的存储介质中 | GM/T 0028 |
| 公钥分发 | 必须通过数字证书或可信渠道分发 | GM/T 0015 |
| 密钥轮换 | 建议每6-12个月轮换一次 | GB/T 39786 |
| 销毁 | 必须确保私钥无法恢复 | GM/T 0028 |
SM2使用256位椭圆曲线,其安全强度相当于128位的对称加密密钥。GM/T 0009-2023 给出了不同安全等级下的密钥管理要求:
| 安全等级 | 建议最小密钥长度 | 适用场景 |
|---|---|---|
| 1级(低) | 256位(SM2标准固定) | 一般数据传输 |
| 2级(中) | 256位 + 硬件保护 | 金融交易、身份认证 |
| 3级(高) | 256位 + HSM + 双人操作 | 密钥管理、CA根密钥 |
| 4级(极高) | 256位 + 多级HSM + 门限拆分 | 国家关键基础设施 |
2023版修订要点
GM/T 0009-2023 相较于2012版的主要修订内容包括:
1. 新增国密TLS中的SM2使用规范
2023版首次将SM2在GM/T 0024(国密TLS协议)中的使用纳入规范,包括:
- 在TLS握手中SM2临时密钥对的生成和使用要求
- SM2密钥交换与ECDH的互操作性说明
- 双证书体系下签名证书与加密证书的分离使用
2. 明确SM2签名与SM3的绑定关系
2012版对SM2签名中必须使用SM3杂凑的描述较为简略,2023版在第3章专门增设了"签名杂凑算法约束"小节,明确指出:
"SM2数字签名算法的杂凑运算必须使用SM3密码杂凑算法,不得替换为其他杂凑算法。如需使用其他杂凑算法,应选用SM9标识密码算法或其他支持灵活杂凑选择的签名方案。"
3. 新增SM2与SM9的对比使用指南
2023版新增了第8章"SM2与SM9的选择建议",从以下维度对比两种算法的适用场景:
| 维度 | SM2 | SM9 |
|---|---|---|
| 密钥管理 | 需要PKI体系管理证书 | 基于身份,无需证书 |
| 计算复杂度 | 较低(标量乘法) | 较高(配对运算) |
| 适用场景 | 签名、加密、密钥交换 | 大规模物联网、移动终端 |
| 性能(签名) | ~1ms(软件,量级估算) | ~5ms(软件,量级估算) |
| 性能(验签) | ~1ms(软件,量级估算) | ~10ms(软件,量级估算) |
4. 更新密钥管理安全等级要求
2023版将密钥管理的安全等级要求与GM/T 0028-2014《密码模块安全技术要求》进行了对齐,明确了不同安全等级下的密钥存储、使用和管理要求。
常见误用陷阱
陷阱1:用SECP256R1替代SM2
这是最常见也是最危险的错误。ec.SECP256R1() 是NIST P-256曲线,其曲线参数与SM2的sm2p256v1曲线完全不同:
| 参数 | SM2 (sm2p256v1) | NIST P-256 (SECP256R1) |
|---|---|---|
| p | FF FF FF FF FF FF FF FF FF FF C9 | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF |
| a | FF FF FF FF FF FF FF FF FF FF C9 | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FC |
| b | 28 E9 FA9E 9D 9F 5E34 4D5A | 5AC635D8 AA3A93E7 B3EBBD55 |
| 基点G | 由GM/T 0003.5定义 | 由NIST定义 |
正确做法:使用gmssl库的SM2实现或Tongsuo/OpenSSL的SM2支持。
陷阱2:混淆SM2签名的Z值计算
SM2签名的Z_A计算中,ID_A字段必须严格按照GM/T 0009的定义格式编码。常见错误包括:
- 使用UTF-8编码但未按比特长度填充ENTL_A
- 省略a、b、G坐标中的某些参数
- 将用户自定义的ID字符串直接拼接而不做标准化
陷阱3:SM2加密密文顺序错误
SM2加密密文的顺序是 C1 || C3 || C2,而非 C1 || C2 || C3。很多实现者误以为是先密文后杂凑值,导致验密失败。
陷阱4:SM2签名不自动使用SM3
与ECDSA不同,SM2签名算法内部硬编码了SM3杂凑。调用签名API时不应传入哈希算法参数——传入其他哈希算法(如SHA-256)的结果不是合规的SM2签名。
与密评标准的关联
GM/T 0009-2023 是GB/T 39786-2021《信息系统密码应用基本要求》中密码应用合规性评估的重要依据。在密评中,以下条款直接与GM/T 0009相关:
| GB/T 39786条款 | 内容 | GM/T 0009对应章节 |
|---|---|---|
| 8.1.3.2 | 应采用SM2算法进行身份鉴别 | 第3章(数字签名) |
| 8.1.3.3 | 应采用SM2算法进行数据传输加密 | 第4章(公钥加密) |
| 8.1.4.2 | 密钥应定期更换 | 第5章(密钥管理) |
| 8.2.3.2 | 通信双方的身份应使用SM2算法进行鉴别 | 第2章(密钥交换) |
- 应使用SM2算法进行身份鉴别,但使用了RSA等非国密算法
- SM2签名过程中使用了非SM3杂凑算法
- SM2密钥交换中使用了持久化的临时密钥
参考来源
- GM/T 0009-2023《SM2密码算法使用规范》,国家密码管理局
- GM/T 0003.1-2012 ~ GM/T 0003.5-2012《SM2椭圆曲线公钥密码算法》系列标准
- GB/T 32918-2016《SM2椭圆曲线公钥密码算法》
- GB/T 39786-2021《信息安全技术 信息系统密码应用基本要求》
- GM/T 0010-2023《SM2密码算法加密签名消息语法规范》
- GM/T 0024-2023《基于SM2密码算法的SSL/TLS协议技术规范》
- 国家密码管理局公告(第54号),2026年1月7日发布GM/T 0031-2025等20项标准