一、先来看下标准
参考《GM/T 0009-2023 SM2密码算法使用规范》
可知,单纯SM2签名、验签函数的入参待签名数据这块是不会进行预处理。
二、SM2签名验签注意事项
在A程序计算输出结果,找B工具验证算法正确性时,要特别注意待签名数据处理情况,否则会出现两者数据验签失败,细心一点的可以发现其中的奥秘,有些工具会标记_E后缀以示区分(Verify_E不做预处理)。
2.1 正常签名/验签逻辑
待签名裸数据X,预处理1得到Z,预处理2得到Ex值,Ex值给到签名验签函数生成签名R+S
2.2 出现问题原因(只列举一些)
1)有些签名、验签函数/工具,内置了预处理1、预处理2过程,因此入参是待签名裸数据X即可
2)不做预处理1、预处理2过程处理,直接将待签名裸数据X给到签名验签函数生成签名R+S (下面示例数据属于这种,要求数据输入长度为32个字节)
3)使用HASH代替预处理1、预处理2逻辑,将HASH结果直接给到签名验签函数生成签名R+S
2.3 验证示例数据(16进制格式)
SM2私钥: 68D7B97ED88CD84B06B03C97340F854FDAFC14FBB6CDBF3B42DCBDEB45128CC3
SM2公钥:
X:62EBF178DB7D4488F2596B0B48BDF5520F7BF7A155294269E38F8F5850782656
Y:68D7B97ED88CD84B06B03C97340F854FDAFC14FBB6CDBF3B42DCBDEB45128CC3
待签名裸数据(0x20长度,32个字节):
1234567890123456789012345678901234567890123456789012345678901234
将待签名裸数据,直接作为签名入参,计算结果:
R: 4087F8134051D03A5E85EE98028A292A3E06B5CD8B32EB1F3E7662A189CF4FD4
S: 24F8BE48211F14781DBFEB60B007F9410A410661644B5EE3C8BDB64022D9E8C5
此时,如果将待签名裸数据进行预处理1、预处理2后给到另外一个工具验签时会失败。
如果将待签名裸数据直接作为验签入参(注意该验签函数不参与计算预处理计算)时,验签成功。