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

时间:2011-01-03 13:20:23

标签: java android zip compression aes

我正在开发一个Android应用程序,需要解压缩 AES-256 加密的zip文件,有没有我可以用来完成它的库?

我非常感谢任何指导或帮助。

7 个答案:

答案 0 :(得分:6)

zip4j ,用于处理Zip文件的java库(开源,Apache License v2.0)。

http://www.lingala.net/zip4j/

  • 创建,添加,提取,更新,从Zip文件中删除文件
  • 读取/写入受密码保护的Zip文件
  • 支持AES 128/256加密
  • 支持标准邮​​编加密

您可以下载二进制文件,来源和示例。

答案 1 :(得分:5)

我最终在http://code.google.com/p/winzipaes/

使用外部库

仅限于压缩/解压缩使用AES-256加密的Zip文件

但至少它符合我的需要。

答案 2 :(得分:1)

这取决于您对加密zip文件的编码。请更具体一点。 如果其压缩然后加密,则解压缩然后使用java.util.zip.GZIPInputStream

解密文件

答案 3 :(得分:0)

据我所知,AES加密的ZIP文件是WinZip第一次推出的。 在WinZip主页上,详细说明了AES加密的ZIP文件与标准ZI​​P文件的不同之处:

http://www.winzip.com/aes_info.htm

答案 4 :(得分:0)

我正在使用普通的JRE。使用http://www.lingala.net/zip4j/,以下代码可解密zip文件:

ZipFile zipFile = new ZipFile(zipFile);
zipFile.setPassword(password);
for (Object fileHeaderObj : zipFile.getFileHeaders()) {
  FileHeader fileHeader = (FileHeader) fileHeaderObj;
  String fileName = fileHeader.getFileName();
  ZipInputStream zipIn = zipFile.getInputStream(fileHeader);
  // do whatever with the input stream
}

答案 5 :(得分:0)

我遇到了类似的问题,进行了很多搜索并测试了所有这些解决方案,但它们并没有帮助我。 最后,我找到了一个解决方案,我想在这里分享它,也许可以帮助其他人。

就我而言,我有一个AES-256加密的zip文件。

当我使用最新版本的zip4j时,我遇到了以下异常:

Zip4j不支持强加密

zip4j代码:

    net.lingala.zip4j.ZipFile zipFile = new ZipFile("sourceAddress", "password".toCharArray());
    zipFile.extractAll("destinationAddress");

此后,我测试了winzipaes,然后遇到此错误:

额外字段的长度为0-这可能不是WinZip AES加密条目

winzipaes代码:

    final File dbFile = new File("destinationFile");
    AesZipFileDecrypter ze = null;
    try {
        ze = new AesZipFileDecrypter(new File("sourceAddress"), new AESDecrypterBC());
        ExtZipEntry entry = ze.getEntry(dbFile.getName());
        ze.extractEntry(entry, dbFile, "password");
    } catch (DataFormatException | IOException e) {
        e.printStackTrace();
    } finally {
        if (ze != null) {
            try {
                ze.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

最后,我找到了sevenzipjbind,它对我有用。

最终代码:

    RandomAccessFile randomAccessFile = null;
    IInArchive inArchive = null;
    try {
        randomAccessFile = new RandomAccessFile(fileAddress, "r");
        inArchive = SevenZip.openInArchive(null, // autodetect archive type
                new RandomAccessFileInStream(randomAccessFile));

        // Getting simple interface of the archive inArchive
        ISimpleInArchive simpleInArchive = inArchive.getSimpleInterface();

        System.out.println("   Hash   |    Size    | Filename");
        System.out.println("----------+------------+---------");

        for (ISimpleInArchiveItem item : simpleInArchive.getArchiveItems()) {
            final int[] hash = new int[] { 0 };
            if (!item.isFolder()) {
                ExtractOperationResult result;

                result = item.extractSlow(new ISequentialOutStream() {
                    public int write(byte[] data) throws SevenZipException {
                        InputStream myInputStream = new ByteArrayInputStream(data);

                        try {
                            byte[] buffer = new byte[myInputStream.available()];
                            myInputStream.read(buffer);
                            File targetFile = new File(destinationAddress + item.getPath());
                            OutputStream outStream = new FileOutputStream(targetFile);
                            outStream.write(buffer);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        return data.length; // Return amount of consumed data
                    }
                },password);

                if (result == ExtractOperationResult.OK) {
                    System.out.printf("%9X | %s%n",
                            hash[0], item.getPath());
                } else {
                    System.err.println("Error extracting item: " + result);
                }
            }
        }
    } catch (Exception e) {
        System.err.println("Error occurs: " + e);
    } finally {
        if (inArchive != null) {
            try {
                inArchive.close();
            } catch (SevenZipException e) {
                System.err.println("Error closing archive: " + e);
            }
        }
        if (randomAccessFile != null) {
            try {
                randomAccessFile.close();
            } catch (IOException e) {
                System.err.println("Error closing file: " + e);
            }
        }
    }

答案 6 :(得分:-2)

我还没有测试过,但前段时间我找到了this

我希望它可以帮到你