arturfromtheblock/ballet-wallet-hunter
GitHub: arturfromtheblock/ballet-wallet-hunter
一款用 Go 编写的 BIP38 暴力破解工具,通过模式掩码和多线程优化尝试恢复 Ballet Wallet CTF 挑战中的加密私钥密码。
Stars: 0 | Forks: 0
Ballet Wallet Hunter
一个用 Go 编写的 BIP38 暴力破解工具,旨在破解 **CTF 挑战** —— 由 Ballet Wallet 创始人 Bobby Lee 于 2020 年 7 月 31 日创建。
## 这是什么?
在 **2020 年 7 月 31 日**,Ballet Wallet 创始人发起了一项公开的夺旗赛 (CTF) 挑战,以证明 Ballet 的 BIP38 加密物理比特币钱包的安全性。
### 挑战设置
该挑战由 **两个钱包** 组成:
- **钱包 #1**:包含 **1 BTC** —— 提供了 BIP38 加密私钥 (EPK) + 确认码。密码未知,必须将其恢复。
- **目标地址:** `1JxWyNrkgYvgsHu8hVQZqTXEB9RftRGP5m`
- **EPK:** `6PnQmAyBky9ZXJyZBv9QSGRUXkKh9HfnVsZWPn4YtcwoKy5vufUgfA3Ld7`
- **确认码:** `cfrm38VUGuohnUuosBHHzLjQoZ2oPTyt1tGPLsfQcKq2gXT8fkC6XJAyc4sJkXrrpy22zMVbnP5`
- **钱包 #2**:它包含 1 BTC。没有提供 EPK,但密码是已知的。这个钱包表明,如果没有 EPK(编码私钥),拥有密码和确认码也是无用的。
- **目标:** `1QGtbKxx6FKDD66LwnrzHCAHmyZ7mDHqC4`
- **密码:** `594Y-L2RW-4ME7-2XVX-9B41`
- **确认码:** `cfrm38VUh2i5qzzCqedWtc8ekFxT3UpcQnfb42JRrLbTWCRTfgVTCXqLp3FYxqiyQDo4D3DyWzY`
### 密码模式
Ballet Wallet 密码遵循特定的模式:
```
XXXX-XXXX-XXXX-XXXX-XXXX
```
其中每个 `X` 是 `A-Z` 或 `0-9` 中的一个字符(每个位置有 36 种可能性)。
**此工具尝试使用优化的加密操作和模式掩码来减少搜索空间,从而对钱包 #1 的密码进行暴力破解。**
### 为什么这很重要
该挑战证明了一个关键的安全概念:**即使有人知道了你的密码,如果没有实体的 Ballet Wallet 卡**(包含 EPK),他们也无法访问你的比特币。反之,即使有人拥有了你的加密私钥,如果没有密码,他们也无法对其进行解密。
我们的目标是通过尝试通过计算暴力破解来恢复未知密码,以测试此安全模型的边界。
## 功能
- **模式掩码系统**:固定已知字符,随机化未知字符
- 示例:`A1XX-XXXX-B2XX-XXXX-C3XX` → 只有 14 个位置需要暴力破解
- **多线程 Workers**:通过 goroutines 利用所有 CPU 核心
- **预计算的 BIP38 数据**:消除冗余的解码操作
- **快速 Scrypt 路径**:为确认检查优化了 scrypt 参数
- **实时状态输出**:实时显示速率和最近测试的密钥
- **跨平台**:为 Intel 和 Apple Silicon Mac 提供原生构建
## 搜索空间现实核查
| 模式 | 位置 | 搜索空间 | 时间 @ 40/s |
| -------------------------- | --------- | ---------------- | ----------- |
| `XXXX-XXXX-XXXX-XXXX-XXXX` | 20 | 36²⁰ ≈ 1.34×10³¹ | ~10²² 年 |
| `A1XX-XXXX-B2XX-XXXX-C3XX` | 14 | 36¹⁴ ≈ 6.14×10²¹ | ~10¹⁵ 年 |
| `2026-XXXX-XXXX-XXXX-XXXX` | 16 | 36¹⁶ ≈ 7.96×10²⁴ | ~10¹⁸ 年 |
**此工具仅用于教育和测试目的。如果没有额外的提示或部分的密码知识,在密码学上暴力破解整个搜索空间是不可行的。**
## 安装
### 前置条件
- macOS (Intel 或 Apple Silicon)
- Go
```
# 安装 brew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装 Go
brew install go
```
### 从源码构建
```
# 克隆仓库
git clone https://github.com/arturfromtheblock/ballet-wallet-hunter.git
cd ballet-wallet-hunter
# 为您的架构构建
make native
# 或者手动:
# Apple Silicon:
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o bwh-silicon -ldflags="-s -w" main.go
# Intel Mac:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o bwh-intel -ldflags="-s -w" main.go
# Go
go build -o bwh -ldflags="-s -w" main.go
```
## 配置
在项目目录中创建一个 `config.txt` 文件:
```
# BIP38 加密私钥 (以 6P 开头)
EPK=6PfLGnQs6VZnrN1VKPuZ8YzovfC7gB3Nqa1CZrKp5R6v1B1
# 目标 Bitcoin 地址 (可选,用于记录日志)
TARGET_ADDRESS=1JxWyNrkgYvgsHu8hVQZqTXEB9RftRGP5m
# BIP38 Confirmation Code (可选,用于更快的验证)
CONFIRMATION_CODE= cfrm38VUGuohnUuosBHHzLjQoZ2oPTyt1tGPLsfQcKq2gXT8fkC6XJAyc4sJkXrrpy22zMVbnP5
# 搜索模式:"random" 或 "sequential"
MODE=random
# workers 数量 (0 = 自动检测 CPU 核心数)
WORKERS=0
# Passphrase 模式:X = 随机,其他 = 固定
# 示例:A1XX-XXXX-B2XX-XXXX-C3XX
PATTERN=XXXX-XXXX-XXXX-XXXX-XXXX
```
### 环境变量
你也可以通过环境变量进行配置:
```
export BIP38_EPK="6Pf..."
export BIP38_TARGET="1JxWy..."
export BIP38_PATTERN="A1XX-XXXX-B2XX-XXXX-C3XX"
export BIP38_WORKERS=8
./bwh-silicon
```
## 用法
```
# 使用 config.txt 运行
./bwh-silicon
# 预期输出:
# 2026/05/08 13:33:26 [18.4s] Tried: 700 | Rate: 38.0/s | Last Key: QO2Z-A8JA-K4Z7-CRY3-BD2S
```
### 模式语法
| 字符 | 含义 |
| ------------ | --------------------------- |
| `X` 或 `x` | 随机字符 (A-Z, 0-9) |
| `A-Z`, `0-9` | 固定字符 |
| `-` | 固定分隔符 |
**示例:**
- `XXXX-XXXX-XXXX-XXXX-XXXX` — 完全随机 (36²⁰ 种组合)
- `2026-XXXX-XXXX-XXXX-XXXX` — 年份固定,其余随机 (36¹⁶ 种组合)
- `TEST-XXXX-XXXX-XXXX-XXXX` — 单词固定,其余随机 (36¹⁶ 种组合)
- `A1XX-XXXX-B2XX-XXXX-C3XX` — 多个固定字符 (36¹⁴ 种组合)
## 性能提示
1. **使用模式掩码**:每个固定字符都会将搜索空间减少 36 倍
2. **原生二进制**:在 Apple Silicon 上始终使用 ARM64 构建 (避免 Rosetta 2)
3. **CPU 优先级**:以最高优先级运行:
nice -n -20 ./bwh-silicon
4. **关闭其他应用程序**:Scrypt 是内存密集且 CPU 密集型的
## 技术细节
### 为什么 BIP38 极难破解
BIP38 使用 **scrypt** 作为其密钥派生函数,它被刻意设计为 **内存密集且 CPU 密集型**。这使得暴力破解攻击极其昂贵,即使对于强大的硬件也是如此。
#### BIP38 中的 Scrypt 参数
对于每次密码尝试,BIP38 需要 **两次 scrypt 操作**:
**Scrypt #1(耗时的那个):**
```
scrypt(passphrase, ownerSalt, N=16384, r=8, p=8, dkLen=32)
```
**Scrypt #2(快速的那个):**
```
scrypt(passpoint, seedbc, N=1024, r=1, p=1, dkLen=64)
```
#### 这些参数代表什么?
| 参数 | 值 | 含义 |
| --------- | ----- | ----------------------------------------------------------------------------------------- |
| **N** | 16384 | CPU/内存开销系数。必须是 2 的幂。每翻倍一次,计算时间也翻倍。 |
| **r** | 8 | 块大小参数。影响内存使用量。每翻倍一次,内存消耗也翻倍。 |
| **p** | 8 | 并行化因子。并行 scrypt 线程的数量。 |
| **dkLen** | 32 | 派生密钥的字节长度。 |
#### 内存和计算开销
一次 scrypt 操作所需的总内存大约为:
```
Memory = 128 × N × r × p bytes
= 128 × 16384 × 8 × 8
= 134,217,728 bytes
= 128 MB per operation
```
对于 **Scrypt #1**,这意味着:
- 每次密码尝试分配 **128 MB RAM**
- **顺序内存访问** 模式(对缓存不友好)
- 在现代 CPU 上每次操作约 **100-200 毫秒**
- 由于内存限制,无法在 GPU 上有效并行化
#### 为什么 GPU 帮助不大
Scrypt 被专门设计用来抵御 GPU 和 ASIC 加速:
1. **内存密集**:每个线程需要 128 MB —— GPU 每个核心的内存有限
2. **随机访问模式**:持续的高速缓存未命中,抵消了 GPU 的内存优势
3. **顺序依赖性**:每个块依赖于前一个块,限制了并行性
高端 GPU 可能比 CPU 实现 **2-5 倍** 的加速,但无法达到 SHA-256 挖矿典型的 **1000 倍** 加速。
#### 完整的 BIP38 解密流程
对于每次密码尝试:
1. **Base58 解码** EPK → 提取 flags、salt 和加密部分
2. **Scrypt #1** (耗时):从 passphrase + ownerSalt 派生 prefactorA
3. **两次 SHA-256 哈希**:计算 passFactor (或 prefactorB + hash)
4. **EC 点乘**:计算 passpoint = passFactor × G (secp256k1)
5. **Scrypt #2** (快速):从 passpoint + address hash 派生 AES 密钥
6. **AES-256 解密**:解密 encryptedpart1 和 encryptedpart2
7. **两次 SHA-256 哈希**:从解密后的 seedb 计算 factorb
8. **EC 点乘**:计算最终私钥
9. **地址生成**:从公钥派生比特币地址
10. **校验和验证**:将前 4 个字节与嵌入的哈希进行比较
**步骤 2、4、5 和 8 是瓶颈。** 仅步骤 2 (scrypt N=16384) 就占了总计算时间的约 90%。
### 性能现实
| 硬件 | Scrypt #1 / 秒 | 密钥 / 秒 | 36²⁰ 搜索时间 |
| ----------------------- | --------------- | ---------- | ---------------- |
| MacBook M1 (8 核) | ~40 | ~40 | ~10²² 年 |
| 高端 CPU (16 核) | ~80 | ~80 | ~10²² 年 |
| RTX 4090 GPU | ~200 | ~200 | ~10²¹ 年 |
| 定制 FPGA | ~500 | ~500 | ~10²¹ 年 |
即使拥有 **100 万个 GPU**,搜索仍需约 **10¹⁶ 年** —— 仍远远超过宇宙的年龄(约 1.38×10¹⁰ 年)。
### 此工具中的优化
- **预计算数据**:BIP38 解码、盐提取和地址哈希只需完成一次
- **模式掩码**:当已知部分密码时,减少搜索空间
- **批处理**:减少 goroutine 之间的通道开销
- **原子计数器**:无锁统计跟踪
- **最小化分配**:复用缓冲区以减少 GC 压力
- **原生构建**:Apple Silicon 上的 ARM64 避免了 Rosetta 2 开销
## 免责声明
本工具**专为 Bobby Lee CTF 挑战**(发起于 2020 年 7 月 31 日)设计,且只能用于此特定目的。
- **仅限预期用途**:本工具用于参与官方的 Ballet Wallet CTF 挑战。严禁任何其他用途。
- **严禁滥用**:请勿使用此工具尝试破解您不拥有或未获得明确测试授权的钱包。
- **密码学现实**:如果没有额外的提示或部分知识,完整 20 字符密码的搜索空间在密码学上是不可行的。
- **不承担责任**:作者对因未经授权使用本工具而产生的任何滥用、损害或法律后果不承担任何责任。
- **先验证**:在使用本软件之前,请务必验证您拥有尝试恢复的合法权利。
使用本工具,即表示您同意仅将其用于 Bobby Lee CTF 挑战,并承担遵守所有适用法律的全部责任。
## 捐赠
```
bc1qlpdkr5djv0mpz948wh2dutq48qnaazaauxxlh0
```
## 许可证
MIT 许可证 —— 详见 [LICENSE](LICENSE)。
_祝狩猎愉快!_ 🎯