HomelessPhD/BTC32

GitHub: HomelessPhD/BTC32

一套针对比特币 32 BTC Puzzle 挑战的私钥暴力破解工具,结合统计分析与 GPU 加速来缩小搜索空间并执行破解任务。

Stars: 101 | Forks: 42

在这里,我将发布与 32 BTC Puzzle 相关的想法和测试工具 [[1]](https://bitcointalk.org/index.php?topic=1306983.0)。 简而言之,“32 BTC Puzzle”根本就不是一个谜题,而更像是一个暴力破解基准测试,或者说是一个特定的暴力破解竞赛,其目的在于一方面打造快速且可靠的 BTC 私钥暴力破解工具,另一方面检验目前 BTC 密码学的安全性。 在 2015 年(+2017 年(+++2023 年)),有人向一系列特定的 BTC 地址发起了一系列交易 [[2]](https://www.blockchain.com/btc/tx/08389f34c98c606322740c0be6a7125d9860bb8d5cb182c02f98461e5fa6cd15)。 ([[2']](https://www.blockchain.com/explorer/transactions/btc/5d45587cfd1d5b0fb826805541da7d94c61fe432259e68ee26f4a04544384164), [[2'']](https://www.blockchain.com/explorer/transactions/btc/12f34b58b04dfb0233ce889f674781c0e0c7ba95482cca469125af41a78d13b3)) 2015 年这些地址中包含 32 BTC,但在 2017 年创建者将这个数值增加了 100 多个 BTC(而且其中大部分仍然留在那里,等待聪明人、幸运儿或创建者自己去花费)。 ***在 2023 年,创建者大幅增加了钱包余额——总计高达 1000 BTC。现在 #71 地址包含 7.1 BTC,而 #140 包含 14 BTC。*** BTC 私钥(提供对存储在特定 BTC 地址下资金的访问权限的东西)是一个长度为 256 位的整数值(256 个 {0 或 1})或 64 个十六进制(16 进制)值。从上面区块链浏览器获取的 BTC 地址 [[2]](https://www.blockchain.com/btc/tx/08389f34c98c606322740c0be6a7125d9860bb8d5cb182c02f98461e5fa6cd15) 实际上是经过一系列需要计算时间的 HASHING 过程,由相应(且未知的)BTC 私钥生成的。通常,要找到特定 BTC 地址的私钥,破解者需要尝试所有 2256({0/1} x {0/1} x ... {0/1})可能的私钥,为每一个生成 BTC 地址并与目标地址进行比较。 这个数字 2256 如此庞大(约 1077 种组合),以至于在典型 GPU 速度约为每秒 108-109 个私钥的情况下,在典型 PC 上暴力破解一个 BTC 地址(通过遍历所有可能的 BTC 私钥来恢复特定 BTC 地址的私钥)所需的时间将比宇宙被认为存在的时间还要长。 但是,这些“32 BTC”地址有一个特殊之处,那就是它们的私钥被部分公开了: ``` #1 000...<255>...0001 #2 000...<254>...001x #3 000...<253>...01xx #4 000...<252>...1xxx ... #n 000...<256-n>...1xxxx ``` 第 n 个私钥由 (256-n) 个 0、1 个 1 和 (n-1) 个随机位构成。破解第 (n+1) 个密钥的复杂度显然是第 n 个密钥复杂度的两倍,但同时它存储的 BTC 也更多。目前,#1 - #69 已经被破解,存储在那里的 BTC 已被花费,这使得 #71 成为列表中下一个最容易的目标。第 67 个目标的预期复杂度——即找到合适私钥所需处理的私钥数量——是 266 = ~1019,这需要 2000 亿秒,或者在 RTX 2070 上约 6000 年(至少我的移动端 RTX 2070 使用 CUDA 10.1 和 BitCrack 项目 [[3]](https://github.com/brichard19/BitCrack) 提供了 200 MKeys/s 的速度)。在典型 PC 上仅仅通过遍历所有 266 个私钥来成功破解 #66 似乎是不可能的。#67 将难两倍,在 RTX 2070 上需要约 12000 年,以此类推。也许,暴力破解工具可以优化到在同一款 RTX 2070 上以约 1000 MKeys/s 的速度运行,但即使拥有 300 块这样的 RTX 2070 显卡,也只能将 #66 的处理时间缩短到约 4 年,而 6.6 BTC 的赏金虽然是一大笔钱,但相比于 4 年内消耗 300 块顶级 GPU 的代价就显得微不足道了(你可以估算一下如果用它来挖 ETH 能产出多少 BTC,或者直接将 6.6 BTC 与 300 块 RTX 2070 的价格以及该过程现在的电费做比较)。这就是为什么认为 xxxxx 位序列背后存在某种逻辑的想法如此诱人——在像我这样的穷人的 PC 上几乎不可能遍历所有 2n-1 种组合(我很幸运收到了一台装有 RTX 2070 的笔记本电脑作为礼物),但估算出私钥的确切值,或者至少大幅缩小需要暴力破解的值域范围,应该能增加我们在这场竞赛中的机会(不要忘记——还有很多其他聪明的搜寻者,其中一些人拥有巨大的计算能力)。 #1-#69 以及 #65, #70, #75, #80, #85, #90, #95, #100, #105, #110, #115, #120, #125, #130, #135 的私钥已经公开。第一批是使用经典方式破解的(私钥 -> 公钥 -> BTC 地址),而后面的第 5 个倍数密钥则是由于另一个有用的信息泄露而被破解的——作者“公开”了它们的公钥(从每个第 5 的倍数地址发起一笔极小金额的 BTC 交易),这使得使用 Kangaroo 算法 [[4]](https://github.com/JeanLucPons/Kangaroo) 和 [[4']](https://github.com/ZenulAbidin/Kangaroo-256)(最后这个需要检查和测试)将所有第 5 个倍数密钥的暴力破解复杂度降低了近平方根(例如,#120 将是约 260 而不是 2120)。所有已知的十进制表示的私钥都写在文件“btc32_keys_dec.csv”(文件夹“BTC32_Analysis”)中,或者也可以在“BTC32_BitCrack_Test.txt”中找到。 文件夹“BTC32_analysis”包含了我对已知私钥的基础分析。为了比较不同 BTC 地址的私钥以及不同数量的未知位,决定将它们从形式为 PKn = 2n-1 + rem(其中 rem 取自 {0...2n-1})的大整数转换为“无量纲”形式 alphan = (PKn -2n-1) / 2n-1。所有私钥的 Alpha 参数显示了私钥在其可能值区间内的相对位置,并且对于所有 BTC 地址都位于 {0..1} 的区间内。 MATLAB 脚本 BTC32_dummy_analysis.m 计算简单的统计值,并以图形形式呈现它们(alpha 值也打印在文件 alpha.csv 中)。 ![raw_alpha](https://static.pigsec.cn/wp-content/uploads/repos/cas/54/54e10a9ff4919a3a88791bb86d8f261f6a054c5025d04aff9fd5111e2c2b1e03.png) 乍一看,很难在数据中找到某种规律——脑海中只浮现出一种趋向更接近中心 (0.5) 取值的倾向。该脚本为 alpha 绘制了直方图(位于特定狭窄区间内的私钥 alpha 值的数量 VS 狭窄区间的位置),以检查这种概率性质。为以下情况绘制了直方图:#1-#63 的私钥,#65, #70...#115 的私钥,以及将它们全部组合在一起并使用不同的“子区间”(直方图柱状宽度)。 ![hist_1_63](https://static.pigsec.cn/wp-content/uploads/repos/cas/f5/f57f25ed18c68aa7a686907ca6926fcf13e3ae48ec6c753b2d86a333dd31c43f.png) ![hist_upper_5th](https://static.pigsec.cn/wp-content/uploads/repos/cas/ea/eafbc0d11e64e74453ea20df9c151b2a2b850681b43dfa5f0c7a0899244a01ff.png) ![hist_all](https://static.pigsec.cn/wp-content/uploads/repos/cas/32/32f21465ee53fd2b538907bda594391b17e4b102cdd007c533693ac6aa9feb94.png) 在这里,私钥似乎更有可能在 {0.3-0.5} 和 {0.6-0.8} 处找到。特殊情况是 {0.82-0.83},从柱状宽度较小的直方图中可以看出,有几个私钥紧密地分布在这里。 人们可能会在这里假设几种情况:1) 私钥倾向于沿着这些区间(直方图最大值)以更高的概率分布,这意味着下一个尚未破解的私钥的 alpha 值更有可能位于这些区间(直方图最大值)内,而不是在它们之外;2) 整个数据集应该更均匀地分布在整个区间 {0...1} 中,这意味着下一个尚未破解的私钥的 alpha 值更有可能位于直方图最大值之外,或者位于直方图最小值区间内。这两种想法都旨在减少暴力破解的密钥数量,同时将破解成功的概率保持在合理或至少可接受的水平。还有第三种情况——每个私钥都是使用强大(优秀)的随机数生成器生成的,因此它们都是均匀分布的——直方图之所以出现峰值是因为“观测值数量”较少(未破解的私钥)。 脚本“BTC32_dummy_simulation.m”对以类似于 32BTC 私钥方式生成的数字进行了处理——但使用的是较小的数值(MATLAB 的随机数生成器精度有限)。前 60 个数字和其余 100 个数字的结果直方图示例如下对比(自己尝试一下——你会发现提到的 1 和 2 情况及其形成的策略可能是个错误——前 60 个数字的直方图与后 100 个数字的直方图并没有联系)。 将搜索区间缩小 10、100、1000 甚至 10000 倍,或者形成一系列具有高私钥恢复概率的狭窄区间,可以极大地提高成功的数学期望(只有在情况 1 和/或 2 为真时才可能实现),但仍然不足以应对我们缓慢的 PC,这迫使我们去寻找在所需计算能力意义上更简单的方法——对模式的狂热,就像电影《美丽心灵》中那样。这里唯一需要明确说明的是,你用于预测的模型包含的参数数量应少于观测值的数量——n 阶的简单多项式逼近将完美拟合包含 n 个点的数据集(它将恰好有 n 个根),这只是死记硬背了数据,而不是挖掘数据背后的逻辑——这对于像 SVM 或神经网络这样的复杂模型同样适用——它们可能只是以不那么明显的方式记住(过拟合)了数据——因此在使用它们时要小心,否则你会因为数学疯狂而失去宝贵的时间。 可以肯定地说——数据中不存在任何线性趋势或关系,这从它们的相关性就可以看出来。自相关图看起来就像噪声的自相关。 ![autocorr_1_63](https://static.pigsec.cn/wp-content/uploads/repos/cas/06/06fea190acd4ce01298361425a2ca0891d4d2f09b68556feebb968c04547aff1.png) ![autocorr_upper_5th](https://static.pigsec.cn/wp-content/uploads/repos/cas/7e/7ef988e05a48aacf582866fc800c8817550b8d699d6e4c2ca5a0632d37367528.png) 无论如何,“BTC32_Brute_GenTask”和“BTC32_Brute”文件夹是为了简化在特定 BTC 地址的几个微小 alpha 值区间上运行暴力破解的过程而创建的。 首先,你需要使用“GenerateTask.m”(MATLAB\Octave 脚本:例如“octave GenerateTask.m”,在此步骤你需要 octave 或 MATLAB)生成“task_file.txt”——为此,请在文件“Pzl32_unspentList.csv”中指定你想要破解的 BTC 地址及其索引(未知位数量): ``` .... 66,"13zb1hQbWVsc2S7ZTZnP2G4undNNpdh5so" 67,"1BY8GQbnueYofwSuFAT3USAhGjPrkxDdW9" .... ``` 并在“GenerateTask.m”脚本中指定 alpha 值 / 区间宽度(参见脚本内的注释,简而言之——Brute_MKs 是预期的以百万密钥每秒为单位的暴力破解速度 / Run_TimeOut_m 是暴力破解的预期超时时间 / alpha_to_seek 是在 [] 括号中给出的所需 alpha 值): ``` ... BruteRate_MKs = 200; Run_TimeOut_m = 10; MAX_Keys_interval = ceil(vpa(BruteRate_MKs * (10^6) * Run_TimeOut_m * 60, vpa_acc)); alpha_to_seek = vpa([0 0.0078125 0.75 0.82207866191468159655642011784948 0.82817983680743556540448935265886 1], vpa_acc); ... ``` 运行脚本“GenerateTask.m”生成“task_file.txt”,它看起来如下所示: ``` ... 66,0.000000,1FFFFFFFFFFFFFFFF:20000001BF08EB000,13zb1hQbWVsc2S7ZTZnP2G4undNNpdh5so 66,0.007813,203FFFFF207B8A800:20400000DF8475800,13zb1hQbWVsc2S7ZTZnP2G4undNNpdh5so 66,0.750000,37FFFFFF207B8A800:38000000DF8475800,13zb1hQbWVsc2S7ZTZnP2G4undNNpdh5so 66,0.822079,3A4E77E815B2D2800:3A4E77E9D4BBBD800,13zb1hQbWVsc2S7ZTZnP2G4undNNpdh5so 66,0.828180,3A8072FF69E884800:3A80730128F16F800,13zb1hQbWVsc2S7ZTZnP2G4undNNpdh5so 66,1.000000,3FFFFFFE40F715000:40000000000000001,13zb1hQbWVsc2S7ZTZnP2G4undNNpdh5so 67,0.000000,3FFFFFFFFFFFFFFFF:40000001BF08EB000,1BY8GQbnueYofwSuFAT3USAhGjPrkxDdW9 67,0.007813,407FFFFF207B8A800:40800000DF8475800,1BY8GQbnueYofwSuFAT3USAhGjPrkxDdW9 ... ``` 最后,将生成的“task_file.txt”放入文件夹“BTC32_Brute”中。在运行脚本“BTC32_narrow.sh”之前,你需要将从 [3] 获取的 BitCrack 项目文件夹(或者解压 BitCrack-master.zip)放进去,编译它(CUDA\CL)并修改“BTC32_narrow_search.sh”以适配你的 BitCrack 版本(参见脚本注释)。该脚本只需遍历“task_file.txt”的所有行,通过 BitCrack 运行它们。结果和调试信息将存储在独立的文件夹中——示例可以在“BTC32_Brute_Examples”中找到(请阅读脚本注释)。 在正式开始之前——我建议你用一些已经“解决/花费”的私钥来测试你的设置。 你可以在“BTC32_Brute_Examples”中找到此类测试的一个好例子——“output_LYoc8Q”,其中两个 BTC 地址是使用取自“BTC32_analysis/alpha.csv”的 alpha 值进行破解的: [Pzl32_unspentList.csv]: ``` 53,"15K1YKJMiJ4fpesTVUcByoz334rHmknxmT" 55,"1LzhS3k3e9Ub8i2W1V8xQFdB8n2MYCHPCa" ``` [GenerateTask.m]: ``` ... alpha_to_seek = vpa([0.5018395352846268 0.6678542153963616], vpa_acc); ... ``` 结果生成了如下的 status_all.txt——我的设置预计耗时 9.5-10 分钟:因此,对于不佳的 alpha(即私钥真实 alpha 落在搜索区间之外),任务花费了 9.5-10 分钟;而对于良好的 alpha(即生成了包含恢复出的私钥的输出文件——详见示例文件夹),最多只需一半的时间: ``` 53 0.501840 18077AEC36DA6C:180796DCC58A6C 15K1YKJMiJ4fpesTVUcByoz334rHmknxmT DONE real 4m43,159s user 0m36,045s sys 0m33,181s 53 0.667854 1AAF79EE92A045:1AAF95DF215045 15K1YKJMiJ4fpesTVUcByoz334rHmknxmT DONE real 9m27,197s user 1m12,556s sys 1m0,663s 55 0.501840 601E1599B171B0:601E318A4021B0 1LzhS3k3e9Ub8i2W1V8xQFdB8n2MYCHPCa DONE real 9m28,337s user 1m12,578s sys 1m0,499s 55 0.667854 6ABE11A3208914:6ABE2D93AF3914 1LzhS3k3e9Ub8i2W1V8xQFdB8n2MYCHPCa DONE real 4m44,704s user 0m36,757s sys 0m30,376s ``` 关于该竞赛(BTC 32 Puzzle)作者的一段评论可以在前面提到的 bitcointalk 主题 [1'] 中找到。 ``` .... A few words about the puzzle. There is no pattern. It is just consecutive keys from a deterministic wallet (masked with leading 000...0001 to set difficulty). It is simply a crude measuring instrument, of the cracking strength of the community. Finally, I wish to express appreciation of the efforts of all developers of new cracking tools and technology. The "large bitcoin collider" is especially innovative and interesting! .... ``` 看起来作者并不反对黑客行为,反而是鼓励黑客攻击以及开发有助于黑客攻击的工具(也许别有用心——在比特币之外的某个地方,可能存在一个安全性较低的密码系统,它将使用我们为解决这个“32BTC puzzle”而开发的工具被黑客攻破)。 如有任何想法\问题或建议,你可以发送至 generalizatorSUB@gmail.com。 ## 附言 感谢你花时间阅读我的笔记,我希望它不是完全没有用,并且你找到了一些有趣的东西。 ### 参考文献: [1] BTC32 Bitcointalk topic - https://bitcointalk.org/index.php?topic=1306983.0 [1'] BTC32 Bitcointalk topic, author message - https://bitcointalk.org/index.php?topic=1306983.msg18765941#msg18765941 [2] BTC32 transactions/addresses - https://www.blockchain.com/btc/tx/08389f34c98c606322740c0be6a7125d9860bb8d5cb182c02f98461e5fa6cd15 [2'] https://www.blockchain.com/explorer/transactions/btc/5d45587cfd1d5b0fb826805541da7d94c61fe432259e68ee26f4a04544384164 [2''] https://www.blockchain.com/explorer/transactions/btc/12f34b58b04dfb0233ce889f674781c0e0c7ba95482cca469125af41a78d13b3 以下是我提到的优秀项目的链接(非常感谢你们的辛勤工作,整个 bitcointalk 帖子真的非常感谢你们的努力): [3] "BitCrack" project - https://github.com/brichard19/BitCrack [4] "Kangaroo" project - https://github.com/JeanLucPons/Kangaroo [4'] "Kangaroo" 256 - https://github.com/ZenulAbidin/Kangaroo-256
标签:PoC, Vectored Exception Handling, Veh, 区块链, 密码学, 应用安全, 性能基准测试, 手动系统调用, 暴力破解, 比特币