kimci86 / bkcrack 安装和使用方法

3,329 阅读5分钟

bkcrack

CI badgerelease badgelicense badge

用Biham和Kocher的已知明文攻击来破解传统的zip加密。

概述

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

bkcrack是一个命令行工具,它实现了这种已知明文攻击。其主要特点是:

  • 从密码文本和明文中恢复内部状态。
  • 利用内部状态改变ZIP档案的密码。
  • 从内部状态中恢复原始密码。

安装

预编译的软件包

你可以在GitHub上获得最新的官方版本。

Ubuntu、MacOS和Windows的预编译包可供下载。将下载的压缩包解压到你喜欢的地方。

在Windows上,bkcrack的运行需要微软的运行时库。如果你的系统上还没有安装这些库,请下载并安装最新的微软Visual C++ Redistributable软件包。

从源代码编译

另外,你也可以用CMake编译该项目。

首先,下载源文件或克隆git仓库。然后,在源码树中运行以下命令将在install 文件夹中创建一个安装。

cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install
cmake --build build --config Release
cmake --build build --config Release --target install

第三方软件包

Packaging status

bkcrack可以在右边列出的软件包库中找到。这些软件包是由外部维护者提供的。

使用方法

列出条目

你可以在一个名为archive.zip 的档案中看到条目名称和元数据的列表,就像这样。

bkcrack -L archive.zip

使用ZipCrypto加密的条目容易受到已知文本的攻击。

恢复内部密钥

该攻击需要至少12个字节的已知明文。其中至少有8个必须是连续的。连续的已知明文越大,攻击就越快。

从压缩文件中加载数据

有一个 zip 档案encrypted.zip ,其条目cipher 是密码文本,plain.zip ,其条目plain 是已知明文,可以像这样运行 bkcrack。

bkcrack -C encrypted.zip -c cipher -P plain.zip -p plain

从文件中加载数据

有一个文件cipherfile ,其中有密码文本(从对应于加密头的12个字节开始)和plainfile ,其中有已知的明文,可以这样运行bkcrack。

bkcrack -c cipherfile -p plainfile

偏移量

如果明文对应于密码文本开头以外的部分,你可以指定一个偏移量。如果明文包括加密头的一部分,它可以是负数。

bkcrack -c cipherfile -p plainfile -o offset

稀疏的明文

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

bkcrack -c cipherfile -p plainfile -x 25 4b4f -x 30 21

线程的数量

如果bkcrack是在启用了并行模式的情况下建立的,那么所使用的线程数可以通过环境变量OMP_NUM_THREADS 来设置。

解密

如果攻击成功,与用于攻击的密码文本相关的破译数据可以被保存。

bkcrack -c cipherfile -p plainfile -d decipheredfile

如果从以前的攻击中知道了密钥,就有可能使用bkcrack来破译数据。

bkcrack -c cipherfile -k 12345678 23456789 34567890 -d decipheredfile

解压

被解密的数据可能会被压缩,这取决于创建压缩文件时是否使用了压缩。如果使用了deflate压缩,可以使用tools 文件夹中提供的一个Python 3脚本来解压数据。

python3 tools/inflate.py < decipheredfile > decompressedfile

解锁加密的压缩文件

也可以用你选择的密码生成一个新的加密档案。

bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -U unlocked.zip password

这样生成的档案可以用新的密码用任何压缩文件工具来提取。它假定每个条目最初都是用相同的密码加密的。

恢复密码

考虑到内部密钥,bkcrack可以尝试找到指定长度的原始密码。

bkcrack -k 1ded830c 24454157 7213b8c5 -r 10 ?p

学习

example 文件夹中提供了一个教程。

更多信息,请查看文档和阅读源代码。

贡献

请不要犹豫,在GitHub上提出改进建议或提交拉动请求。

许可证

这个项目是根据zlib/png许可证的条款提供的。