忘记ZIP密码别硬猜,bkcrack破解指南:4步用已知明文找回文件
【免费下载链接】bkcrackCrack legacy zip encryption with Biham and Kocher's known plaintext attack.项目地址: https://gitcode.com/gh_mirrors/bk/bkcrack
压缩包设了密码,密码却被你忘得一干二净——这种懊恼,经历过的人都知道有多憋屈。如果你的压缩包恰好用的是传统ZIP加密(ZipCrypto),那么bkcrack就是那款专门破解这类加密的开源命令行工具:它利用 Biham 和 Kocher 提出的已知明文攻击,在不需要原始密码的情况下,把加密内部状态直接反推出来。这篇文章不堆代码、不讲高深数学,只带你走完一条完整可复现的破解流程,看完就能上手。
深夜,被一把看不见的锁锁住的压缩包
先讲个场景,你多半会觉得眼熟。
你从旧硬盘里翻出一个五年前打包的工作资料压缩包,双击,弹窗要求输入密码。你试了纪念日、试了宠物名字、试了当年最常用的那串字母数字组合……密码错误。再试,还是错误。你甚至翻出了当年的邮件和聊天记录,依然对不上号。眼看文件就在那里,却像隔着一扇上了锁的门,钥匙早丢了。
大多数人到这里会选择放弃,或者找一个号称"万能破解"的软件,结果要么收费、要么无效、要么偷偷捆绑流氓程序。其实还有第三条路:绕过密码,直接对付加密本身。bkcrack 干的就是这件事,而且它免费、开源、跨平台,连图形界面都不需要。
先确认:你面对的是ZipCrypto还是AES?
在动手之前,得先搞清楚一件事:ZIP 加密并不只有一种,bkcrack 只认其中一种。
| 加密方式 | 时代 | 强度 | bkcrack 是否适用 |
|---|---|---|---|
| 传统 ZipCrypto(传统PKWARE加密) | 上世纪90年代 | 偏弱,存在已知漏洞 | ✅ 适用 |
| AES 加密 | 现代标准 | 强 | ❌ 不适用 |
ZipCrypto 是很多老压缩软件和"默认加密选项"使用的算法,也是大量存量压缩包的加密来源。判断方法很简单:让 bkcrack 把压缩包内容列出来看一眼,加密方式一栏会直接标注 ZipCrypto。
bkcrack凭什么能攻破ZipCrypto?
知其然,最好也知其所以然。ZipCrypto 本质上是一个流密码:你用密码初始化内部状态,机器随后不断吐出一串伪随机字节,与文件内容逐字节异或,得到密文。可以把它想象成一台有三只齿轮的盖章机——三只齿轮的初始咬合位置由密码决定,每处理一个字节,齿轮就转一格。
这套机制听起来挺严谨,却被两位研究者(Biham 和 Kocher)在1994年的论文里找到了软肋:已知明文攻击。
打个比方,就像你从一摞文件里捡到一张盖过章的白纸,纸上的印痕清晰可辨。你不需要知道印章上刻的每一个字,只要有一段足够清晰的印痕,就能反推出印章的完整图案。对应到 ZipCrypto 上:你不需要知道整个文件内容,只要知道其中至少12个字节的原文(其中8字节必须连续),就能把三只齿轮的初始位置倒推出来。
这三组数字一经恢复,就相当于拿到了整把锁的备用钥匙:不但能解开压缩包里所有用同一密码加密的文件,还能顺手把密码换掉,甚至反推出原始密码。这就是 bkcrack 的核心逻辑——它不猜密码,它直接重建"钥匙"。
bkcrack安装步骤:两条路,三分钟搞定
拿到工具的方式有两种,按自己的习惯选一条就行。
路线一:下载预编译包。官方发布页会提供 Ubuntu、macOS 和 Windows 三个平台的现成可执行文件,解压即用,适合不想碰编译的人。Windows 用户如果运行时提示缺少 DLL,装一下微软的 Visual C++ 运行库即可。
路线二:从源码编译。想看看内部实现、或者想要最新代码,就克隆仓库后交给 CMake:
git clone https://gitcode.com/gh_mirrors/bk/bkcrack cd bkcrack cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install cmake --build build --config Release cmake --build build --config Release --target install编译完成后,可执行文件会出现在install目录里。到这一步,工具就算备好了。💡 顺手把命令加入 PATH,后面用起来会顺手很多。
核心流程:4步走完一次破解
接下来进入正题。整个破解过程可以拆成四个动作,每一步都附上"为什么要这么做"。
第1步:让bkcrack帮你"看"压缩包
先用查看模式确认包内情况:
bkcrack -L 加密包.zip输出会列出每个条目的加密方式、压缩方式、CRC32、原始大小和打包后大小。你的目光应该优先锁定"加密方式为 ZipCrypto、压缩方式为 Store"的条目——未压缩的文件是最好下手的目标,因为它的密文和原文几乎一一对应,攻击最快、最稳。如果包里只有 Deflate 压缩的条目,后面会讲到,难度会陡增。
第2步:凑出12字节已知明文
这是整个流程里最考验"侦察能力"的一步。已知明文从哪来?常见来源有三个:
- 文件格式特征:很多格式有固定开头,比如 PDF 以
%PDF-起头,某些脚本、配置、日志文件的开头你也能凭经验猜个八九不离十; - 同款文件:如果你能上网找到同名的原版文件(比如某个开源软件的组件),下载下来直接当明文用;
- 自己的备份:同一份内容你以前可能导出过未加密的版本。
把猜到的明文写进一个文件,注意别多加换行符:
echo -n '%PDF-1.4' > plain.txt这里还有个小福利:当密文直接从压缩包加载时,bkcrack 会自动把加密头末尾的校验字节并入已知明文——等于白送你一个字节,而且这个字节几乎可以确定是对的。
第3步:发起攻击,等那三组数字
明文就位,就可以开跑了:
bkcrack -C 加密包.zip -c 目标文件.pdf -p plain.txt终端里会先经历一段 "Z reduction"(用已知明文快速筛掉大量错误候选),随后进入正式攻击。连续明文越多,这一阶段越快。顺利的话,输出里会冒出类似这样的三组十六进制数:
Keys: 8f3a9c21 7b4d5e60 1a2b3c4d🎉 恭喜,这三组数字就是加密的内部状态,也就是我们说的"备用钥匙"。如果你在运行中手动中断了攻击,输出会提示一个--continue-attack参数,加上它就能从断点继续,不用从头再来。
第4步:用密钥收尾,三种姿势任选
拿到密钥之后,你至少有三种收尾方式,按需选用:
姿势A:直接去掉密码。生成一个内容相同、但没有加密的新压缩包:
bkcrack -C 加密包.zip -k 8f3a9c21 7b4d5e60 1a2b3c4d -D 无密码.zip姿势B:换成你知道的新密码。适合还想继续用密码保护、只是要换一个自己记得住的:
bkcrack -C 加密包.zip -k 8f3a9c21 7b4d5e60 1a2b3c4d -U 新密码包.zip 我的新密码姿势C:逐个解密文件。想保留原包结构,就一条条解密:
bkcrack -C 加密包.zip -c 目标文件.pdf -k 8f3a9c21 7b4d5e60 1a2b3c4d -d 解密后.pdf如果解出来的内容仍是乱码,别慌——那多半是 Deflate 压缩层还没拆掉。项目自带的 tools/inflate.py 脚本就是干这个的:
python3 tools/inflate.py < 解密后.bin > 最终文件.pdf顺带一提:如果你好奇原始密码到底是什么,也可以用密钥去"倒查":
bkcrack -k 8f3a9c21 7b4d5e60 1a2b3c4d --bruteforce ?p --length 8..10?p表示可打印 ASCII 字符集,8..10是长度范围。字符集越小、长度越短,跑得越快——但反过来,猜错了范围就永远找不到,所以这步要对自己的记忆做合理预估。
新手最容易踩的坑与避坑建议 ⚠️
- 拿 AES 加密的包来试。工具会明确告诉你这不是它能处理的类型,属于白忙一场。动手前先
-L确认加密方式。 - 明文不够12字节,或8个连续字节凑不齐。攻击根本跑不起来。实在凑不够时,可以用
-x参数把散落在不同偏移处的已知字节补上(比如-x 25 4b4f表示偏移25处有字节 0x4B 0x4F),凑满12字节的总量要求。 - 盯上了压缩过的条目。Deflate 压缩意味着密文对应的"原文"是压缩后的字节流,而不是你熟悉的文件内容。除非你能找到原文件并用同样的压缩级别复现它,否则很难下手。这就是为什么教程反复强调:优先选 Store 条目。
- 明文的偏移没对上。如果已知明文不是文件开头,记得用
-o指定偏移;如果明文包含加密头的一部分,偏移还可以是负数。对不上号时,攻击要么报错,要么算出一堆假密钥。 - 密码找回阶段乱猜字符集。先用全字节集
?b探一遍长度上限,再逐步收窄到?p、?a,比一上来就猜"应该是字母数字"稳妥得多。项目自带的 example/tutorial.md 里就完整演示了这种"先宽后窄"的思路。
什么场景才适合动用它?
工具没有善恶,用的人有。请务必记住:bkcrack 只应该用来处理你自己拥有、或已获得明确授权的文件。典型正当场景包括:恢复自己遗忘密码的档案、帮家人找回旧资料、受企业委托评估内部文档的加密强度。未经授权破解他人文件,轻则侵权,重则违法——这不是免责声明式的套话,而是真实存在的法律风险。做安全审计时,先拿到书面授权再动手,对你和你的客户都是一种保护。
如果你对攻击算法的细节感兴趣,源码是最好的老师:攻击主逻辑在 src/Attack.cpp,ZIP 解析在 src/Zip.cpp,密钥状态机在 src/Keys.cpp,官方说明和限制清单分别见 doc/index.md 与 doc/limitations.md。
最后想对你说的
密码只是通往文件的一道门,而 bkcrack 让你在丢钥匙之后,还能照着一块印痕把门重新打开。下一次再对着密码输入框发呆时,不妨先冷静下来想一想:你手里有没有一段"已知"的内容?如果有,那扇门就还没关死。记得先确认加密类型,再凑齐12字节明文,然后按这4步走下去——你的文件,大概率能找回来。
【免费下载链接】bkcrackCrack legacy zip encryption with Biham and Kocher's known plaintext attack.项目地址: https://gitcode.com/gh_mirrors/bk/bkcrack
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考