今天看到微信公众号的一片文章,介绍HD钱包的,其中有一段让我大跌眼镜
BIP32中一个已知的漏洞是前文提到的同时分发父公钥和子私钥情况下,父私钥将处于危险之中。在2013年,Vitalik在Bitcoinmagazine的博客中已经指出这一风险,并使用代码进行论证。他分别对Electrum钱包和BIP32钱包进行测试,结果显示,通过已知父公钥和子私钥,不仅可以获得同级对其他子私钥,还可以破解得出父私钥。
因为我之前自己写代码实现过BIP32,所以我对其中的算法细节还算是很清楚的。猛地看到说这里面居然有个这么严重的bug,心里还是咯噔一下。为了彻底研究这个问题,我找来vitalik的原文仔细研究一番,原文链接如下:
https://bitcoinmagazine.com/articles/deterministic-wallets-advantages-flaw-1385450276
里面有个核心的公式
offset = dbl_sha256('0:0:'+mpubkey[2:])
priv0 = add_privkeys(mprivkey,offset)
也就是说,子私钥和父私钥只相差这么一个offset,并且这个offset是可以通过固定的算法计算出来的。
更让我觉得不可思议的是,这个offset是通过什么样的方式找出来的?这其中有什么数学公式吗?