我需要使用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来完成。
谢谢您的帮助。
答案 0 :(得分:0)
ZIP文件格式至少是一种被众多库所普遍理解和支持的格式,仅支持一种加密方式。它被称为“ ZipCrypto”,质量可疑(它并没有完全破坏,但是很容易遇到无法阅读该zip文件的人将其弄清楚的情况。例如,尝试大量的密码非常容易,因此,如果密码是一个简单的词典单词,则几乎没有用)。这是当您在命令行中针对“ zip”可执行文件的几乎每个分发版本运行zip -c
时获得的加密货币。
WinZip独自添加了对称为StrongCrypto的ZIP格式的扩展,该扩展基于AES-256。听起来像你有。
zip或多或少是公共领域(这很棘手;作为公司的PKWare或多或少拥有它的各个部分,但是,例如,Linux发行版中的/ bin / unzip命令是完全开源的,从法律上讲是zip有点难以解释)...因此,当winzip本身只是向zip概念添加功能时,这是很愚蠢的:无论是开放源代码社区还是PKWare,都不会同意这种随机飞越式升级,因此,很长一段时间以来,这些“以.zip结尾的基于WinZip的Strongcrypto zip文件”并不是zip文件,如果令人困惑,则应将责任完全落在WinZip,Inc.的肩膀上。 您所拥有的并不是一个zip文件,即使它看起来像一个。
但是,从那时起,至少WinZip和PKWare现在达成了协议,他们可以解密彼此更强大的加密产品。但是,开放源代码社区大都洗手了,并不将这些强密码选项视为“ zip文件”。这就解释了为什么您拥有的库无法解密此文件,并且可能永远也不会解密。
因此,由于这种混乱完全是由于PKWare和WinZip的恶作剧所致:如果您想加密zip文件,我强烈建议您不要使用zip内置的东西(都不使用ZipCrypto不好,也没有大力支持的StrongCrypto),而是像往常一样压缩而不压缩,然后加密生成的文件(然后不要命名该文件foo.zip
,因为它不再是zip文件。 foo.zip.enc
将是一个更好的名字。)
如果遇到这种情况,并且无法更改发送文件的格式,则需要7zip。 7zip是开源的,可能可以解密此文件,而大多数开源的“ zip”库则不能。一个大问题是,我没有意识到所有的Java 7zip impl。 是7zip-binding project,它只是将工作分配到C库中,这意味着Java项目中需要一个所谓的“本机”文件(Windows上的DLL,在Linux上是.SO文件,在Mac上是.JNILIB文件),并且您要支持的每种体系结构/ OS组合都需要一个这样的文件。有点痛苦,它破坏了Java的“写一次就可以在任何地方运行”的承诺,但这是您必须要做的。该网站看起来足够老,可以点啤酒,但据我所知,它一直在维护中,因此就可以了。但是,严重的是,不要使用zip内置的加密内容,这很糟糕。尽量避免它。
注意:7zip之所以能够做到这一点,是意见分歧:支持纯zip的开源社区努力保持简单性,以确保许多平台都可以做到这一点,这可能就是为什么存在各种全Java zip隐式实现的原因。 7zip试图寻求强大的支持,但代价是使移植7zip变得更加困难,这可能就是为什么没有全Java 7zip impl而是绑定的原因。因此,7zip愿意尝试弄清楚如何解密该Winzip内容,而普通zip则不是。