256压缩加密的zip文件?

inkz8wg9  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(821)

我需要用java解压压缩文件,这些文件是经过压缩的,密码由以下信息保护:
方法:pkaes-256 deflate
特征:0xd STRONG CRYPTO:加密STRONG CRYPTO
我试着使用zip4j,但它总是给我这个stacktrace:

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。
谢谢你的帮助。

8e2ybdfx

8e2ybdfx1#

zip文件格式,至少是被无数图书馆普遍理解和支持的格式,只支持一种加密;它被称为'zipcrypto',它的质量令人怀疑(它没有完全损坏,但很容易在一个场景中结束,不应该能够读取zip文件的人会发现它。例如,很容易尝试大量的密码,因此如果密码是一个简单的字典单词,那么它基本上是无用的)。这是你跑步时得到的密码 zip -c 在命令行上,几乎每个“zip”可执行文件的发行版。
winzip单独添加了一个zip格式的扩展名strongcrypto,它基于aes-256。听起来你有。
zip或多或少是一个公共领域(这很棘手;pkware作为一家公司或多或少拥有它的各个部分,但是尽管如此,例如linux发行版中的/bin/unzip命令是完全开源的,从法律上讲,zip的命运有点难以解释)。。。因此,当winzip本身只是在zip概念中添加了一些特性时,这是非常愚蠢的:无论是整个开源社区,还是pkware,都不会同意这种随机的flyby升级,所以在很长一段时间内,这些以.zip结尾的基于winzip的strongcrypto-zip文件都不是zip文件,如果这让人困惑的话,责任完全落在winzip公司的肩上。你所拥有的不是zip文件,即使它看起来像一个。
然而,从那时起,至少winzip和pkware现在达成了协议,他们可以解密对方更强大的加密产品。然而,开源社区大多已经洗手不干,并不认为这些强加密选项是“zip文件”。这就解释了为什么你的库不能解密这个文件,而且可能永远也不会。
因此,由于这种混乱完全是由于pkware和winzip的恶作剧:如果你想加密一个zip文件,我强烈建议你不要使用zip的内置东西(既不是不好的zipcrypto,也不是不好支持的strongcrypto),而是像普通的zip一样不加密,然后加密生成的文件(然后不命名该文件) foo.zip ,因为它不再是zip文件。 foo.zip.enc 是个更好的名字)。
如果你被这个问题困住了,而且不可能改变发送文件的格式,你需要7zip。7zip是开源的,可能可以解密这个文件,而大多数开源的“zip”库不能。一个大问题是,我所知道的并不是所有的java7zip impl。有一个7zip绑定项目,它只是将工作分配给一个c库,这意味着您的java项目需要一个所谓的“本机”文件(windows上是一个dll,linux上是一个.so文件,mac上是一个.jnilib文件),您想要支持的每个体系结构/os组合都需要一个这样的文件。有点痛苦,它破坏了java的“一次编写,随处运行”的承诺,但这是你必须要做的。这个网站看起来已经足够老了,可以订购啤酒了,但据我所知,它正在维护中,所以就这样。但是,说真的,不要使用zip的内置加密功能,它很糟糕。尽量避免。
注意:7zip可以做到这一点的原因是不同的观点:支持纯zip的开源社区努力保持它的简单性,以确保尽可能多的平台可以做到这一点,这可能就是为什么有各种各样的全javazip实现。7zip试图获得令人敬畏的支持,但代价是移植7zip要困难得多,这可能就是为什么没有一个全java的7zip impl,只有一个绑定。因此,7zip愿意尝试找出如何解密这个winzip的东西,而纯zip则不然。

相关问题