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

一:产业链频道:小飞机搜索"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.rhkb.cn/news/37338.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android使用postman实现模拟api接口

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 文章目录 简介postman 简介 在开发过程中涉及到前端和后台的交互,那就是api接口。 前端的需求是api接口定义好以后,能够有数据返回&#x…

使用钉钉Api 向企业群发送文件 python

由于钉钉群机器人推送消息类型只支持text,link,markdown等形式,因此我们需要使用钉钉的接口来实现媒体文件的发送。 目录 获取身份验证参数上传媒体文件发送消息获取chatid 注意事项 获取身份验证参数 钉钉开放文档中可以看到我们上传媒体文…

php 使用钉钉机器人推送消息

机器人发送消息频率限制 消息发送太频繁会严重影响群成员的使用体验,大量发消息的场景(譬如系统监控报警)可以将这些信息进行整合,通过markdown消息以摘要的形式发送到群里。 每个机器人每分钟最多发送20条。如果超过20条&#x…

应用系统与钉钉集成案例及操作步骤

1、准备钉钉应用 1.1、注册钉钉账号 作为钉钉的企业管理员,首先登录钉钉官网,注册一个钉钉账号。 如果已经有账号,则直接使用即可。 钉钉官网:https://www.dingtalk.com/ 1.2、开通企业团队 企业管理员使用账号登录钉钉。 如…

钉钉新版服务端修改流程Task状态( 同意或拒绝审批流程 )API调用的大坑

文章目录 1.背景2.新版服务端的java依赖3.接入流程3.1 创建企业内部应用3.2 获取AppKey和AppSecret3.3 添加接口权限3.4 获取应用访问凭证accessToken3.5 调用服务端OA相关API 4.问题及其解决办法5.新版API相关代码分享 1.背景 由于之前做了一个财务收付款关联管理的项目中接入…

python/Django对接dingtalk-sdk企业内部开发对接钉钉过程手记

前提 需要拥有管理员账号或获得开发者权限 准备 钉钉方面 1. 创建钉钉应用 钉钉开放平台——应用开发——钉钉应用——创建应用 2. 记录应用凭证 记录应用的AgentId、AppKey、AppSecret 3. 打开应用权限 打开需要获取数据的接口权限 开发环境方面 1.安装依赖库 dingta…

钉钉发送消息 java

1、完成钉钉认证才能使用此功能 2、需要登录控制台进行创建应用操作 https://open-dev.dingtalk.com/fe/app 3、需要设置 权限范围及通讯录权限设置 参考 https://www.ngui.cc/el/778161.html?actiononClick pom <dependency><groupId>com.aliyun</groupId&g…

PHP 通过钉钉API向员工推送消息(以工作通知的形式)

通过钉钉 API 向员工推送消息分为多种形式, 今天只以工作通知的形式讲述。 第一步: 进入 钉钉开放平台 注册账号按照流程操作即可 进入开发者后台后需要进行创建应用(之所以创建应用, 是因为以应用为一个 demo) 第二步:创建应用(今天以创建小程序为例) 第三步: 获取企业内部…

LzDingTalk-免费的钉钉机器人框架

LzDingTalk-是一款免费的钉钉机器人框架 1.异常处理规则 2.稳定不易掉线 3.哈希多线程处理 再多消息也能轻松应对 4.框架完全免费&#xff0c;用爱发电&#xff01; 5.多样式API支持二次开发插件&#xff01; 蓝奏下载地址&#xff1a;DingTalk 密码&#xff1a;6jbd界面展示&a…

禅道接入钉钉工作通知与钉钉群机器人二次开发代码详解

目录 禅道接入钉钉工作通知与钉钉群机器人 一、钉钉工作通知使用步骤 1.进入钉钉管理后台工作台添加自建应用进入开发者平台 2.禅道中得操作 3.接收到消息 二、钉钉群机器人使用步骤 1.钉钉群进行设置群机器人 2.禅道设置 三、禅道二次开发添加新功能进行工作通知和群机…

推送Markdown格式信息到钉钉机器人

1.自定义机器人设置 根据钉钉官方开放文档进行自定义机器人的配置&#xff0c;文档地址为&#xff1a;自定义机器人接入 - 钉钉开放平台 (dingtalk.com) 2.Markdown推送形式 Markdown类型 参数说明 3.Markdown图片格式 Markdown中可以使用url连接的图片进行推送&#xff0c…

Java项目如何接入钉钉群机器人

创建群机器人&#xff1a;对于任意我们所在的群&#xff0c;我们都可以创建自己的机器人&#xff0c;不需要群主权限&#xff0c;每个机器人信息只能自己看到。 我们项目通过对应的链接调用机器人发送消息。 创建对应的鉴权方式&#xff0c; 关键字只要消息内容携带即可&…

雷军入局ChatGPT大战/ AutoGPT星标超PyTorch/ 马斯克星舰今晚发射…今日更多新鲜事在此...

h日报君 发自 凹非寺量子位 | 公众号 QbitAI 大家好&#xff0c;今天是4月17日星期一&#xff0c;新的一周要元气满满哦~ 今天科技圈有哪些新鲜事儿&#xff0c;和日报君一起来看看~ 马斯克星舰今晚发射&#xff1a;将进行直播&#xff0c;此前曾延期 SpaceX官网发布通告称&…

[论文阅读] Collaborative and Adversarial Learning of Focused and Dispersive Representation

[论文地址] [代码] [ICCV 21] Abstract 从结肠镜图像中自动分割息肉是计算机辅助诊断结直肠癌的一个重要步骤。近年来报道的大多数息肉分割方法都是基于完全监督的深度学习。然而&#xff0c;医生在诊断过程中对息肉图像的注释是非常耗时和昂贵的。在本文中&#xff0c;我们提…

2000元训练比肩ChatGPT的开源大模型!GPT-4亲自盖章认证,模型权重均可下载

鱼羊 编辑整理量子位 | 公众号 QbitAI 2000块&#xff0c;调教出一个达到ChatGPT九成功力的开源大模型。 还是被GPT-4亲自盖章认证实力的那种。 这事儿&#xff0c;一群主要来自加州大学伯克利分校的研究人员做到了。 如图中所见&#xff0c;这个模型名叫Vicuna &#xff08;小…

chatgpt赋能python:Python处理雷达基数据:从入门到实践

Python处理雷达基数据&#xff1a;从入门到实践 随着气象技术的不断发展&#xff0c;雷达探测技术已成为当今天气预报和气象研究的主要手段之一。雷达基数据是气象雷达接收到的未经加工的原始数据&#xff0c;因其包含大量天气信息&#xff0c;不仅在天气预报、天气预警等方面…

推演语言模型的大小与计算开销

2020年&#xff0c;OpenAI提出了在增加模型尺寸与提高模型性能之间的扩展定律&#xff0c;指出人们应该将大部分预算用于扩大模型规模。这篇论文直接推动了增大模型规模的浪潮。然而&#xff0c;在预算和内存有限的情况下&#xff0c;盲目扩大模型规模并不是提升模型性能的最佳…

codesblocks头文件的正确使用

之前对头文件如何引用一直百思不得其解&#xff0c;现在弄懂了&#xff0c;来复盘一下。关键点在于要建立工程文件。 下面以一个长度转换的程序来简单说明。 第一步&#xff0c;建立C语言项目。 在新建项目点击Console applicaton&#xff0c;接着打上名称&#xff0c;默认设置…

jdbc工具类的定义和使用

DBUtils的定义 导入3个jar包 代码实现 public class DBUtils {//1.配置数据库连接信息&#xff08;MySQL&#xff09;//数据库驱动private static final String DRIVER "com.mysql.jdbc.Driver";//数据库名private static final String DATABASE "test_db&q…

Servlet的介绍与使用

Servlet简介 servlet是运行在服务器上的应用程序&#xff0c; 它的作用是实现前端与后台的数据交互。 Servlet生命周期 三个方法 init()&#xff1a;初始化 service()&#xff1a;处理客户端请求 destroy()&#xff1a;终止 工作原理 客户端向服务器发送一个http请求服务器…