如何解压缩 pkAES-256 Deflate 加密的 zip 文件?

How to decompress an pkAES-256 Deflate encrypted zip files?

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

方法: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.

感谢您的帮助。

ZIP 文件格式,至少是一种被大量图书馆普遍理解和支持的格式,只支持一种加密;它被称为 'ZipCrypto',质量可疑(它并没有完全损坏,但很容易导致无法阅读该 zip 文件的人会弄清楚它的情况。它是例如很容易尝试大量的密码,所以如果密码是一个简单的字典单词,它几乎没有用)。这是你在命令行上 运行 zip -c 时获得的密码,几乎每个 'zip' 可执行文件的分发。

WinZip 自行添加了一个名为 StrongCrypto 的 ZIP 格式扩展,它是基于 AES-256 的。听起来你有。

zip 或多或少是 public 域(这很棘手;PKWare 作为一家公司或多或少拥有它的各个部分,但是,例如 [=52= 中的 /bin/unzip 命令] 发行版是完全开源的,从法律上讲 zip 的命运有点难以解释)...所以当 winzip 本身只是向 zip 概念添加功能时,这是非常愚蠢的:无论是开源社区, PKWare 和 PKWare 都不会同意这种随机的飞越式升级,所以很长一段时间以来,这些 'WinZip based strongcrypto zip files that end in .zip' 都不是 zip 文件,如果这令人困惑,那么责任完全落在 WinZip, Inc. 的肩上。 你刚才得到的不是 zip 文件,即使它看起来像一个

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

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

如果您坚持这样做,并且无法更改正在发送的文件的格式,则您需要 7zip。 7zip 是开源的,可能可以解密这个文件,而大多数开源 'zip' 库不能。一个大问题是我不知道 all-java 7zip impl。 7zip-binding project,它只是将工作外包给 C 库,这意味着你需要一个 so-called 'native' 文件和你的 java 项目([=51= 上的 DLL,linux 上的 .SO 文件,mac 上的 .JNILIB 文件),每个 [=44= 都需要一个这样的文件] 你想要支持的组合。有点痛苦,它破坏了 java 的 'write once run anywhere' 承诺,但这是你必须要做的。该网站看起来已经足够老了,可以点啤酒了,但据我所知,它正在维护中,所以就是这样。但是,说真的,不要使用 zip 的内置加密功能,它很糟糕。尽量避免。

注意:7zip 可以做到这一点的原因是意见不同:支持普通 zip 的开源社区努力保持简单以确保尽可能多的平台可以做到这一点,这可能就是为什么有各种各样的 all-java zip 暗示周围。 7zip 试图获得出色的支持,但代价是移植 7zip 变得更加困难,这可能就是为什么没有 all-java 7zip impl,只有绑定的原因。因此,7zip 愿意尝试弄清楚如何解密这个 winzip 东西,普通 zip 则不然。