GM/T 0009-2023 SM2密码算法使用规范:从算法标准到合规实施的桥梁

标准规范 · 2026-07-03

概述

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 在整个国密标准体系中处于承上启下的关键位置:

CODE
算法标准层          使用规范层          应用协议层
┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ 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-2012SM2第1部分:总则定义曲线参数和密钥格式
GM/T 0003.2-2012SM2第2部分:数字签名签名算法数学定义
GM/T 0003.3-2012SM2第3部分:密钥交换密钥交换协议数学定义
GM/T 0003.4-2012SM2第4部分:公钥加密加密算法数学定义
GM/T 0003.5-2012SM2第5部分:参数定义曲线参数 sm2p256v1
GB/T 32918-2016SM2椭圆曲线公钥密码算法SM2的国家标准版本
GM/T 0010-2023SM2密码算法加密签名消息语法规范SM2签名/加密的ASN.1消息格式
GB/T 35275-2017SM2密码算法加密签名消息语法规范SM2消息语法的国家标准版本

核心内容解读

1. SM2数字签名的使用规范

#### 1.1 适用场景

GM/T 0009-2023 明确SM2数字签名适用于以下场景:

  • 身份认证:验证消息发送方的身份真实性
  • 数据完整性保护:确保消息在传输过程中未被篡改
  • 抗抵赖:提供不可否认的证据,签名者无法否认其签名行为
#### 1.2 关键约束

标准规定了SM2签名的若干重要约束:

  • 哈希算法强制使用SM3:SM2签名过程中的杂凑运算必须使用SM3算法,不得使用其他哈希函数替代。这是与ECDSA的核心区别——ECDSA可以使用任意哈希函数,而SM2签名规范中SM3是内置且不可替换的。
  • Z值计算规范:SM2签名前需要计算实体信息杂凑值Z_A,其计算公式为:
CODE
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算法从共享密钥派生出最终的会话密钥
#### 2.2 与前版的重大变化

2023版修订的一个重点是将SM2密钥交换与国密TLS协议(GM/T 0024)的使用进行了对齐。此前SM2密钥交换主要在点对点场景中使用,而GM/T 0024将其扩展到了TLS握手流程中——在ClientKeyExchange和ServerKeyExchange消息中使用SM2临时密钥对进行密钥协商。

#### 2.3 安全约束

  • 临时密钥对必须在每次握手时重新生成
  • 临时私钥在握手完成后必须立即销毁
  • 不支持密钥持久化存储(与前向安全的要求一致)

3. SM2公钥加密的使用规范

#### 3.1 加密模式

SM2公钥加密提供两种使用模式:

模式适用场景密文组成
直接加密小数据量加密(< 256字节)C1C3C2
数字信封大数据量加密(通过SM4加密数据,SM2加密SM4密钥)SM4密文 + SM2加密的密钥
#### 3.2 密文结构

SM2加密结果的密文采用 C1 || C3 || C2 的顺序排列,其中:

  • C1:临时密钥对的公钥(65字节,未压缩格式)
  • C3:SM3杂凑值,用于密文完整性验证(32字节)
  • C2:加密后的密文数据
这与传统的"公钥加密密文 || 杂凑值"顺序不同,是SM2标准的特有设计。

#### 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密钥的整个生命周期提出了明确要求:

CODE
生成 → 存储 → 分发 → 使用 → 轮换 → 归档 → 销毁

各环节的关键要求:

环节要求参考标准
生成必须使用符合GM/T 0005的随机数发生器GM/T 0005
私钥存储必须存储于密码模块内部或受保护的存储介质中GM/T 0028
公钥分发必须通过数字证书或可信渠道分发GM/T 0015
密钥轮换建议每6-12个月轮换一次GB/T 39786
销毁必须确保私钥无法恢复GM/T 0028
#### 4.2 密钥长度与安全等级

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的选择建议",从以下维度对比两种算法的适用场景:

维度SM2SM9
密钥管理需要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)
pFF FF FF FF FF FF FF FF FF FF C9FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
aFF FF FF FF FF FF FF FF FF FF C9FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FC
b28 E9 FA9E 9D 9F 5E34 4D5A5AC635D8 AA3A93E7 B3EBBD55
基点G由GM/T 0003.5定义由NIST定义
后果:使用SECP256R1生成的密钥无法与国密SM2系统互操作,无法通过密评。

正确做法:使用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章(密钥交换)
高风险判定:根据《信息系统密码应用高风险判定指引(2021年版)》,以下情况属于高风险:

  • 应使用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项标准