由于工作原因,需要使用到国密加密算法,而且需要使用Python来做,于是就找来了Python中的gmssl库函数来进行使用。
在使用gmssl库的时候,可以使用在这个函数当中进行上面sm2自我签名与验签,但是其他工具产生的sm2签名无法通过该工具进行签名验证。在查找了GitHub之后,发现了问题所在,在对于sm2签名的时候,该函数是直接对于源数据进行签名,在算法的标准当中,签名是需要进行hash算法,对于源数据进行hash计算,产生中间值e,签名是对e进行签名的,同样,验签也是对e进行验签,所以该函数是不正确的。
改进办法,采用函数,对于原始数据进行hash计算,得出e值之后,使用e值进行签名与验签,即可和其他工具进行通用。
首先对于用户输入的参数进行计算Za值,使用sm3算法,算法的过程如下:
def sm2_hash_e(data, id, idlen, publickey):
a = b'\xFF\xFF\xFF\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' \
b'\xFF\xFF\xFF\xFF\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFC'
b = b'\x28\xE9\xFA\x9E\x9D\x9F\x5E\x34\x4D\x5A\x9E\x4B\xCF\x65\x09\xA7' \
b'\xF3\x97\x89\xF5\x15\xAB\x8F\x92\xDD\xBC\xBD\x41\x4D\x94\x0E\x93'
gx = b'