java - 如何解压缩 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 来打开。
谢谢您的帮助。
解决方案
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 不是。
推荐阅读
- python - 如何将具有 Excel 序列日期和常规日期的列转换为 pandas 日期时间?
- jmeter - 如何让 JMeters 访问日志采样器使用时间戳进行延迟
- typescript - React Native Paper List.Accordion 我可以放图标
- c - 全局变量memset vs 局部变量创建一次又一次
- java - 用于进行更改的 Java 程序
- lua - 如何从 WoW 插件中的框架调用匿名函数?
- ide - 在 PhpStorm 中添加多个游标的重映射键
- vba - VBA 网页抓取:Internet Explorer 和 XMLHTTP 请求之间的区别
- ionic-framework - 如何从 Ionic 5 中的推送通知中打开应用程序 + 特定 URL?
- web-applications - 将我的客户根 CA 证书存储在我的应用程序的浏览器会话存储中是否可行?