使用ECDSA维基百科页面的术语,ECDSA(和DSA)签名需要为每个签名提供一个随机的k值,以确保即使消息和密钥相同,每次签名也不同。对于某些应用,可能希望使用“恒定”签名。

在我看来,通过将“随机” k值设置为x-,实现“恒定” ECDSA不会有任何危害。消息哈希z的坐标(以某种任意方式转换为曲线点)乘以私钥。显然,该方法可以转换回DSA。

该方案对于无法访问随机数源的实现很有用。

这有什么问题吗?
比点乘法有更快的方法来生成合适的k吗?

评论

我不明白为什么要在$ k $的代中包括私钥。

@Paulo:如果您猜测$ k $,则可以从签名中重新计算私钥。 $ k $必须对任何攻击者隐藏;因此,其生成必须包含一些秘密数据。私钥是一些秘密数据。

@ThomasPornin啊,谢谢。看起来我混合了$ k $和$ r $。

相关博客文章:幸免于坏的RNG向下滚动到ECDSA签名

#1 楼

RFC草案描述了一种实现确定性(EC)DSA(带有测试向量)的方法。在此草案中,$ h(m)$(消息的哈希值)和$ x $都用作确定性PRNG的输入,该PRNG使用HMAC(即NIST指定的HMAC-DRBG); PRNG输出用于产生$ k $。我不确定您与$ x $的简单乘法是否足以保证安全性;理想情况下,应该使用随机预言,并且HMAC-DRBG最接近我可以找到的实用随机预言。

请注意,$ k $必须在$ [1,q -1] $范围(其中$ q $是子组顺序)。可以利用$ k $上的任何信息,即使是部分信息(例如,$ 1 $和$ 2 ^ {160} -q $之间的值的概率也比$ 2 ^ {160} -q $和$ q $之间的值的概率高两倍)

(一旦有时间,就会有一个新的草稿版本,草稿中会有一些文本更改-但测试向量相同-)

编辑:RFC现在以RFC 6979的形式发布。

评论


$ \ begingroup $
您是相关RFC的作者是一个巧合!它“已过期”-发生了什么事?您提出了一个很好的观点,就是不想担心检测质量差的随机数。
$ \ endgroup $
– ByteCoin
2011-09-29 22:53



$ \ begingroup $
@ByteCoin:草稿会在6个月后过期-这就是为什么它们被称为草稿。我以“独立提交”的形式提交了该文件(即不是来自IETF委员会),并发表了一些评论。我花了几个小时后便会提出新草案。至于关于$ k $的部分信息的技术,它是由Bleichenbacher发现的。 Serge Vaudenay在本文中说这是“私人交流”,因此并未在任何地方真正发表。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
2011年9月30日下午0:44

$ \ begingroup $
RFC 6979应该用于所有ECDSA签名。大多数强密码系统中的薄弱环节是对PRNG的依赖以及足够的熵。 TPRNG通常速度较慢且昂贵,但是密钥生成比签名生成要少得多。根据所需的私钥数量,离线的手动熵源(掷骰子或掷硬币)可能就足够了。如果没有RFC 6979,那将非常耗时。 RFC 6979可以防止由于Android OS中产生相同k值的PRNG有缺陷而导致的私钥(和比特币)被盗。
$ \ endgroup $
–杰拉德·戴维斯(Gerald Davis)
14年4月15日在16:02

$ \ begingroup $
RFC是不可变的;一旦发布,它们就永远不会改变。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
14年4月15日在16:40

$ \ begingroup $
@ Jus12:您无法从外部验证签名是否确定性地完成-除非两次询问相同的签名。如果您有一个用于计算签名的黑盒,请使其对相同数据签名两次;如果您获得相同输出的两倍,则签名算法很有可能是确定性的。根据设计,在单个签名上,您不应该知道内部k值是如何生成的。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
15年8月12日在13:45

#2 楼

M'Raihi等人在其1998年的SAC论文中展示了如何使用哈希函数确定Schnorr签名(非常类似于(EC)DSA),并证明了如果原始签名方案(具有随机性)是安全的,

Bernstein等人最近的EdDSA签名方案使用相同的技术来避免随机性。

评论


$ \ begingroup $
感谢您的参考。 EdDSA论文提到将k设置为消息和私钥的哈希值,对于许多应用程序来说,k会更快并且优于我最初的建议。
$ \ endgroup $
– ByteCoin
2011年9月29日12:52

#3 楼

这肯定会带来发起生日袭击的机会。
Oscar会创建两个具有相同值的散列消息-至少至少可以与sha1或MD5一起使用,并成功使您对它们进行签名。然后,他可以从签名中重建您的私钥。

我肯定会避免使用确定性的ECDSA签名,并将安全创建用于签名的随机数作为核心安全功能。 br />在ECDSA设置中,(P)RNG是攻击的主要目标。我认为,无论从原理上讲在数学上是否合理,篡改该部分都是危险的。

评论


$ \ begingroup $
这不起作用。如果发现哈希冲突,则两个消息具有相同的哈希$ z $。在我的方案中,这将导致相同的$ k $,因此签名是相同的,因此不会显示秘密密钥。
$ \ endgroup $
– ByteCoin
2012年1月23日14:45

$ \ begingroup $
如您所说,RNG是攻击的主要目标。正如Thomas Pornin所说的,实现很难知道其随机数的来源是否受到损害。我似乎还记得瑞士公司Crypto AG的某些设备以这种方式遭到破坏。更好地消除了对随机数的需求,因此消除了我,Pornin和Bernstein的方案。请注意,这与您的结论正好相反。
$ \ endgroup $
– ByteCoin
2012年1月23日19:53

$ \ begingroup $
我承认你是对的ByteCoin,我的建议行不通。考虑一下,我同意您的方案会奏效。尽管如此,它仍会从该过程中消除一个自由度,并且您将在同一过程中将密钥用于两个不同的目的,从而“感到危险”。出于偏执,我将使用一个用于此目的的独立第二密钥组件来实现它。
$ \ endgroup $
–迈克尔·安德斯(Michael Anders)
2012年1月24日7:20



$ \ begingroup $
@ByteCoin您程序的安全性取决于从消息和密钥导出k所涉及的哈希的单向性。如果这是关于整体安全性的话,那么似乎可以归结为以下问题:哈希的此属性是否比(P)RNG的随机性更容易捍卫(或证明)。
$ \ endgroup $
–迈克尔·安德斯(Michael Anders)
2012年1月24日7:20



$ \ begingroup $
@MichaelAnders ECDSA已经依靠安全性(“单向性”)或哈希函数,因为出于计算原因,该消息未签名,因此该消息的哈希已签名。如果散列函数受到损害,那么签名也将受到损害。攻击者可能无法获取私钥,但是攻击者可以对消息进行预映像,并且该消息将显示为受害者签名的消息。
$ \ endgroup $
–杰拉德·戴维斯(Gerald Davis)
14年4月15日在16:11