主页 > 冷钱包imtoken > 如何窃取以太坊钱包的钥匙? (第1部分)
如何窃取以太坊钱包的钥匙? (第1部分)
摘要:区块链是通过使用公钥和私钥签署和证明交易数据的所有权来验证交易的公共分类帐。 可以进行数亿笔交易的流行区块链包括比特币、Waves、Ripple、ZCash、门罗币和以太坊 (Ethereum)。
目前,以太坊上有 3.45 亿笔交易,涉及 4700 万个密钥对。 新生成的密钥与现有密钥重复的概率约为 2 的 1 的 256 次方,这几乎是不可能的。
在本文中,我们调查即使面对这种统计上不可能发生的事件,ISE 也发现了 732 个私钥及其相应的公钥,这些私钥向以太坊提交了 49,060 笔交易。 此外,还有 13,319 个 ETH 被确定为被交易到无效的目的地地址,或者来自具有弱密钥的钱包,在以太坊市场的高峰期总价值为 18,899,969 美元。
在此过程中,我们发现来自这些弱密钥地址的资金被盗并发送到属于个人或团体的目标地址,目的是破解或收集私钥并获取这些资金。 2018 年 1 月 13 日,“区块链强盗”持有 37,926 个 ETH,价值 54,343,407 美元。
简介:本文的重点是破解委托给以太坊交易的私钥。 前面说过,遇到别人以太坊地址对应的私钥的概率大概是256次方的1分之一。
仅覆盖 1% 的密钥空间将需要大约几年的时间,即使我们使用的计算资源可以让我们每秒生成 100 万亿个密钥。
然而,我们没有尝试暴力搜索随机私钥,而是设计了一些方法来发现可能使用错误代码、错误随机数生成器或两者的组合生成的密钥。 以下部分概述了如何生成以太坊地址,以及破解不是使用最佳方法生成的私钥。
背景:以太坊使用椭圆曲线密码学来生成公钥/私钥对。 使用 256 位私钥生成公钥批量查询以太坊账户余额,计算 secp256k1 ECDSA 曲线上的一个点。 然后使用 keccak256 哈希函数生成公钥。
此哈希被截断为低 160 位以生成以太坊地址。 以太坊地址不能反转为公钥,也不能以任何方式使用以太坊地址生成其底层私钥。
给定一个随机生成的私钥,其有效范围从 1 到 secp256k1 曲线定义的最大值 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140,可以通过采用公钥的 keccack256 哈希函数的低(最右边)160 位来计算以太坊地址,
定义为:
图 1 演示了从随机生成 256 位私钥到生成以太坊地址的工作流程。
图 1:从私钥到生成以太坊地址的示例流程。
知道了这个算法,我们研究的目标是找到那些不是用合理正确的算法生成的,或者是从非随机私钥错误生成的以太坊地址。
实验设计:以太坊允许任何人查询地址以获取余额、正在进行的交易和已完成的交易等信息。 这是通过查询本地或远程运行的以太坊节点来完成的。
为了便于使用,一些在线服务通过网络接口封装底层数据。 Etherscan就是这样一个工具,可以从上面的例子中查询公共以太坊地址:
lA99FDD90FF61DD08CF049155D18E086F7806641B
你可以去
查询,毫无疑问这个地址有0笔交易。
图 2:Etherscan.io 查询 A99FDD90FF61DD08CF049155D18E086F7806641B 由于以太坊上记录了近 5000 万个公共以太坊地址,由于某些因素,我们可能会遇到弱或缺乏随机性的密钥。 一个明显的例子是密钥截断。
即生成一个随机的 256 位私钥,但由于编码/编译器/框架或其他未知错误,只使用了它的一小部分功能。
例如,一个 256 位的私钥,其值为:
l0x47579DA2BEA463533DBFAD6FCF8E90876C2FE9760DC1162ACC4059EE37BDDB5C
如果截断为 32 位,则获得以下密钥:
l0x0000000000000000000000000000000000000000000000000000000037BDDB5C
在我们的实验中,我们选择私钥 1 只是因为它很可能是 secp256k1 私钥的下界批量查询以太坊账户余额,对于 32 位截断密钥,它也在 1 到 232-1 的范围内。
我们使用私钥 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
推导出以太坊地址 0x7e5f4552091a69125d5dfcb7b8c2659029395bdf
如前所述,回想一下两个以太坊用户生成相同私钥的无穷小概率。 假设至少有一个用户随机生成它们。 然后地址不应该与另一个以太坊用户随机生成的密钥一致。
密钥空间是从下限、上限还是使用 π 位密钥、随机数等数字探索密钥空间并不重要。
相反,使用 Etherscan.io 从 0x01 私钥查询上述地址的交易数据,我们将看到以下与我们有意生成的密钥发生冲突的证据。 (例如:此密钥已被使用)
图 3:Etherscan.io 查询 7e5f4552091a69125d5dfcb7b8c2659029395bdf
ISE显示从0x01私钥派生出的以太坊地址上有592笔交易,目前该地址上没有ETH。 如果随机选择一个私钥,其他人生成相同密钥的几率大约是二分之一的 256 次方,实际上是 0% 的几率。
由于随机生成私钥 0x01 的概率大约为零,我们必须假设这个值是故意选择的,或者是由于错误。 以下部分详细介绍了我们的研究,以了解和调查以太坊中弱密钥生成的普遍程度。
研究范围:本研究试图基于弱密钥的使用来定位以太坊地址,并研究这些地址的用途。 虽然在正常情况下不太可能通过适当的代码生成弱密钥,但仍然假设弱私钥可以由编码错误或操作系统、设备和执行环境错误生成,并且这些问题是普遍存在的。 除了密钥截断之外,其他一些可能削弱 256 位密钥的常见错误包括: 由于计算资源有限,即使在较小的 64 位密钥空间中枚举所有密钥也是不可行的。
因此,请关注可实现的目标:枚举将出现在 256 位私钥的较小 32 位子集中的密钥。 这相当于需要计算相应的公共以太坊地址并查询区块链的 4,294,967,295 个私钥。
方法:要对可能的以太坊地址执行批量扫描,查询 Etherscan 等在线服务是不切实际的,而且会浪费资源。
相反,生成所有公共以太坊地址的内存中哈希映射,并为每个枚举键查询此内存中数据结构。
在中端笔记本电脑上,它的性能大约是 15,000 个密钥和它们的查询每 CPU 每内核每秒,瓶颈是 ECDSA 私钥到公钥的生成。
重点关注 256 位密钥空间的八个 32 位“子区域”,在这些区域中可以观察到从弱私钥派生的正在使用的以太坊地址。
预期密文空间的低 32 位部分很可能包含弱密钥。 还扫描了较高的 32 位部分以考虑字节序,并且为了完整性,使用可能生成密钥的 32 位窗口测试了 256 位密钥空间的每个不同部分。
为了说明扫描的区域,下面的图 4 描述了为枚举确定的每个区域。 在枚举每个区域(A 到 H)的 32 位密钥空间时,将 256 位密钥的剩余 224 位设置为 0x00。
图 4:256 位密钥空间由 H 到 A 部分表示。
这给出了 8 个可能的区域,每个区域有 2 的 32 次方减一(约 43 亿)种组合。 将区域定义转换为明确的私钥范围,扫描这些密钥范围并测试以太坊区块链上的交易活动:
A组:
000000000000000000000000000000000000000000000000000000000000000001 到
00000000000000000000000000000000000000000000000000000000FFFFFFFF
B组:
0000000000000000000000000000000000000000000000000000000100000000 到
000000000000000000000000000000000000000000000000FFFFFFFF00000000
C组:
0000000000000000000000000000000000000010000000000000000 到 000000000000000000000000000000000000000FFFFFFFF00000000000000000
D组:
0000000000000000000000000000000000000000100000000000000000000000000 到
00000000000000000000000000000000FFFFFFFF0000000000000000000000000
E组:
000000000000000000000000000000001000000000000000000000000000000000 到 000000000000000000000000FFFFFFFF000000000000000000000000000000000
F组:
00000000000000000000000000000000000000000000000000000000 到 0000000000000000FFFFFFFF0000000000000000000000000000000000000000000
G组:
000000000000000100000000000000000000000000000000000000000000000000 到 00000000FFFFFFFF00000000000000000000000000000000000000000000000000
H组:
000000010000000000000000000000000000000000000000000000000000000000 到 FFFFFFFF0000000000000000000000000000000000000000000000000000000000
虽然上述密文空间范围构成了256位密文空间的无穷小部分,但是由于误差或者其他影响256位密文随机性的因素,私钥可能存在于这些区域。