以太坊钱包私钥爆破产业链和攻击案例

news2024/10/6 5:58:43

一:产业链频道:小飞机搜索"BRUTE_FORCE_CRYPTO_WALLET"
2、github项目(有成熟的工具)
GitHub - Houzich/CUDA-GPU-Brute-Force-Mnemonic-Old-Electrum-V1: CUDA-GPU-Brute-Force-Mnemonic-Old-Electrum-V1
3、揭秘以太坊 Vanity 生成器 Profanity 私钥破解漏洞

二:案例如下:
近日,Wintermute 钱包遭攻击损失约 1.6 亿美元,被盗原因是 Wintermute 为了节省 Gas 费使用了 Profanity 来创建 Vanity 钱包(开头 0x0000000),此前去中心化交易所聚合器 1inch 发布了一份安全披露报告,声称通过名为 Profanity 的工具创建的某些以太坊地址存在严重漏洞。慢雾安全团队对此事件进行了深入分析,并分享给大家。


椭圆曲线加密(ECC)是区块链领域最常用的加密算法,ECC 是一个加密算法大类,它包含了多种不同的曲线和加密算法,例如 secp256k1/secp256r1/ed25519/schnorr 等,比特币和以太坊都是使用 secp256k1 加密。



在使用以太坊时,我们首先会生成一个私人账号(以 0x 开头 + 40 字母),具体过程如下:

(1)生成一个不可预测的随机数种子,通常基于系统的 /dev/urandom 随机发生器;
(2)利用随机种子生成一个私钥(256 位,32 字节)
(3)通过私钥生成公钥(64 字节)
(4)公钥使用 keccak-256 哈希算法,取哈希值十六进制字符串后 40 个字母,开头加上 0x 生成最终的以太坊地址。

特别记一下这些公私钥的大小,因为它关乎我们后面要做的计算量。

这里需要提的一个关键公式:

Q = kG

这是私钥推导出公钥的核心算法,私钥推出公钥计算很简单,但反向推导几乎不可能。
Q 是公钥,k 是私钥,k 由有限域内的大整数构成,相当相当大,以致于几乎不可能去猜测,G 是椭圆曲线上的一个点,默认是一个固定的值,kG 就是 k 个 G 点相加(椭圆曲线的点相加不是简单的实数相加,计算方法这里不展开讨论)。

如果我们想要穷举以太坊账号,找到 Vitalik 的私钥,那么在知道他的公钥后,最多需要进行 2^256 (2 的 256 次方)次的 Q = kG 计算,对大数字我们天然不敏感,所以我把它换算成工作量,就是目前一台苹果 M1 电脑大概 40M/s 的速率,那么大概需要的年份是 8 后面跟上 62 个零。一万年太久,只争朝夕。

有一些错误的私钥生成方法,会导致私钥的取值范围变成更小范围内的数值,变得可猜解。常见的原因有:

(1)随机数种子不够随机,例如使用了时间戳做为随机数种子,那么我们只要穷举过去一段时间所有的时间戳就能找到生成公钥所用的种子和私钥;
(2)软件算法存在缺陷,导致随机强度不够(Profanity 正是存在这样的缺陷);

Profanity 的设计目的,是帮助人们生成一个具有特殊视觉效果的账号,比如以特殊字符开头或者结尾的账号,另一方面,一些开发者使用它来生成开头为很多个 0 的账号,如 0x00000000ae347930bd1e7b0f35588b92280f9e75,它可以在调用智能合约时达到节省 Gas 的效果。

Profanity 为了更快地爆破出 Vanity Address,只在程序的开头获取了一次随机数,后续所有的私钥都是基于这个随机数迭代扩展而来,我们来看一下它的随机数生成算法:



这里使用了 random_device 来获取系统提供的随机数,这个随机数源是满足加密所需要的强度的。但是当我们注意到变量类型时,我们发现 rd() 返回的是一个 32 位长度的随机值,上文我们提到一个私钥是 256 位长度,那么一次获取随机数的过程并不能填充整个私钥,于是 Profanity 使用 mt19937_64 产生随机数来填充整个私钥。mt19937_64 和 random_device 的随机算法有着本质的区别,mt19937_64 是确定性的,它的随机性依赖于输入的随机数,并不产出新的随机性。

也就是说,如果 rd() 传递给 mt19937_64 的值在某个范围,那么 distr(eng) 的值也在对应的某个范围,createSeed 函数返回的 r 值自然也是在某一个范围。

关键点来了: rd() 的所有可能性是 2^32,离私钥的安全性(2^256)相差了 224 个数量级,但是 2^32 这个数量级也挺大的,那么它需要多少计算量才能破解出私钥?

Profanity 在获取到第一个私钥 SeedPrivateKey 以后,为了碰撞出需要的账号地址,会通过一个固定的算法不断跌代这个私钥,最多 200 万次(数值来源于 1inch 披露的文章),这个公钥的计算方式可表示为:

PublicKey = kG = (SeedPrivateKey + Iterator)*G

Iterator 是一个递增的数字,当 PublicKey 已知时,我们可以通过穷举 SeedPrivateKey 和 Iterator 来得到 SeedPrivateKey,计算量大概为 2^32 乘以 200 万次,在 1 台 M1 电脑上需要 60 多年时间,看上去这辈子有希望 :D。如果我用大量算力更大的显卡进行并行计算,那么在几天甚至几个小时碰撞出想要的结果也完全可以。

刚好最近以太坊转 PoS 共识,存在大量的闲置的显卡算力,如果矿工拿显卡来破解这个私钥,那不是分分钟就能成功?当然这个阴谋论没有意义,我们只想研究破解的可能性。我们更希望能用不那么暴力的方法来解开私钥。

我们稍微移动一下等式两边,对上面的公式进行变换,可得:

SeedPrivateKey*G = PublicKey - Iterator*G
我们可以思考另一种攻击方法,如果首先预计算 SeedPrivateKey*G,需要最多 256 G 左右的内存空间去存储计算结果,在一台普通的服务器上完全可以做到,所需要的计算是 2^32 次,大概几十分钟就可以完成。然后我们再把需要破解的 PublicKey 代入等式右边,然后对 Iterator 跌代碰撞,所需要的计算量大概是 200 万次,还有 200 万次的查表,所需要的时间是秒级。这,就有意思了,原来 32 位的随机数是这么的微不足道,任何人都有可能在几十分钟内还原出私钥。

至此,我们总结出了 Profanity 的漏洞成因,是由于未对 256 位私钥进行足够随机播种,导致私钥取值范围严重降低。同时也分析了对这类随机性问题的破解可能性,希望能给大家一些启发。

若有收获,就点个赞吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++学习路线-自用

C学习路线 做目录索引用,后续更新 初步想在学习完成后做对应的link 1、summary 参考网址 https://mp.weixin.qq.com/s/tXilzUzN7cDhnc3ztw4Vlw https://blog.csdn.net/qq_43564374/article/details/109409256 https://zhuanlan.zhihu.com/p/130364187 学习方式 看书…

景区剧本杀开发方案

景区剧本杀软件发展趋势包括以下几个方面: 个性化定制:随着用户需求的不断增加,景区剧本杀软件将更加注重个性化定制,满足不同用户的需求。 跨平台支持:景区剧本杀软件将逐渐实现跨平台支持,比如在…

经典命令--sort、uniq、tr、cut等

目录 一:sort--排列工具 1.sort命令介绍 2.sort命令常用选项 3.sort命令事例 二: uniq--去重工具 1.uniq命令介绍 2.uniq命令常用选项 3.uniq命令事例 4.筛选出重复3次的ip 5.将超过3次登录失败的用户加入黑名单 三:tr-- 替换工具 1.tr命令介绍…

10个前端开发者务必知道的JavaScript 技巧

前言 过去,我写了很多垃圾代码,现在看起来很糟糕。 当我再次看到那些代码片段时,我甚至怀疑自己是否适合做程序员。 所以,这里有 10 个我总结的JavaScript 技巧,可以帮助你避免编写我曾经做过的那种垃圾代码。 Prom…

提取每个汉字的首字母

1&#xff1a;在项目 POM 中 引入 汉字拼音转换JAR包 ​​​​​<dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.1</version> </dependency> 2:工具类 public…

Vue项目修改页面标签

Vue项目修改页面标签 1、在 Vue CLI 创建的项目中&#xff0c;可以通过修改 public/index.html 文件来改变网页标题。 2、在 Element UI 中&#xff0c;可以通过修改 document.title 属性来改变页面的标题。以下是一个示例代码&#xff1a; export default {mounted() {// 修改…

Android 检查网络状态和监听网络状态变化

此篇存在的主要意义在于解决用户使用app中网络状态发生了变化&#xff0c;需要我们去动态监听网络连接状态&#xff08;有网、无网&#xff09;、网络类型 &#xff08;包括wifi、移动网络 -> 3G、4G等等&#xff09; 文章目录 门前授课具体实现异常场景兴趣扩展 门前授课 …

设备产线运维合集丨图扑数字孪生流水线,提升产品装配自动化效率

前言 图扑软件基于 HTML5&#xff08;Canvas/WebGL/WebVR&#xff09;标准的 Web 技术&#xff0c;满足了工业物联网跨平台云端化部署实施的需求&#xff0c;以低代码的形式自由构建三维数字孪生、大屏可视化、工业组态等等。从 SDK 组件库&#xff0c;到 2D 和 3D 编辑&#…

类加载器和双亲委派模型

类加载机制的第一步就是“加载”&#xff0c;即将Class文件获取二进制字节流并加载到方法区中 这个“加载”动作是放在JVM 之外去实现的&#xff0c;能够让应用程序来决定如何获取所需要的类 类和类加载器 对于任意一个类&#xff0c;都必须由加载它的类加载器和这个类本身一…

数字藏品的价值和意义

2022年以来&#xff0c;数字藏品概念在国内火热起来。从年初的《关于防范 NFT相关金融风险的倡议》到8月份央行数字货币 DCEP的正式面世&#xff0c;从中国香港首个“NFT”艺术品在香港拍卖市场成交到国内多家互联网大厂推出数字藏品平台&#xff0c;越来越多的企业开始试水数字…

Spring Cloud Alibaba--Nacos服务注册和配置中心

文章目录 一、什么是Nacos1.1、Nacos的由来1.2、Nacos的特性1.3、Nacos的下载和启动 二、Nacos服务注册2.1、代码示例2.2、各种注册中心的比较CAP定理多个注册中心比较 三、Nacos配置中心3.1、Nacos配置管理3.2、代码示例3.3、多环境多项目管理3.3.1、命名空间3.3.2、Group分组…

递归到动态规划:空间压缩技巧-纸币问题的有限张数

这个题是我们纸币问题的第三题 题目大意&#xff1a; arr是货币数组&#xff0c;其中的值都是正数。再给定一个正数aim。 每个值都认为是一张货币&#xff0c; 认为值相同的货币没有任何不同&#xff0c; 返回组成aim的方法数 例如&#xff1a;arr {1,2,1,1,2,1,2}&#xff0…

【C】模拟实现atoi,atof函数

目录 atoi函数 atof函数 模拟实现atoi&#xff0c;atof函数 1、atoi模拟实现 2、atof模拟实现 3、测试案例代码 atoi函数 atoi函数是将字符串转换成整数 函数头文件&#xff1a;#include <stdlib.h> 函数原型&#xff1a;int atoi(const char *str); 参数&…

利用结构相似性做单细胞多模态分析

多模态单细胞测序技术从多层基因组数据中提供了丰富的细胞异质性信息。然而&#xff0c;在没有正确消除模态偏差的情况下去分析联合空间&#xff0c;往往会得到比单模态分析更差的聚类结果。如何有效利用多组学额外信息来描绘细胞状态并识别有意义的信号仍然是一个重大的挑战。…

华为 VOS 移植到 TDA4VM/VH 芯片的 TI RTOS SDK 时的 bug 修复笔记

请从官网下载 TD4VM 技术参考手册&#xff0c;地址如下&#xff1a; TDA4VM 技术参考手册地址 VOS 作为静态库移植到TDA4VM/VH 芯片的 TI RTOS SDK 中 VOS 移植到 mcusw/mcal_drv/mcal/vos&#xff0c;如下&#xff1a; vos 测试应用 在 mcusw/mcuss_demos/vos_test_app …

Shell脚本之正则表达式

目录 一、正则表达式的介绍 1&#xff09;正则表达式的组成 2&#xff09;正则表达式和通配符的区别 二、基础正则表达式 1&#xff09;转义字符的运用 将特殊含义的字符转换为普通字符的含义 将普通字符转换为特殊作用的字符 2&#xff09;基础正则表达式实际应用 查…

C++ | 结构体及大小计算

C结构体及大小计算 文章目录 C结构体及大小计算struct 和 class 区别字节对齐默认对齐方式 位域使用#pragma pack(n)结构体中有结构体Reference struct 和 class 区别 结构体&#xff08;struct&#xff09;和类&#xff08;class&#xff09;有点像&#xff0c;均是定义一个数…

Activi7工作流经典实战(附:常用流程流转代码片段)

一、Activiti7介绍 Activiti正是目前使用最为广泛的开源工作流引擎。Activiti的官网地址是 https:// www.activiti.org 历经6.x和5.x两个大的版本。 1. Activiti工作流引擎 他可以将业务系统中复杂的业务流程抽取出来&#xff0c;使用专门的建模语言BPMN2.0进行定义。业务流…

彻底搞清楚Handler,再也不怕面试官

Handler Handler可以说是Android框架里面很精髓的一部分了&#xff0c;面试必问&#xff0c;用的也最多 Handler是什么&#xff1f; 提到Handler大家一定不陌生&#xff0c;我们经常用它来切换线程&#xff0c;或者是说做一些延时任务等等。最常用的地方可能就是在网络请求中…

Flask全栈解决小问题系列(1)搭建一个bootstrap开发框架

时间不多,闲话少说,实践出真知! 1.目的:为实现FlaskBootStrap开发效果,搞个开发测试项目 2.搭建项目 1)建个test-bootstrap项目,项目目录结构如下: 2)appstart.py内容如下: import json from flask import Flask,redirect,render_templateapp Flask("__main__") …