SM2签名的预处理过程

聊聊密码学

2020-08-03 23:32
关注

SM2签名及验证过程中,并不是直接计算被签名数据的摘要,而是要经过专门的预处理过程得到摘要。此过程包含两个阶段的摘要计算:

1)Z = SM3(ENTL || ID || a || b || x_G || y_G || x_A || y_A)

ENTL || ID || a || b || x_G || y_G || x_A || y_A表示签名元素数据的拼接(级联)。

其中,ENTL 是签名者 ID 的位长度,占两个字节;ID是签名者ID,国密标准里定义的缺省签名者ID用UFT_8字符串表示是“1234567812345678”,用十六进制表示是0x31323334353637383132333435363738。所以在缺省情况下,ENTL值是0x0080.a, b, x_G, y_G 都是SM2算法标准中给定的值。a和b是椭圆曲线y=x+ax+b的系数,x_G, y_G是SM2算法选定的基点的坐标。上述参数都是固定值:a=0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC

b=0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93

x_G= 0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7

y_G=0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0

x_A || y_A就是公钥两部分值的拼接,注意,没有0x04的部分;将上述各元素拼接值进行SM3运算,得到结果Z。2) H=SM3(Z || M)

Z是第一步运算得到的摘要,M是签名的原文,将两者拼接,再进行SM3摘要运算。得到的摘要就是预处理得到的结果,将用于后续的签名及验证运算。

另外,由于在运算过程中我们经常要用十六进制的形式表示数据,因此需要进行十六进制字符串与字节数组之间的转换,方法很多,这里推荐一种常用的(VB源码):

'十六进制字符串转换成字节数组

Public Function HexStringToByteArray(HexString As String, Optional BigEndian As Boolean = True) As Byte()

Dim datalen As Long

Dim bdata() As Byte

datalen = Len(HexString)

If ((datalen Mod 2) = 1) Or (datalen = 0) Then

Err.Raise -10001, , "字符个数应为大于1的偶数"

End If

ReDim bdata(datalen / 2 - 1)

Dim i As Long

If BigEndian Then

For i = LBound(bdata) To UBound(bdata)

bdata(i) = CByte("&H" & Mid(HexString, i * 2 + 1, 2))

Next i

Else

For i = LBound(bdata) To UBound(bdata)

bdata(UBound(bdata) - i + LBound(bdata)) = CByte("&H" & Mid(HexString, i * 2 + 1, 2))

Next i

End If

HexStringToByteArray = bdata

End Function

'字节数组串转换成十六进制字符

Public Function ByteArrayToHexString(ByteArray() As Byte, Optional BigEndian As Boolean = True) As String

Dim datalen As Long

datalen = UBound(ByteArray) - LBound(ByteArray) + 1

Dim i As Long

Dim hstr As String

Dim hexchr As String

If BigEndian Then

For i = LBound(ByteArray) To UBound(ByteArray)

hexchr = Hex(ByteArray(i))

If Len(hexchr) = 1 Then

hstr = hstr & "0" & hexchr

Else

hstr = hstr & hexchr

End If

Next i

Else

For i = UBound(ByteArray) To LBound(ByteArray) Step -1

hexchr = Hex(ByteArray(i))

If Len(hexchr) = 1 Then

hstr = hstr & "0" & hexchr

Else

hstr = hstr & hexchr

End If

Next i

End If

ByteArrayToHexString = hstr

End Function

上述转换过程都是默认大端优先。

举报/反馈