SM2签名的预处理过程

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45303938

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值