SM2签名的预处理过程

您所在的位置:网站首页 Java预处理是什么意思 SM2签名的预处理过程

SM2签名的预处理过程

2024-07-13 06:50| 来源: 网络整理| 查看: 265

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3