《为了找回我的压缩包密码,我手写了一个 CUDA 加速器》
《为了找回我的压缩包密码,我手写了一个 CUDA 加速器》
- 前言:一个悲伤的故事
上周翻旧硬盘,发现了一个 5 年前的加密压缩包 Photos.rar。那是大一时的照片备份,但我死活想不起密码了。
试了几个市面上的 CPU 暴力破解工具,看着那个进度条我绝望了:预计剩余时间:129 年。
我看了一眼机箱里那张闲置的 RTX 3090,又看了一眼龟速爬行的 CPU,作为一个计算机专业的学生,我不能忍。
“既然 CPU 跑不动,为什么不让 GPU 来跑?”
于是,趁着周末,我手撸了一个基于 CUDA 的分布式密码恢复工具——RapidRAR。
结果?速度从 1.2 万次/秒 飙升到了 1.1 亿次/秒,性能提升了整整 8900 倍。 那个原本需要跑 100 年的密码,喝杯咖啡的功夫就出来了。
- 为什么 CPU 这么慢?
RAR 的加密算法(尤其是 RAR5)非常“鸡贼”。它使用了 AES-256 加密,并且在密钥派生函数(KDF)中引入了大量的哈希迭代(SHA-256)。
这意味着,验证每一个密码,CPU 都要进行数万次的哈希运算。CPU 虽然单核强,但核心少(也就十几个),面对这种“计算密集型”任务,简直是被降维打击。
而 GPU 呢?它有几千个 CUDA Core。这种“大量并行、逻辑简单”的哈希计算,简直就是为 GPU 量身定做的。
- 架构设计:Python 负责指挥,CUDA 负责拼命
我不希望为了写个工具去啃几千行 C++,所以我采用了一个异构架构(Heterogeneous Architecture):
● 控制层 (Python):负责脏活累活。读取字典、生成掩码、容错处理、进度显示。
● 计算层 (CUDA Kernel):负责玩命计算。我手写了 CUDA Kernel (.cu),直接在显存里进行高强度的哈希校验。
这是我的系统架构图:
在这个设计中,Python 就像是“包工头”,负责把任务打包成一个个 Batch(批次),通过 PCIe 总线扔给 GPU。GPU 就像是几千个“打工人”,瞬间算完并返回结果。
- 遇到的坑与优化 (Implementation Details)
写这个工具并没有想象中那么顺利,主要解决了几个性能瓶颈:
1. Python GIL 锁的问题:
Python 的多线程在 CPU 密集型任务下是假的。所以我完全剥离了计算逻辑,Python 只负责 IO。同时,为了避免 GPU 等 CPU(喂不饱),我设计了一个 Producer-Consumer 模型,确保显卡利用率稳定在 95% 以上。
2. PCIe 带宽瓶颈:
一开始我发现 GPU 经常闲置,原来是数据传输太慢了。
解决方案:实现了动态批处理 (Dynamic Batching)。不是生成一个密码传一个,而是一次性生成 1000 万个密码索引,打包传到显存(VRAM),让 GPU 一次跑个爽,最大化摊薄了传输开销。
3. 跨平台适配 (Apple M4 支持):
我也想在我的 MacBook 上跑。因为 Mac 没有 NVIDIA 显卡,我专门写了一套 multiprocessing 后端,利用 M 系列芯片的性能核,跑出了接近 12 万次/秒的成绩(比 Intel i7 快了 10 倍),虽然打不过 3090,但作为移动端非常能打。
- 性能实测 (Benchmark)
测试目标是一个 AES-256 加密的 RAR5 文件。
结论: 在 3090 上,它比 CPU 快了接近 9000 倍。这什么概念?CPU 跑一年,它只需要 1 小时。
- 怎么用?(Quick Start)
为了让大家都能用上,我把环境配置做得非常简单。
第一步:Clone 代码
git clone https://github.com/aLittlecrocodile/RapidRAR.git
cd RapidRAR
pip install -r requirements.txt
第二步:一键运行
它会自动检测你的硬件。如果你有 N 卡,自动开启 CUDA;如果是 Mac,自动开启多进程。
# 比如你知道密码是 4 位数字
python main.py --rar_file my_secret.rar --mask '?d?d?d?d'
6. 写在最后
这个项目最初只是为了救急,但写着写着发现优化性能的过程真的很有趣(特别是看到 GPU 占用率跑满的那一刻)。
目前项目已经开源,功能还比较基础。如果你也对 CUDA 编程、密码学 感兴趣,或者单纯想找回你的压缩包密码,欢迎来玩!
求一个 Star <span class=
评论已关闭