密码学系列 - 国密SM2为什么不支持恢复公钥

情况

国密SM2目前不能通过签名和消息摘要恢复出公钥, 故不太适合将以太坊, EOS之类的公链代码底层密码库替换成国密库, 因为它们的椭圆曲线验签采用的都是recover模式, 而非verify模式.

  • verify模式: 输入签名, 消息摘要, 公钥; 输出是否是该公钥对应的私钥做的签名
  • recover模式: 输入签名,消息摘要, recoverid; 输出签名时使用的私钥对应的公钥

原因

在secp256k1我们可以根据签名{r,s}和消息恢复公钥,但是SM2却不能通过签名和消息恢复公钥,因为在SM2的h值计算过程中,SM2用到了公钥的坐标,所以必须知道公钥了,和只有签名和消息recover公钥相矛盾。

消息摘要h的生成过程(h在签名,verify和recover时都是需要的)

ZA = SM3 [ENTLA+IDA+a+b+Gx+Gy+Px+Py]
h = SM3 [ZA||MSG]

变通方法

因为SM2无法通过签名和消息recover公钥,所以在对交易验证的过程,需要取出公钥然后验证。但是,在类似EOS的账号系统里,一个账号可以拥有几个公钥,所以需要遍历账号的公钥验证交易,导致多公钥账号的交易执行性能会低些。幸运的是,系统内绝大多数账号只有一对公私钥,所以理论上不会对系统整体性能造成影响。

参考:
https://blog.csdn.net/weixin_39606244/article/details/112961507
https://zhuanlan.zhihu.com/p/369012651


往期精彩回顾:
区块链知识系列
密码学系列
零知识证明系列
共识系列
公链调研系列
比特币系列
以太坊系列
EOS系列
Filecoin系列
联盟链系列
Fabric系列
智能合约系列
Token系列

猜你喜欢

转载自blog.csdn.net/wcc19840827/article/details/120951082