Asylian21/btc-brute-force
GitHub: Asylian21/btc-brute-force
离线比特币地址碰撞研究工具包,用于比特币安全教育和性能基准测试。
Stars: 2 | Forks: 1
# 比特币地址碰撞研究工具包
[](https://go.dev/)
[](https://github.com/Asylian21/btc-brute-force/actions/workflows/ci.yml)
[](https://github.com/Asylian21/btc-brute-force/releases)
[](LICENSE)
**btc-brute-force** 是一个快速离线的 Go 研究工具包,用于研究比特币 P2PKH 地址生成、Hash160 匹配、secp256k1 性能以及 2^160 比特币地址碰撞搜索空间的数学现实。
它旨在用于密码学教育、比特币安全演示和可重复的 Go 性能基准。它不是一个钱包破解工具、恢复产品或盗窃工具。您可以运行它、测量它、推高 CPU,并且仍然得出与比特币多年来所依赖的相同结论:数学正在做它的工作。
无需云账户、API 密钥、节点或网络依赖。只需本地代码、本地 CPU 和非常大的数字。
## 仓库主题
`bitcoin` · `bitcoin-security` · `cryptography` · `secp256k1` · `hash160` · `p2pkh` · `brute-force` · `address-collision` · `go` · `golang` · `benchmark` · `performance-engineering` · `offline-tool`
## 目录
- [安全和道德](#safety-and-ethics)
- [适用对象](#who-this-is-for)
- [快速入门](#quick-start-)
- [本版本更改](#what-changed-in-this-version)
- [基准测试](#benchmarks-)
- [工作原理](#how-it-works)
- [常见问题](#faq-)
- [比较](#comparison)
- [发布](#releases)
- [贡献](#contributing)
- [相关文章](#related-article)
## 安全和道德
此工具包用于教育、性能研究和密码学直觉。请勿使用它尝试未经授权访问资金或账户。暴力破解比特币地址在计算上是不可行的,尝试访问您不控制的资产可能是非法的。
目的是使不可能变得可测量。这是有用的科学,也是对“秘密暴力破解方法”过度自信声明的有用解毒剂。
## 关键特性
- **离线比特币地址碰撞实验室**,用于旧版主网 P2PKH 地址(`1...`),无需 RPC、API、钱包导入或网络访问。
- **优化的 Go 热路径**,使用批处理 secp256k1 斜率遍历、GLV 内射、点否定、Montgomery 批量求逆、原始 Hash160 查找和分配无缓冲的工人缓冲区。
- **融合的多缓冲区 HASH160 管道**,使用向量化的 SHA-256 (`sha256mb`) 向多缓冲区 RIPEMD-160 (`ripemd160-asm`) 提供实际的密码学吞吐量测量。
- **Apple Metal GPU 加速**(Apple Silicon):自动启用的混合管道——CPU 运行批处理的 secp256k1 遍历,而 GPU 在设备上执行 GLV+否定扩展、六路 Hash160 和 Bloom 过滤器成员测试,所有操作都是位精确的且零拷贝,通过统一内存——在 M3 上达到 ~220–240M 密钥/秒(~4.5–5 倍于 CPU 路径),具有透明的 CPU 回退和启动校准,因此永远不会退步。
- **系统可恢复扫描**从私钥 `1` 开始,具有检查点化的扫描前沿状态,该状态可以在线程数更改(以及 CPU/GPU 模式之间)工作。
- **诚实的安全性教育**,说明为什么即使经过严重优化,比特币暴力破解和广泛的地址碰撞搜索仍然在计算上不可行。
- **可重复的基准测试**,用于 Go、secp256k1、SHA-256、RIPEMD-160、Hash160 和比特币地址生成性能。
## 搜索关键词
比特币暴力破解研究、比特币地址碰撞、比特币地址碰撞基准、比特币 P2PKH 生成器、比特币 Hash160 查找、secp256k1 基准 Go、Go 密码学基准、离线比特币地址扫描器、比特币私钥搜索空间、RIPEMD160 SHA256 Hash160、比特币安全教育、为什么比特币暴力破解是不可能的。
## 适用对象
### 密码学学生
在代码中查看完整的 P2PKH 管道:私 scalar、secp256k1 公钥、SHA256、RIPEMD160、Hash160 查找和 Base58 地址编码。
### 安全教育者
将“比特币暴力破解是不可能的”变成一个实时演示,使用真实数字、检查点和足够的规模,使课程难忘。
### Go 开发者
研究一个 CPU 重的 Go 工作负载,包括批处理的椭圆曲线加法、Montgomery 批量求逆、融合的多缓冲区 HASH160 热路径(向量化的 SHA-256 + RIPEMD-160)、分配无缓冲的工人缓冲区、检查点和原子计数器。
## 快速入门 ⚡
### “我只是想看看它运行”演示
如果已安装 Go,则这是整个首次运行体验:
```
git clone https://github.com/Asylian21/btc-brute-force.git
cd btc-brute-force
make run-example
```
该命令构建二进制文件并启动一个针对 `example-addresses.txt` 的小型捆绑演示,这是一个包含 20 个旧版 P2PKH 地址的公共列表。您将看到目标加载、每 10 秒的吞吐量统计信息,以及一个示例检查密钥/地址对。
使用 `Ctrl+C` 停止它。演示写入 `example-checkpoint.json`,因此继续也是一条命令:
```
make resume-example
```
演示故意很小:20 个地址,零戏剧性。它存在是为了让用户在下载任何严重的目标列表之前验证程序。
### 正常使用
```
make build
./bin/btc-brute-force [--checkpoint=path] [--resume] [--gpu=auto|on|off]
```
地址文件必须按行包含一个旧版主网 P2PKH 地址,这意味着以 `1` 开头的地址。大型本地地址列表、匹配输出和检查点被 git 忽略。
```
./bin/btc-brute-force 8 matches.txt attack-addresses-p2pkh.txt
./bin/btc-brute-force --resume 8 matches.txt attack-addresses-p2pkh.txt
```
#### GPU 加速(Apple Silicon)
在 Apple Silicon 的 Mac 上,`make build` 生成一个启用 Metal 的二进制文件,并且 GPU 管道是 **自动启用** 的——CPU 向设备提供基础公钥,该设备扩展六个 GLV+否定变体,对它们进行散列,并在芯片上 Bloom 过滤器它们,所有操作都是位精确的且零拷贝,通过统一内存——在 M3 上达到 ~220–240M 密钥/秒(~4.5–5 倍于 CPU 路径),具有透明的 CPU 回退和启动校准,因此永远不会退步。
控制它使用 `--gpu`:
```
./bin/btc-brute-force --gpu=auto 8 matches.txt addresses.txt # default: GPU if faster
./bin/btc-brute-force --gpu=on 8 matches.txt addresses.txt # force GPU (fatal if unavailable)
./bin/btc-brute-force --gpu=off 8 matches.txt addresses.txt # CPU only
```
要求:macOS 在 Apple Silicon 上,使用 cgo 本地编译(`make build` / `make bench-gpu` 的默认设置)。其他平台——以及 `make build-cpu`(`-tags=nometal`)构建——透明地使用 CPU 路径。如果需要,请调整管道使用 `BTC_GPU_PRODUCERS` 和 `BTC_GPU_CHUNKS`。有关详细信息,请参阅 [BENCHMARKS.md](BENCHMARKS.md#gpu-apple-metal-pipeline-on-device-glv--hash160--bloom)。
对于演示中的自定义线程数,请传递 `THREADS`:
```
make run-example THREADS=4
```
### 预构建的二进制文件
从 [发布](https://github.com/Asylian21/btc-brute-force/releases) 下载以下平台上的二进制文件:
- Linux(AMD64、ARM64)
- Windows(AMD64)
- macOS(Intel、Apple Silicon——Apple Silicon 构建是使用 cgo 本地编译的,并带有 **Metal GPU** 管道(设备上的 GLV + Hash160 + Bloom);Intel 仅使用 CPU)
**示例(Linux):**
```
# 下载并解压
wget https://github.com/Asylian21/btc-brute-force/releases/download/v0.1.0/btc-brute-force-v0.1.0-linux-amd64
chmod +x btc-brute-force-v0.1.0-linux-amd64
# 运行
./btc-brute-force-v0.1.0-linux-amd64 8 output.txt attack-addresses-p2pkh.txt
```
### Docker
使用 Docker 运行:
```
docker run --rm ghcr.io/asylian21/btc-brute-force:latest --help
```
或本地构建:
```
docker build -t btc-brute-force .
docker run --rm -v $(pwd):/data btc-brute-force 8 /data/output.txt /data/attack-addresses-p2pkh.txt
```
## 本版本更改
此版本是性能和可用性的重大改进。旧循环在概念上很简单:生成一个随机的密钥,导出一个地址,Base58 比较,然后重复,直到日历放弃。
新循环构建成一个合适的研究热路径:
1. **批处理 secp256k1 遍历**:一个工人对每个声明的块执行一次标量乘法,以到达其起始点,然后通过使用预计算的生成器倍数表进行连续密钥的斜率点加法(`P + iG`)来前进到连续的密钥。
2. **GLV 内射 + 点否定**:每个斜率点 `(x, y)` 产生六个有效密钥——三个内射 x 值 `(x, beta*x, beta^2*x)`(标量 `k`、`lambda*k`、`lambda^2*k`),每个在点否定奇偶性(`-P = (x, -y)`、标量 `n-k`)中——只需 2 个域乘法,因为否定是一个免费的 `02/03` 前缀翻转(`y` 永远不会被序列化)。这检查了每个域求逆的 6 个密钥,而不是 2 个;标量仅在罕见的匹配路径上重建。`beta`/`lambda` 常数和所有六个变体都在启动时从头到尾进行验证,因此错误的常数或槽位不匹配会快速失败,而不是静默地错过匹配。
3. **Montgomery 批量求逆**:斜率加法中的昂贵域求逆在 1,024 步批处理中摊销(6x 内射 + 否定扩展后的 6,144 个密钥)。
4. **快速的 secp256k1 Fp 域后端**:每个密钥的基域算术——遍历的主要 CPU 成本——在 `secp256k1-field` 上运行,这是一个 5x52 肢实现,具有 arm64/amd64 汇编内核,取代了 dcrd 的纯 Go 10x26 `FieldVal`。它与 dcrd 位精确相同(差异模糊),大致 **加倍** 了单线程热循环吞吐量(请参阅 [BENCHMARKS.md](BENCHMARKS.md))。
5. **Hash160 目标集**:目标地址在启动时解码一次,并存储为原始 20 字节 Hash160 密钥;Base58 编码仅在罕见的匹配路径上运行。
6. **融合的多缓冲区 HASH160,具有零拷贝输出**:整个批次的压缩公钥通过一个 `hash160mb.FromPubkeys33` 调用进行散列——向量化的 SHA-256 从 `sha256mb`(arm64 `sha2x4` 通过 ARMv8 硬件 SHA 指令交错四个消息,~2.6x 标量)向多缓冲区 RIPEMD-160 从 `ripemd160-asm`。它与 `crypto/sha256` + `golang.org/x/crypto/ripemd160`(`btcutil.Hash160` 算法)进行位精确验证,并将 20 字节摘要直接写入结果切片——没有中间缓冲区或每个密钥的散列复制。用旧的每个密钥 `minio/sha256-simd` 调用替换提高了在 8 个线程时的运行时吞吐量 **+18.7**%(请参阅 [BENCHMARKS.md](BENCHMARKS.md))。
7. **系统可恢复扫描**:密钥空间从密钥 `1` 开始按顺序扫描,具有一个硬保证**永远不会跳过**任何密钥——无论您使用多少个工作线程,或者您在运行之间更改该计数。
8. **macOS 构建修复**:Makefile 在 Darwin 上使用外部链接模式,以避免在 macOS 15+ 上使用较旧 Go 工具链时遇到的 `missing LC_UUID load command` 问题。
目标是不要使比特币暴力破解变得可行。目标是使基准测试诚实:删除可避免的开销,测量真实的瓶颈,并仍然表明搜索空间以荒谬的幅度获胜。
## 恢复(检查点) 💾
密钥空间从私钥 `1` 开始按顺序扫描,具有一个硬保证**永远不会跳过**任何密钥——无论您使用多少个工作线程,或者您在运行之间更改该计数。
为了使此稳健,工作不是按每个线程一个固定范围进行拆分。
相反,空间被分成固定连续的 **块**;一个全局游标分发下一个块,每个工人只需声明下一个未声明的块并按顺序遍历它。线程是可互换的:有 `N` 个工作者时,一次处理 `N` 个块。
因为块是按顺序分发的,并且每个块都是从头到尾遍历的,所以仍在进行中的最低块是 **前沿**:每个低于它的密钥都已完成。检查点存储恰好是那个单个前沿密钥,与统计行相同的 10 秒间隔(加上启动时和干净的 `Ctrl+C` 时各一次):
```
{
"version": 2,
"updated_at": "2026-05-31T17:16:20Z",
"threads": 8,
"chunk_steps": 16384,
"key_batch_size": 1024,
"start_key": "0000000000000000000000000000000000000000000000000000000000000001",
"next_private_key": "0000000000000000000000000000000000000000000000000000000000000001",
"total_keys": 0
}
```
- **`start_key`** —扫描窗口的基(线性偏移 `0`)。扫描覆盖一个从这里锚定的连续 `2^64` 密钥窗口。省略它以将窗口锚定在 `next_private_key`(请参阅自定义启动)。
- **`next_private_key`** —前沿:每个低于它的密钥都已检查;扫描从这里恢复。
- **`total_keys`** —检查到前沿的密钥(`endoFactor` 每线性密钥);从前沿派生,因此它只向前移动。
- **默认文件**:工作目录中的 `checkpoint.json`(使用 `--checkpoint=path`盖)。
- **全新运行(默认)**:扫描从密钥 `1` 开始。
- **恢复**:添加 `--resume` 以从保存的前沿继续:
```
# 启动运行(每10秒写入checkpoint.json)
btc-brute-force 8 matches.txt addresses.txt
# 稍后,从停止的地方继续——使用任何线程数
btc-brute-force --resume 4 matches.txt addresses.txt
```
### 从自定义密钥开始
默认情况下,全新扫描从密钥 `1` 开始。要开始在曲线上的其他位置,请使用 `--start-key` 传递完整的 64-十六进制字符(32 字节)私钥:
```
# 从所选密钥开始的全新扫描(必须是64个十六进制字符,在[1, N)范围内)
btc-brute-force --start-key=A7F31C92B04D0210000000000000000000000000000000000000000000000001 8 matches.txt addresses.txt
```
您还可以手动编写一个最小的检查点,以从您想要的位置开始扫描并从中恢复——只需设置 `next_private_key`(不需要 `start_key`)并添加 `--resume`。窗口锚定在该密钥:
```
{ "version": 2, "next_private_key": "A7F31C92B04D0210000000000000000000000000000000000000000000000001" }
```
`--start-key` 在 `--resume` 时被忽略(检查点的自己的启动密钥获胜)。
### 在恢复之间更改线程数
扫描是 **线程数无关** 的。检查点存储一个单独的前沿,而不是每个线程的状态,因此您可以在运行之间自由更改 CPU/线程数(例如,`4 → 8 → 12 → 4`)。更多线程一次处理更多块;较少的线程处理较少的块。覆盖率和无跳过保证不受影响——恢复最多重新检查 `threads × chunk_steps` 个密钥(便宜且幂等的)并且永远不会跳过一个。
注意:
- 标志必须 **在** 位置参数之前(Go `flag` 解析在第一个非标志处停止)。
- 检查点是原子写入的(临时文件 + 重命名)并被 git 忽略(它是运行时状态)。
- 私钥 `0` 是 secp256k1 无穷远点(无效),因此扫描从 `1` 开始,而不是 `0`。
- GLV 内射仍然在每个步骤产生 6 个密钥,但只有线性密钥推进连续的前沿;其他 5 个是散布密钥的额外检查,永远不会创建一个间隙。
- 由旧分段格式(`版本 1`)编写的检查点不兼容;删除文件以从头开始进行系统扫描。
## 基准测试 📊
性能取决于 CPU 架构、Go 版本、热状态、工作者数量和目标集大小。简而言之:优化后的代码足够快,足以引起兴趣,而比特币地址空间仍然巨大无比。
**~45.1 百万密钥/秒是令人印象深刻的。2^160 仍然是无敌的。**
有关原始输出和方法,请参阅 [BENCHMARKS.md](BENCHMARKS.md)。
**当前本地基准(Apple Silicon / darwin arm64 / Go 1.22.5):**
- **Real MacBook Air M3 运行时间**:最新的持续 8 线程程序输出达到约 **45.1 百万密钥/秒**——**比 ~38.0M pre-`sha256mb` 基线提高 **+18.7**%(在 A/B 测试中连续进行,在将 HASH160 通过向量化的多缓冲区 SHA-256 + RIPEMD-160 管道路由后)。相同的生成器在 4 个线程时的吞吐量约为 **2600 万密钥/秒**(该 4 线程数字早于 SHA-256 工作;它本身比之前的 endoFactor=2 设计提高了 ~19.9M,~1.33 倍)。
- `BenchmarkKeyStreamPerKey`:`118.5 ns/op`,`0 B/op`,`0 allocs/op`——所有六个 GLV+否定变体跨所有检查密钥的平均成本(从 `136.7 ns/op` 下降 **−13.35**%,通过 `benchstat`,在 SHA-256 向量化之后)。
- 大约的热路径吞吐量:`1e9 / 118.5 = ~8.4M` 密钥/秒/基准工作者。
- **多缓冲区 SHA-256 收益**:SHA-256 占每个密钥成本的 ~23**%;`sha256mb` 的 arm64 `sha2x4` 内核以 ~2.6x 的速度散列它,Amdahl 的定律将其转换为测量的每个密钥 **−13**% 和在 8 个线程时的 **+18.7**%。
- `BenchmarkGenerateKeyAndHash160`:`29,105 ns/op`,表明旧的全新标量路径比批处理遍历每个密钥慢约 **245** 倍。
**进度快照**:热路径现在为每个计算的斜率点检查六个真实压缩公钥变体,通过融合的多缓冲区 HASH160(向量化的 SHA-256 → RIPEMD-160)进行散列,具有零拷贝输出,避免热循环分配,并通过检查点记录单个可恢复扫描前沿。运行时基准测试不再由每个密钥的标量乘法或每个密钥的 SHA-256 主导;它主要测量剩余的 RIPEMD-160 和
标签:EVTX分析, Go语言, P2PKH, PoC, RIPEMD-160, secp256k1, SHA-256, 哈希160, 哈希算法, 地址碰撞, 安全演示, 密码学, 性能工程, 性能测试, 手动系统调用, 教育工具, 日志审计, 暴力破解, 比特币, 离线工具, 程序破解