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

Java 如何解压缩pkAES-256解压加密的zip文件?,java,encryption,zip,aes,Java,Encryption,Zip,Aes,我需要用Java解压文件,这些文件经过压缩,并使用以下信息进行密码保护: 方法:pkAES-256放气 特征:0xD StrongCrypto:Encrypt StrongCrypto 我试着使用zip4j,但它总是给我这个stacktrace: net.lingala.zip4j.exception.ZipException: java.io.IOException: java.util.zip.DataFormatException: invalid code lengths set

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

方法:pkAES-256放气

特征:0xD StrongCrypto:Encrypt StrongCrypto

我试着使用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


感谢您的帮助。

ZIP文件格式,至少是被众多库普遍理解和支持的,只支持一种加密;它被称为“ZipCrypto”,其质量令人怀疑(它并没有完全损坏,但很容易出现这样的情况,即不应该能够读取该zip文件的人会发现它。例如,尝试大量密码非常容易,因此,如果密码是一个简单的字典单词,则基本上是无用的)。这是当您在命令行上为“zip”可执行文件的几乎每个发行版运行
zip-c
时得到的加密

WinZip单独添加了一个名为StrongCrypto的ZIP格式扩展,该扩展基于AES-256。听起来你有这个

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

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

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

如果您对此束手无策,并且无法更改所发送文件的格式,则需要7zip。7zip是开源的,可能可以解密此文件,而大多数开源“zip”库则不能。一个大问题是我所知的java 7zip impl并不全是这样的。有的,它只是将使用C库,这意味着您的java项目需要一个所谓的“本机”文件(windows上需要一个DLL,linux上需要一个.so文件,mac上需要一个.JNILIB文件),你需要为你想要支持的每一个架构/操作系统组合提供一个这样的文件。有点痛苦,它破坏了java的“一次编写,随时随地运行”承诺,但这是你必须做的。这个网站看起来已经足够老了,可以点啤酒了,但据我所知,它正在维护中,所以就这样。但是,说真的,不要使用zip内置的加密技术太糟糕了,尽量避免


注:7zip之所以能够做到这一点,是因为观点不同:支持纯zip的开源社区努力保持它的简单性,以确保尽可能多的平台能够做到这一点,这可能就是为什么有各种各样的全java zip impl的原因。7zip试图获得令人敬畏的支持,但代价是使7zip的移植变得更加困难,这是p很可能,为什么没有一个全java的7zip impl,只有一个绑定。因此,7zip愿意尝试解决如何解密这个winzip的东西,而纯zip不是。

zip文件格式,至少是一种被大量库普遍理解和支持的文件格式,只支持一种加密;它被称为“ZipCrypto”,我认为它的质量令人怀疑(它并没有完全损坏,但很容易出现这样的情况,即不应该能够读取该zip文件的人会发现它。例如,尝试大量密码非常容易,因此如果密码是一个简单的字典单词,则它基本上是无用的)。这是您在命令行上为“zip”可执行文件的几乎每个发行版运行
zip-c
时得到的加密

WinZip单独添加了一个名为StrongCrypto的ZIP格式扩展,该扩展基于AES-256。听起来你已经有了

zip或多或少是公共领域(这很棘手;PKWare作为一家公司或多或少拥有它的各个部分,但是,例如,linux发行版中的/bin/unzip命令是完全开源的,从法律上讲,zip的命运有点难以解释)…因此,当winzip本身只是在zip概念中添加功能时,这是相当愚蠢的:无论是整个开源社区还是PKWare,都不会同意这种随机的Flybby升级,因此在很长一段时间内,这些以.zip结尾的“基于winzip的强加密zip文件”都不是zip文件,如果这让人困惑的话,责任完全在于此在WinZip,Inc.的肩膀上。您刚才拥有的不是zip文件,即使它看起来像一个

然而,从那时起,至少WiZip和PKVice现在达成了协议,他们可以解密对方更强的加密产品。然而,开源社区大多洗手了,并没有将这些强加密选项视为“ZI”。