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 计算、摘要算法还是编码格式。
双证书体系要落到密钥管理上:签名密钥与加密密钥轮换节奏不同,混用会让证书更新牵连业务,登记时按用途分开记录。