Asylian21/btc-brute-force

GitHub: Asylian21/btc-brute-force

离线比特币地址碰撞研究工具包,用于比特币安全教育和性能基准测试。

Stars: 2 | Forks: 1

# 比特币地址碰撞研究工具包 [![Go](https://img.shields.io/badge/Go-1.22+-00ADD8?logo=go&logoColor=white)](https://go.dev/) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/077b3a7e59025015.svg)](https://github.com/Asylian21/btc-brute-force/actions/workflows/ci.yml) [![Release](https://img.shields.io/github/v/release/Asylian21/btc-brute-force?include_prereleases&label=release)](https://github.com/Asylian21/btc-brute-force/releases) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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, 哈希算法, 地址碰撞, 安全演示, 密码学, 性能工程, 性能测试, 手动系统调用, 教育工具, 日志审计, 暴力破解, 比特币, 离线工具, 程序破解