当前位置:   article > 正文

SM2数字签名结果的分析,本应64字节,为啥有工具显示70字节、71字节、72个字节三种结果_bc库实现sm2签名,70,71字节

bc库实现sm2签名,70,71字节

SM2数字签名结果的分析,本应64字节,为啥有工具显示70字节、71字节、72个字节三种结果

由于编写了《商用密码与安全性评估》书籍,最近收到不少朋友的来信,询问为啥BC库的签名结果是三种字节长度?另一个问题就是密码测评师需要了解编程和代码么 ?

我先回答第二个问题,密码测评师是需要了解代码的,精通程序的测评师才能有利的分析密码算法实现的正确性和有效性,才能明白是不是真正实现了相应的算法而不是欺骗。

关于第一个问题,我们来分析下原因:

 

用工具和BC库为啥签名结果长度有70,71,72 三个结果呢?

把其中的一个结果拷贝下来分析:

3045022053158C29EA739622E0109971E6BBC89C068A9C647D190FA08D02D0EA8EE1AEE1022100C8E815C0A688D910E1890C29C639CB5BF53F2464768B132A5DCB9CF68CFC3D7B

把它转换成一个二进制文件

用ASN.1工具解析器打开该二进制文件:

 

可以看到有两个大整数组成,这应该就是签名结果的 R,S ,因此出现如此长度的签名结果是因为DER编码所致。

为啥后面是33字节? 因为填充了一个00字节,为啥填充零字节呢?看后面的整数的第一个字节C8 ,转换成二进制是11001000 ,根据整数的特性这个数就是负数了,而这里SM2用到的r,s都是无符号整数,所以要进行编码增加00000000的整数前缀,使得它是个正整数。

因此当r,s的最高位都是0位时,不需要填充,它就是等于增加了六个字节的标志字节,累计70字节;当其中一个最高位是1位时,需要填充00,它就是等于增加了七个字节的标志字节,累计71字节;当两个最高位都是1位时,都需要填充00,它就是等于增加了八个字节的标志字节,累计72字节

结合BC库源代码再核实一下是不是DER编码:

 

 

总结:密评中签名结果判断第一个字节应该是30 ,第二个字节如果是44 ,后面肯定有两个0220 ;第二个字节如果是45 ,后面出现一个0220,一个022100 ;第二个字节如果是46 ,后面出现两个022100

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/998379
推荐阅读
相关标签
  

闽ICP备14008679号