可以从ECDSA签名值$(r,s)$中恢复公钥吗?

请说明其工作原理。

#1 楼

实际上,不可能从ECDSA签名$(r,s)$中唯一地恢复公钥。即使我们还假设您知道曲线,使用的哈希函数,并且您还拥有已签名的消息,这仍然适用。

但是,带有签名和已签名的消息,以及了解曲线,可以生成两个公钥;其中之一将是与所使用的私钥相对应的公钥。 ,其中$ R'$的值为$ r $作为x坐标$ r $。
您还可以计算$ r ^ {-1} $,这是从签名(以曲线生成器的顺序为模)。然后,您计算$ z $,它是消息哈希值的最低$ n $位(其中$ n $是曲线的位大小) )。

然后,两个公钥为$ r ^ {-1}(sR-zG)$和$ r ^ {-1}(sR'-zG)$

很容易验证是否将ECDSA签名例程中的这两个值中的任何一个作为公钥插入,签名就有效。

评论


$ \ begingroup $
实际上,我正在尝试实现这一点,但是我认为还缺少一些东西。根据我的发现,第一个语句看起来并不完整(panda.cat/pubkeyrecover.png)x = r + jn其中j> = 0且j <= h。因此,仅当j = 0时,x = r。
$ \ endgroup $
– Jan Moritz
2014年8月12日17:05



$ \ begingroup $
@JanMoritzLindemann:我写的是假设您处于辅因子为1(h = 1)的曲线中。如果您正在处理具有较大辅因子的曲线,那么是的,您需要迭代辅因子的可能倍数,并拒绝不是$ G $倍数的任何点$ R $-您所链接的给了解释如何做到这一点。
$ \ endgroup $
–雨披
2014年8月12日17:24

$ \ begingroup $
是的,它是一条辅因子为1的曲线,但是即使使用这种曲线,j = 0和j = 1。还是我错过了什么?
$ \ endgroup $
– Jan Moritz
2014年8月12日17:32

$ \ begingroup $
@JanMoritzLindemann:您提供的链接似乎已失效;您从j = 0和j = h-1之间的值进行迭代;如果h = 1,则意味着您只需要考虑j = 0
$ \ endgroup $
–雨披
2014年8月12日在18:03

$ \ begingroup $
请您解释一下我如何签名邮件,跳过发布密钥并对其进行编码,以便收件人可以唯一地确定密钥。假设辅因子为1,这就是比特币曲线。我找不到任何有关创建与其核心软件兼容的可恢复签名的文档。
$ \ endgroup $
– Jus12
17/12/27在5:22

#2 楼

正如@poncho所说,两个密钥$ Q_1 = r ^ {-1}(sR-zG)$和$ Q_2 = r ^ {-1}(sR'-zG)$都会验证给定的签名,即$(s ^ {-1} zG + s ^ {-1} rQ_i)_x = r \ mod {n} $。对于某些曲线,概率很小但非零,我们有$ n \ leq(kG)_x


评论


$ \ begingroup $
事实证明,在我的情况下(比特币消息签名),他们在签名后附加了一个额外的字节,以便识别两点中的哪一个是公钥。完成此操作后,他们将计算公钥的160位哈希值。此哈希称为比特币地址。然后,他们检查生成的地址是否与给定的地址相等,并且是否验证了消息。通过使用这种方式,他们赢得了一些字节。
$ \ endgroup $
– Jan Moritz
14年7月15日在6:04

$ \ begingroup $
“对于某些曲线,可能性很小但非零”,比特币使用secp256k1曲线。这是存在这种可能性很小的曲线之一吗?我已经看到,在返回签名消息之前,他们会检查他们是否能够正确提取公钥。
$ \ endgroup $
– Jan Moritz
2014年7月15日在6:05



$ \ begingroup $
我已经在p = 23,a = 13,b = 10,n = 19,G =(18,2)的一个小示例上进行了测试,并看到了失败。对于secp256k1,我们有(p-n)/ p = + 4e-39,因此极有可能您将无法恢复原始的公钥。但是,如果签名者知道接收者将以这种方式恢复公钥,则他/他可以测试密钥的恢复并在极少数情况下失败的情况下重新签名(选择新的k)。
$ \ endgroup $
–史蒂夫·米切尔(Steve Mitchell)
2014年7月15日在22:02