首页 > 解决方案 > 如何解压缩 pkAES-256 Deflate 加密的 zip 文件?

问题描述

我需要使用 Java 解压缩压缩文件,并使用以下信息保护密码:

方法:pkAES-256 放气

特征:0xD StrongCrypto:加密 StrongCrypto

我尝试使用 zip4j,但它总是给我这个堆栈跟踪:

net.lingala.zip4j.exception.ZipException: java.io.IOException: java.util.zip.DataFormatException: invalid code lengths set
    at net.lingala.zip4j.tasks.AsyncZipTask.performTaskWithErrorHandling(AsyncZipTask.java:51)
    at net.lingala.zip4j.tasks.AsyncZipTask.execute(AsyncZipTask.java:38)
    at net.lingala.zip4j.ZipFile.extractFile(ZipFile.java:494)
    at net.lingala.zip4j.ZipFile.extractFile(ZipFile.java:460)
    at Main.main(Main.java:29)
Caused by: java.io.IOException: java.util.zip.DataFormatException: invalid code lengths set
    at net.lingala.zip4j.io.inputstream.InflaterInputStream.read(InflaterInputStream.java:55)
    at net.lingala.zip4j.io.inputstream.ZipInputStream.read(ZipInputStream.java:141)
    at net.lingala.zip4j.io.inputstream.ZipInputStream.read(ZipInputStream.java:121)
    at net.lingala.zip4j.tasks.AbstractExtractFileTask.unzipFile(AbstractExtractFileTask.java:82)
    at net.lingala.zip4j.tasks.AbstractExtractFileTask.extractFile(AbstractExtractFileTask.java:64)
    at net.lingala.zip4j.tasks.ExtractFileTask.executeTask(ExtractFileTask.java:39)
    at net.lingala.zip4j.tasks.ExtractFileTask.executeTask(ExtractFileTask.java:21)
    at net.lingala.zip4j.tasks.AsyncZipTask.performTaskWithErrorHandling(AsyncZipTask.java:44)
    ... 4 more
Caused by: java.util.zip.DataFormatException: invalid code lengths set
    at java.util.zip.Inflater.inflateBytes(Native Method)
    at java.util.zip.Inflater.inflate(Inflater.java:259)
    at net.lingala.zip4j.io.inputstream.InflaterInputStream.read(InflaterInputStream.java:45)
    ... 11 more

有人知道如何处理这种加密吗?我只能用 7zip 打开这些文件——但我需要用 Java 来打开。

谢谢您的帮助。

标签: javaencryptionzipaes

解决方案


ZIP 文件格式,至少是被大量库普遍理解和支持的一种,只支持一种加密;它被称为“ZipCrypto”,它的质量令人怀疑(它并没有完全损坏,但很容易在一个不应该能够读取该 zip 文件的人会弄明白的情况下结束。例如很容易尝试大量的密码,所以如果密码是一个简单的字典单词,它几乎是无用的)。zip -c这是您在命令行上运行几乎所有“zip”可执行文件分发时获得的加密。

WinZip 单独添加了 ZIP 格式的扩展,称为 StrongCrypto,它基于 AES-256。听起来你有那个。

zip 或多或少是公共领域(这很棘手;PKWare 作为一家公司或多或少拥有它的各个部分,但是,例如,您的 linux 发行版中的 /bin/unzip 命令是完全开源的,从法律上讲,zip 的命运有点很难解释)...所以当 winzip 单独为 zip 概念添加功能时,这是非常愚蠢的:整个开源社区和 PKWare 都不会同意这种随机的飞越升级,所以对于很长一段时间以来,这些“以 .zip 结尾的基于 WinZip 的强加密 zip 文件”并不是 zip 文件,如果这令人困惑,那么责任就完全落在了 WinZip, Inc. 的肩上。你所拥有的并不是一个 zip 文件,即使它看起来像一个 .zip 文件

然而,从那时起,至少 WinZip 和 PKWare 现在达成了协议,他们可以解密彼此更强大的加密产品。然而,开源社区大多已经洗手了,并不认为这些强加密选项是“zip 文件”。这就解释了为什么您拥有的库无法解密此文件,而且可能永远也不会。

因此,由于这种混乱完全是由于 PKWare 和 WinZip 的恶作剧:如果你想加密一个 zip 文件,我强烈建议你不要使用 zip 内置的东西(既不是 ZipCrypto 不好,也不是 StrongCrypto 是严重支持),但只是像平常一样压缩而不加密,然后加密生成的文件(然后不要命名该文件foo.zip,因为它不再是 zip 文件。foo.zip.enc将是一个更好的名称)。

如果您对此感到困惑,并且无法更改正在发送的文件的格式,则需要 7zip。7zip 是开源的,可能可以解密这个文件,而大多数开源“zip”库不能。一个大问题是我知道没有全java 7zip impl。有7zip - binding项目,这只是将工作分配给 C 库,这意味着您需要一个带有 java 项目的所谓“本机”文件(Windows 上的 DLL,linux 上的 .SO 文件和 mac 上的 .JNILIB 文件),并且对于要支持的每个架构/操作系统组合,您都需要一个这样的文件。有点痛苦,它破坏了 java 的“一次编写,随处运行”的承诺,但这是你必须要做的。该网站看起来已经足够老,可以订购啤酒,但据我所知,它正在维护中,所以就是这样。但是,说真的,不要使用 zip 内置的加密东西,这很糟糕。尽量避免它。

注意:7zip 可以做到这一点的原因是意见不同:支持普通 zip 的开源社区努力保持简单,以确保尽可能多的平台可以做到,这可能就是为什么有各种全 java zip impls 的原因。7zip 试图提供出色的支持,但代价是使移植 7zip 变得更加困难,这可能就是为什么没有全 java 7zip impl,只有绑定的原因。因此,7zip 愿意尝试找出如何解密这个 winzip 的东西,而普通 zip 不是。


推荐阅读