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)。 _祝狩猎愉快!_ 🎯

标签:Ballet Wallet, BIP38, EVTX分析, Go语言, PoC, 加密算法, 区块链安全, 密码学, 手动系统调用, 数字货币, 日志审计, 暴力破解, 比特币, 离线破解, 程序破解, 网络安全, 钱包破解, 隐私保护