6

进一步探讨比特币签名中的随机风险

 4 years ago
source link: https://news.huoxing24.com/20200328082900502298.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

yQrEfyv.jpg!web

众所周知,大家应该知道签名比特币交易时随机的 k 值有多么重要,我们甚至可以说,k 值的随机性与私钥的随机性一样重要。现在让我们更深入的探讨一下这个话题。

不安全的随机数生成器有可能会导致的 k 值重复(对应的 r 值当然也重复),进而造成私钥暴漏,那保证 k 值不重复总该没事了吧?

Filippo 甚至提到了 bitcoin-core/qt 也是不够安全的(2013 年的 Pull-Request 改进至今仍未被合并进主干),当然也包括了 blockchain.info(因为依赖于浏览器的随机数解决方案)。他关于 k 值的观点是「k must be secret and unique. NOT NECESSARILY RANDOM.」(k 值必须是保密且唯一的,并不一定必须随机)。

这句话其实并不十分严谨,因为「保密且唯一」其实就意味着要尽可能的「真」随机,至少也要做到密码学安全的随机,否则谈何「保密且唯一」呢,即便是 RFC6979 规范,也可以看成是一种特殊设计的、密码学安全的随机数生成方法。对于比特币安全来说,最重要的仍然是随机,因为我们面临的可不仅仅是「同一个私钥签出的不同交易中使用了重复的 k 值」这么一种风险,还有其它潜在的暴漏私钥的可能性,关于这些可能性,安全工程师、比特币开发者们需要学习,而黑客们也没准正忙着学习并分析历史上的区块链数据寻找机会偷币呢。

可能性 1:

使用相同钱包解决方案的用户 A 和用户 B,因该钱包所依赖的随机数生成器不够安全,导致 A 和 B 使用了相同的 k 值来签名交易,这在区块链数据上看到的现象就是由两个不同的比特币地址签出的交易中 r 值相同。在这种情况下,作为第三方观察者的黑客,可能拿这两个地址没办法,但从理论上讲,如果 A 记录了自己的 k 值,就能够计算出 B 的私钥,反之亦然。当然,因为没有人、也没有任何一个钱包软件会记录过去签名时所用到的 k 值(如果记录了,反而更有问题,因为如果有人获取了您之前使用过的 k 值,就能反推出您的私钥,进而盗取您的比特币),所以总体上来讲,此类的 r 值重复的风险要远小于由同一个地址签出的交易 r 值重复的情况。但也不排除有黑客分析出该钱包的随机数漏洞,通过缩小概率空间来尝试暴力破解 k 值,进而盗取该钱包用户的比特币资产。

可能性 2:

使用相同钱包解决方案的用户 A 和用户 B,因该钱包所依赖的随机数生成器不够安全,导致 A 和 B 出现了两次 k 值重复(不是自己和自己重复,而是与对方重复),即 A 用了 k1 和 k2,B 也用了 k1 和 k2。在这种情况下,任何一个第三方黑客,都能够反推出 A 的私钥和 B 的私钥,两个人的比特币资产均会被盗。

可能性 3:

因某钱包解决方案所依赖的随机数生成器不够安全,导致签名交易时使用的 k 值与私钥相同(钱包软件一般都会使用相同的随机数算法来生成私钥和计算 k 值),放心吧,交易一广播出去,币马上就丢,黑客运气好点、程序跑的快点的话,甚至有可能把刚广播的交易给双花了。

看到上述几种可能性,您就该明白,除了私钥的安全,k 值的随机性对于比特币安全来说有多么重要了吧?我们都知道,可以把比特币私钥看成是宇宙中有 2^256 个抽屉(其实私钥的范围要小于这个数),生成一个私钥就相当于随便抽出了一个抽屉往里面放钱,用这种方式,我们同样可以把 k 值看成是宇宙中有 2^256 个钥匙,每次花钱都要随便拿一把钥匙,用完就把钥匙扔掉。这两个过程都要保证是随机的,以避免能被其他人所复现,重复了就有可能导致财产损失,这就是小太为什么会说「随机是比特币的命根子」的根本原因。

历史上这些有问题的 r 值均出现过,其中单个地址 r 值重复直接导致过的丢币就有过很多次(这种情形对于黑客来说最容易判断),而本文中的这几种可能性也均发生过,但是否真导致了用户丢币就不得而知了,因为即便是真丢了,用户也可能不知道是为什么,偷的人到底是谁,怎么偷的,大家也不得而知。如前所述,k 值的概率空间是 2^256,即便是地球上的所有人每天从早到晚的用比特币在进行着交易,都不应出现重复。而当前仅仅百万个钱包、千万笔交易的数量级就导致了这么多次的 r 值问题,这足以说明,当前的不少钱包解决方案也「太不随机」了。历史上的一个块(322925)中,曾出现过很多个地址的很多笔交易的 r 值均重复(大哥,您签名比特币交易时是用了同一个 k 值,写个循环干的吗?)。

这里再补充一点,如果大家使用的都是密码学安全的、尽可能「真」的随机数生成器来生成 k 值,那么按道理来讲,整个区块链上的 r 值应该也是随机分布的,随着区块链上的交易数量越来越多,统计学上,r 值分布也应越来越均匀。但现实情况是整个区块链的 r 值分布非常集中(可能是拜一些钱包采用了不安全的随机数解决方案所赐),随着交易数量的不断增加,碰撞出有问题的地址的概率也就越来越高,这也是比特币未来发展巨大隐患,理应引起钱包解决方案提供商和比特币企业的足够重视,没准黑客比你们更重视哈!

最后,问大家一个问题,您的随机数,安全吗?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK