尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

bkcrack 实战指南:忘记ZIP文件密码?3步用已知明文攻击找回数据

bkcrack 实战指南:忘记ZIP文件密码?3步用已知明文攻击找回数据 bkcrack 实战指南忘记ZIP文件密码3步用已知明文攻击找回数据【免费下载链接】bkcrackCrack legacy zip encryption with Biham and Kochers known plaintext attack.项目地址: https://gitcode.com/gh_mirrors/bk/bkcrack一段真实经历你把大学四年的论文、照片和项目代码打包成一个 ZIP 存进了硬盘顺手加了个密码。三个月后想打开密码死活想不起来。暴力破解十万种组合测到天亮也未必有结果。直到你认识了 bkcrack——一个专门破解传统 ZIP 加密ZipCrypto的命令行工具。它不走猜密码的老路而是利用 Biham 和 Kocher 的已知明文攻击只要你知道文件里的哪怕 12 个字节内容就能直接恢复加密密钥把文件救出来。先回答一个关键问题它和你见过的破解工具哪里不一样普通的 ZIP 密码破解工具比如跑字典、暴力枚举是在猜密码一个接一个试试对了才算赢。密码稍微复杂点耗时就从分钟变成年。bkcrack 换了个思路。它不猜密码而是从加密数据本身反推密钥。原理上它利用了 ZipCrypto 算法的一个致命缺陷——这个 1990 年代的加密算法早在 1994 年就被密码学家 Biham 和 Kocher 证明了可以被已知明文攻击突破。这句话翻译成人话就是只要你知道被加密文件里一部分内容就能算出打开它的钥匙。而且算出钥匙之后连密码都不用知道直接就能解密。真正让人惊喜的是它还会顺手帮你找回原始密码。后面我们会看到。安装上手5 分钟跑起来bkcrack 是个 C 项目编译很简单前提是你装好了 CMake 和 C 编译器。先把仓库克隆到本地git clone https://gitcode.com/gh_mirrors/bk/bkcrack cd bkcrack然后在源码根目录依次执行三条命令cmake -S . -B build -DCMAKE_INSTALL_PREFIXinstall cmake --build build --config Release cmake --build build --config Release --target install编译完成后可执行文件会出现在install/目录里。不想编译的话也可以直接下载官方预编译包Ubuntu、macOS、Windows 都有解压即用。Windows 用户如果提示缺少运行库装一下最新的 Microsoft Visual C Redistributable 即可。验证是否成功./install/bkcrack --version能打印出版本号就说明环境没问题了。首次实战用自带的示例 ZIP 完整跑一遍项目里自带了一个学习用的加密压缩包example/secrets.zip里面有两个文件advice.jpg和spiral.svg全都用了 ZipCrypto 加密。我们拿它当靶子。第一步摸清敌方情报。进入example目录用-L参数列出压缩包里的条目../install/bkcrack -L secrets.zip输出长这样Archive: secrets.zip Index Encryption Compression CRC32 Uncompressed Packed size Name ----- ---------- ----------- -------- ------------ ------------ ---------------- 0 ZipCrypto Deflate 7ca9f10a 54799 54700 advice.jpg 1 ZipCrypto Store a99f1d0d 1265 1277 spiral.svg注意两列Encryption显示ZipCrypto说明可以用 bkcrack 攻击Compression里spiral.svg是Store未压缩这是最理想的攻击目标——未压缩文件的密文和原文几乎一一对应猜明文特别容易。第二步准备已知明文。spiral.svg是 SVG 图片SVG 文件几乎都以?xml version1.0开头这就是我们需要的已知明文一共 20 个字节远超 12 字节的最低要求。把它写进一个文件注意-n参数别让echo多加一个换行符echo -n ?xml version1.0 plain.txt第三步发起攻击。../install/bkcrack -C secrets.zip -c spiral.svg -p plain.txt参数含义-C指定加密压缩包-c指定密文对应的条目-p指定已知明文文件。跑一会儿屏幕上就会出现三组十六进制数字[17:48:03] Keys c4490e28 b414a23d 91404b31这就是恢复出来的内部密钥三个 32 位整数 X/Y/Z。到这一步加密已经被突破了。第四步用密钥救出文件。最简单粗暴的方式是生成一个去密码的新压缩包../install/bkcrack -C secrets.zip -k c4490e28 b414a23d 91404b31 -D secrets_without_password.zip之后任何解压软件都能直接打开这个新压缩包。想保留加密、只换成你记得的新密码用-U../install/bkcrack -C secrets.zip -k c4490e28 b414a23d 91404b31 -U secrets_newpass.zip easy想逐个文件解密也行用-d指定输出文件。spiral.svg本身未压缩解出来就能直接用advice.jpg是 Deflate 压缩过的解密后还得解压项目里贴心地提供了脚本python3 ../tools/inflate.py advice_deciphered.deflate advice.jpg至此secrets.zip里的秘密全部到手。整个流程走下来你会发现自始至终没用到密码。原理人话版为什么知道 12 个字节就能破门而入先给结论ZipCrypto 的加密过程等于拿一把特定规则生成的钥匙流和你的文件内容逐字节做异或。而 bkcrack 能根据一小段已知的原文密文把这把钥匙流的内部状态完整还原出来。拆开看ZipCrypto 干的事情是这样的你用密码初始化三个 32 位整数叫 X、Y、Z这就是加密的内部状态。加密时程序用这三个整数不断生成一串伪随机字节叫 keystream密钥流。每个明文字节和密钥流里的一个字节做异或得到密文字节。每加密一个字节X、Y、Z 还会被更新一次。这里的关键缺陷在于密文 明文 ⊕ 密钥流而异或运算是可逆的。只要你知道一小段密文和它对应的明文就能算出那段密钥流。而密钥流的生成规则又跟内部状态强绑定——Biham 和 Kocher 在论文里证明了用 12 个字节的已知明文就能把 X/Y/Z 这三个内部状态反推出来。你可以把整个过程想象成你捡到一本上了密码锁的日记密文而锁的机械结构有设计缺陷。你不需要试遍所有密码组合只要知道日记里某一句话的开头已知明文顺着锁芯的齿轮结构反推就能把锁拆开——而且拆开一次这把锁的钥匙内部状态就到手了日记里其他所有页都能翻。几个和直觉相反的点提前说清楚bkcrack 恢复的是内部状态不是密码本身。但内部状态和密码是等价的——解密、去密码、改密码用内部状态全都能做。密码只是生成内部状态的输入。所以即使原始密码很长很复杂只要内部状态拿到了复杂度就跟你无关了。想找回原始密码也可以bkcrack 支持从内部状态反向爆破密码后面进阶玩法会讲。进阶玩法5 个让效率翻倍的技巧技巧一明文不在开头用-o指定偏移如果你知道的明文不是文件开头而是在第 100 个字节的位置用-o告诉它偏移量bkcrack -c cipherfile -p plainfile -o 100偏移量还可以是负数——如果你连加密头的一部分都知道甚至可以指到密文开头之前。技巧二只有零散字节用-x拼凑明文明文要求是总共 12 字节其中至少 8 字节连续。如果你只有几段零散的已知字节用-x一点一点喂进去bkcrack -c cipherfile -p plainfile -x 25 4b4f -x 30 21-x 25 4b4f的意思是偏移 25 处有两个字节4b 4f。多补几段凑够 12 字节总量。技巧三别忘了免费的检查字节ZIP 规范里每个条目加密前会加 12 字节的加密头其中最后一个字节可以由条目元数据推算出来专门用来校验密码是否正确。bkcrack 从压缩包加载密文时会自动把这个检查字节算进已知明文。也就是说你实际只需要自己准备 11 字节或者更少。技巧四密钥拿到了密码也顺便找回来有了内部状态想恢复原始密码就用-r指定长度范围和字符集bkcrack -k c4490e28 b414a23d 91404b31 -r 10..11 ?p?p是可打印 ASCII 字符集其他预定义字符集还有?l小写、?u大写、?d数字、?a字母数字、?b全部字节。字符集选得越小越快但别选小了导致漏掉正确答案。技巧五中断了别慌支持断点续传攻击或者密码恢复被打断时程序会提示一个续传点照抄参数就能接着跑# 攻击续传 bkcrack ... --continue-attack 183750 # 密码恢复续传 bkcrack ... --continue-recovery 573478303030另外-j可以指定线程数默认自动用满所有核心-e可以改为穷举所有解而不是找到第一个就停。避坑清单最常见的 7 个坑坑表现解决办法压缩包用了 AES 加密-L列表里 Encryption 列显示Otherbkcrack 只支持 ZipCryptoAES 无能为力换工具明文少于 12 字节报错提示明文不足用-x补零散字节凑够总量明文不连续攻击极慢或失败至少保证 8 字节连续越多越好目标是 Deflate 压缩文件猜到开头却攻击失败优先选 Store 未压缩条目压缩条目需要拿到原始文件再压缩成同样式样echo多了换行符明文尾部混入\n校验不过加-n或把明文写进文件而不是用 echo输入输出文件名相同报错要求不同文件-C和-D/-U必须指向不同压缩包-c和-d同理攻击太慢进度条半天不动提供更多连续明文-t默认只读 1 MiB够用或减小编译版本、用-j开满线程还有一条隐藏规则同一个人用同一个密码加密的多个压缩包密钥是共通的。攻破一个其他几个都能用同一组-k直接解密。速查问答Qbkcrack 支持 AES 加密的 ZIP 吗A不支持只针对传统 ZipCryptoPKWARE 流密码加密。Q到底需要多少已知明文A至少 12 字节其中至少 8 字节必须连续实践上越多越快。Q不知道密码也能解密吗A能。恢复内部密钥后直接-d、-D或-U全程不需要密码。Q破解速度受什么影响A连续明文的长度越长越快、文件是否压缩、CPU 核数与线程数。Q-D和-U有什么区别A-D生成无密码的新压缩包-U生成换成新密码的新压缩包。Q密钥和密码什么关系A密码是密钥的原材料密钥X/Y/Z 三个整数是攻击的直接产物二者都能用于解密。写在最后工具没有立场用的人有回到开头的场景那个让你失眠的 ZIP现在有了明确的解法——看一眼里面文件的类型从常见文件头里抠出已知明文跑一次攻击几十分钟内就能拿回数据。这正是 bkcrack 存在的意义让遗忘不再等于永久丢失。但请务必记住一条底线只对你自己拥有、或已获授权的文件使用。它是数据恢复与安全审计的利器不是打开他人私密文件的万能钥匙。想更深入下一步可以读项目里的完整教程 example/tutorial.md里面连密码是 W4sF0rgotten 是怎么被一步步试出来的都有演示技术细节和限制见 readme.md 与 doc/limitations.md。如果想研究攻击算法本身核心实现在 src/Attack.cppZIP 格式解析在 src/Zip.cpp密钥处理在 src/Keys.cpp参数解析在 src/Arguments.cpp——从这些文件读起你会看到一把锁被打开的全过程。祝你今晚就找回那些以为再也见不到的文件。【免费下载链接】bkcrackCrack legacy zip encryption with Biham and Kochers known plaintext attack.项目地址: https://gitcode.com/gh_mirrors/bk/bkcrack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表