bkcrack:一款基于已知明文攻击的传统zip加密破解工具

2023-02-10 16:45:14 浏览数 (1)

关于bkcrack

ZIP压缩文件中可能包含许多内容可以被压缩或加密的条目,而这些数据条目可以使用基于密码的对称加密算法(称为传统PKWARE加密、传统加密或ZipCrypto)进行加密。该算法生成一个伪随机字节流(密钥流),将其与条目的内容(明文)进行异或运算,以生成加密数据(密文)。生成器的状态由三个32位整数组成,使用密码进行初始化,然后随着加密的进行,使用明文不断更新。Eli Biham和Paul C.Kocher在研究论文《PKZIP流密码的已知明文攻击》中所示,这种加密算法易受已知明文攻击。给定密文和12个或更多字节的对应明文,可以恢复密钥流生成器的内部状态。这种内部状态足以完全解密密文以及使用相同密码加密的其他条目。它还可以用于对复杂度为nl-6的密码进行加密,其中n是字符集的大小,l是密码的长度。

bkcrack是一款基于已知明文攻击的传统zip加密破解工具,该工具基于Biham和Kocher的已知明文攻击实现其功能。该工具是一款命令行工具,并实现了下列功能:

1、从密文和明文中恢复内部状态; 2、使用内部状态更改ZIP文件的密码; 3、从内部状态恢复原始密码;

工具安装

预编译包

我们可以直接访问该项目的Releases页面下载官方发布的最新bkcrack预编译版本。

项目提供了针对Ubuntu、macOS和Windows操作系统的预编译包,我们可以选择所需版本下载并解压即可。

在Windows平台上,我们还需要安装和配置微软运行时库,如果没有安装的话,请自行下载最新版本的Microsoft Visual C Redistributable包。

源码编译

除此之外,我们还可以使用下列命令将该项目源码克隆至本地:

代码语言:javascript复制
git clone https://github.com/kimci86/bkcrack.git

然后使用CMake手动构建项目代码。

接下来,运行下列命令将会在项目install目录中创建一个安装版本:

代码语言:javascript复制
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install
cmake --build build --config Release
cmake --build build --config Release --target install

(向右滑动、查看更多)

第三方包

工具使用

枚举数据条目

我们可以使用下列命令查看名为archive.zip文档中的所有条目名称和元数据:

代码语言:javascript复制
bkcrack -L archive.zip

使用ZipCrypto加密的条目无法抵御已知明文攻击。

恢复内部密钥

此操作需要至少12字节的已知明文,相邻的已知明文越多,破解速度越快。

从ZIP文档加载数据

假设ZIP文档名为encrypted.zip,条目cipher为密文,plain.zip中包含条目plain为已知明文,即可运行下列命令:

代码语言:javascript复制
bkcrack -C encrypted.zip -c cipher -P plain.zip -p plain

(向右滑动、查看更多)

从文件加载数据

假设文件cipherfile中包含密文,plainfile包含已知明文,即可运行下列命令:

代码语言:javascript复制
bkcrack -c cipherfile -p plainfile

偏移量

如果明文对应于密文开头以外的部分,则可以指定偏移量。如果明文包含加密Header的一部分,则该值可能为负值:

代码语言:javascript复制
bkcrack -c cipherfile -p plainfile -o offset

稀疏明文

如果你知道很少的连续明文(在8到11个字节之间),但知道一些其他已知偏移量的字节,则可以提供这些信息以达到总共12个已知字节的要求。为此,请使用-x参数,后跟偏移量和十六进制字节:

代码语言:javascript复制
bkcrack -c cipherfile -p plainfile -x 25 4b4f -x 30 21

(向右滑动、查看更多)

线程数量

如果bkcrack是在启用并行模式的情况下构建的,则可以通过环境变量OMP_NUM_threads设置使用的线程数。

解密器

如果攻击成功,可以使用下列命令保存解密数据以及相关的密文:

代码语言:javascript复制
bkcrack -c cipherfile -p plainfile -d decipheredfile

(向右滑动、查看更多)

如果从之前的攻击获取到了密钥,则可以使用下列命令继续解密数据:

代码语言:javascript复制
bkcrack -c cipherfile -k 12345678 23456789 34567890 -d decipheredfile

解压缩

代码语言:javascript复制
python3 tools/inflate.py < decipheredfile > decompressedfile

解锁加密文档

代码语言:javascript复制
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -U unlocked.zip password

恢复密码

根据给定的内部密钥,bkcrack还可以尝试找出原始密码:

代码语言:javascript复制
bkcrack -k 1ded830c 24454157 7213b8c5 -r 10 ?p

我们还可以指定最小的密码长度:

代码语言:javascript复制
bkcrack -k 18f285c6 881f2169 b35d661d -r 11..13 ?p

许可证协议

本项目的开发与发布遵循Zlib开源许可证协议。

项目地址

bkcrack

https://github.com/kimci86/bkcrack

参考资料:

https://cmake.org/

0 人点赞