首页/安全/加密与证书速查/SM2 签名流程与 ZA 值
加密算法基础95 条

SM2 签名流程与 ZA 值

SM2 签名在标准哈希过程中引入 ZA(用户标识与公钥的杂凑值),再对消息摘要签名;用户标识默认值为 1234567812345678,双端不一致会导致验签失败。

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

SM2 签名与 ZA 值

SM2 是国密体系中的椭圆曲线公钥算法。它的签名流程与 ECDSA 相似,但有一个关键差别:签名前必须先把用户标识 IDA 与曲线参数、公钥坐标等一起做 SM3 杂凑得到 ZA 值,再把 ZA 与消息摘要拼接后参与运算。用户标识的默认值是固定字符串 1234567812345678,双方必须使用同一个 IDA,否则表现只是验签失败,错误信息很难指向真实原因。

基本信息

ZA 组成ENTL、IDA、曲线参数 a/b、基点与公钥坐标的 SM3 杂凑
默认用户标识1234567812345678
签名输出(r, s)两个分量
配套摘要SM3
双证书体系签名证书与加密证书分离
互通前提双方对 IDA 与曲线参数的理解完全一致

典型使用场景

  • 国密合规改造:把签名算法替换为 SM2,摘要替换为 SM3
  • 对接第三方系统:先确认双方是否都使用默认用户标识
  • 排查验签失败:依次核对 IDA、曲线参数与签名数据格式
  • 证书体系设计:区分签名证书与加密证书,避免密钥混用
  • 与硬件密码机联调:确认设备侧的 ZA 计算方式与软件实现一致

签名与验签

签名与验签
# 使用 SM3 摘要做签名与验签
openssl dgst -sm3 -sign sm2.key -out sig.bin data.bin
openssl dgst -sm3 -verify sm2.pub -signature sig.bin data.bin
# 另一种写法:对原始数据直接签名与验签
openssl pkeyutl -verify -pubin -inkey sm2.pub -rawin -in data.bin -sigfile sig.bin
# 查看密钥所用曲线,确认是 SM2
openssl pkey -in sm2.key -text -noout | head -5

常见失败原因

现象原因处置
验签失败但签名长度正常双方用户标识不一致显式配置相同的 IDA
与硬件设备不互通ZA 计算或曲线参数有差异用标准测试向量逐项比对
摘要不匹配一侧用了 SHA-256 而非 SM3统一摘要算法
签名格式报错(r, s)编码方式不同确认是 DER 还是裸值拼接
使用非默认用户标识(如企业统一标识)时,签名与验签双方必须显式配置相同的 IDA,否则结果只表现为验签失败。
测试向量是打通互通的最快路径:用标准文档给出的 ZA 与签名示例逐项核对,能迅速判断问题出在 ZA 计算、摘要算法还是编码格式。
双证书体系要落到密钥管理上:签名密钥与加密密钥轮换节奏不同,混用会让证书更新牵连业务,登记时按用途分开记录。

易错点

  • 把 SM2 签名当作「ECDSA 换曲线」实现会漏掉 ZA 计算,导致与标准实现不互通
  • 签名证书与加密证书用途分离,签验签只能使用签名证书对应的密钥
  • 双方 IDA 不一致时错误信息不直观,容易误判为密钥问题
  • 摘要算法用错(如用 SHA-256 配 SM2)会直接导致验签失败
  • 忽略签名值编码差异,跨系统传输时出现长度或格式报错

数据来源与参考

  • GB/T 32918.2-2016(SM2 数字签名算法)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌