比特币伪随机数漏洞

私有比特币密钥是1到115792089237316195423423985985008907907852837564279074904382605163141518161494337或16进制的整数值0xfffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd641414bbfd64。 在主要的比特币网络中,地址以1:压缩,未压缩; 3个地址:SigScript和SegWit向后兼容,以及以bc1开头的本机SegWit地址。 此外,已经有大约70个带有不同前缀的分叉,但与主要比特币的根源相同。

加密签名功能ECDSA()根据椭圆曲线计算比特币地址。

因此,考虑从私钥生成比特币地址。

私钥d-数字
公钥Q是等于dG的椭圆曲线的点,
其中G是曲线的基点。

  • 为了签名,在[1,n-1]的范围内选择一个随机数k。
  • 计算出曲线的点(x1,y1)= k * G
  • 它计算r = x1 mod N,其中N是曲线的阶数。
  • 它计算s = k-1(H(m)+ rd)mod N,其中k-1是N到k模N的倒数。
  • H(m)是要签名的消息的哈希。

图片

签名是一对(r,s)。

变量“ k”是随机的,是在ECDSA算法中从操作系统的标准库中获得的。

因此,在整个函数中,您只能影响此变量。 给出两个攻击向量:

  1. 伪随机数漏洞
  2. 和普遍的运气,其中随机数下降两次


伪随机数发生器攻击


Nils Schneider于2013年1月28日在他的个人页面上率先对此问题进行了调查和发布。 但是问题仍然存在,而且已经有了新的规模。

对PRNG的软件攻击分为三种类型:
直接密码攻击基于对算法输出的分析。

基于输入数据的攻击可以分为对已知输入数据的攻击,对可重现输入数据的攻击以及对选定输入数据的攻击。

攻击基于揭示攻击者知道生成器的初始状态或初始状态的内部状态。

这里还包括软件中的书签,在该书签中,算法的创建者知道任何散列的伪随机数和链中的后续伪随机数。 由于数字看起来在整个范围内均匀分布,因此很难从外部确定这种算法。

软件漏洞还包括单个库中伪随机数生成不足。 例如SSL,OpenSSL,一些Java库,JavaScript等。 详细资料已在黑客期刊中反复描述,并且随着时间的流逝已成为密码学教科书中的示例。

比特币的威胁规模是多少?


具有完整的比特币节点,您可以比较和分组所有网络交易。 在每个地址的所有交易中比较变量“ k”并找到重复项就足够了。

我们在2016年底第一次进行对帐,然后数据库的地址总数超过2.1亿,交易总数超过1.7亿,签名4.47亿。 花了一周时间将易受攻击的地址扫描到十个线程中。

结果,发现了1327个具有相同签名的易受攻击的地址! 地址列表可在文章末尾找到。

这意味着您可以计算这些地址的私钥,这意味着可以控制资金。

最大的泄漏发生在2015年夏天。 JavaScript钱包Blockchain.info持续几个小时产生的变量“ k”的值相同。 导致大约200个比特币被盗!

如果消除软件漏洞的人为因素,则重合的可能性约为0.000296868%。 一点也不,但是我真的不想变得如此“幸运”并失去我的钱。

怎么处理呢?


如上所述,此漏洞仅在至少两次交易中发送付款并生成相同的变量“ K”时才有效。 因此,如果您不创建外向交易或最小化其数量,那么就不会有任何威胁。 这种想法早已在比特币协议BIP 32(分层确定性钱包,HD钱包)分层确定性钱包中实现。

他的想法是使用私钥,从中您可以获得无穷无尽的比特币地址链。 您可以使用一次性地址来接收每笔交易。 同时,HD钱包的余额是地址链中所有余额的总和。 通过外发交易,将从这些地址收集硬币,从而为每个比特币地址组成一个外发交易。 更改将定向到地址链中的新比特币地址。

该工作方案显着提高了钱包的安全性和匿名性。

参考文献:

[1] ECDSA-应用和实施失败,Markus Schmid,加州大学圣塔芭芭拉分校,CS 290G,2015年秋季。

[2] Nils Schneider:使用区块链中的弱签名恢复比特币私钥,博客条目,2013年1月28日。

[3] 私钥恢复组合攻击

[4] 脆弱地址列表和总体余额

Source: https://habr.com/ru/post/zh-CN430240/


All Articles