Как распаковать zip-файлы, зашифрованные AES-256?

Я разрабатываю приложение для Android, которое требует распаковки зашифрованных zip-файлов AES-256. Существуют ли какие-либо библиотеки, которые я могу использовать для этого?

Я очень признателен за любое руководство или помощь.


person Ahmad Kayyali    schedule 03.01.2011    source источник


Ответы (7)


zip4j, библиотека Java для обработки Zip-файлов (с открытым исходным кодом, лицензия Apache v2.0).

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

  • Создание, добавление, извлечение, обновление, удаление файлов из Zip-файла
  • Чтение/запись Zip-файлов, защищенных паролем
  • Поддерживает шифрование AES 128/256
  • Поддерживает стандартное шифрование Zip

Вы можете скачать бинарники, исходники и примеры.

person ggrandes    schedule 21.01.2013
comment
это потрясающе, я бы хотел, чтобы я основал, прежде чем я уже портировал artpol-software.com/ZipArchive в Android с помощью ndk Большое спасибо за акцию - person Ahmad Kayyali; 21.01.2013


Это зависит от вашей кодировки зашифрованных zip-файлов. Будьте более конкретными, пожалуйста. Если он сжимается, а затем шифруется, вы распаковываете, а затем расшифровываете файл, используя java.util.zip.GZIPInputStream

person langerra.com    schedule 03.01.2011
comment
спасибо за ответ, но в моем вопросе ясно, что мне нужно распаковать зашифрованные zip-файлы, я обновлю свой вопрос, большое спасибо. - person Ahmad Kayyali; 03.01.2011
comment
Я полностью понимаю, однако этот «зашифрованный zip-файл» с использованием определенного формата, как он зашифрован? ЕЦБ, ЦБК, CTR или ...? Является ли zip-файл архивом? Кто генерирует файл? Как он генерируется? и т.д... Тогда я мог бы отправить вам код для использования. - person langerra.com; 03.01.2011
comment
спасибо за ответ, зашифрованный zip-файл, который я пытаюсь распаковать, представляет собой архив и зашифрован с использованием AES-256, созданного через другое приложение Windows, которое я загружу на устройство Android и выполню распаковку, чтобы прочитать его содержимое. - person Ahmad Kayyali; 04.01.2011
comment
Тогда найдите библиотеку, иначе это огромная задача, поскольку эти архивы допускают разные режимы работы и разные алгоритмы AES-256 для объединения и заполнения!!!! - person langerra.com; 04.01.2011

Насколько я помню, ZIP-файлы, зашифрованные AES, впервые были представлены WinZip несколько лет назад. На домашней странице WinZip есть подробное объяснение того, чем ZIP-файлы, зашифрованные AES, отличаются от стандартных ZIP-файлов:

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

person Robert    schedule 03.01.2011
comment
Спасибо за ссылку, я реализовал декомпрессию в Zip-файле, зашифрованном с помощью AES-256, на iPhone, и я точно знаю, как это работает, но пока я застрял в реализации Android. - person Ahmad Kayyali; 03.01.2011

Я работаю над обычной JRE. Используя http://www.lingala.net/zip4j/, следующий код работает для расшифровки почтового индекса. файл:

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
}
person ruediste    schedule 21.03.2019

У меня похожая проблема, я много искал и тестировал все эти решения, но они мне не помогли. Наконец, я нашел решение и хочу поделиться им здесь, возможно, оно поможет другим.

В моем случае у меня есть зашифрованный zip-файл AES-256.

Когда я использовал последнюю версию zip4j, я столкнулся с этим исключением:

Zip4j не поддерживает сильное шифрование

zip4j код:

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

После этого я протестировал winzipaes и столкнулся с этой ошибкой:

дополнительное поле имеет длину 0 - это, вероятно, не зашифрованная запись WinZip AES

код винзипа:

    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);
            }
        }
    }
person JNDanial    schedule 07.10.2020

Я еще не тестировал его, но некоторое время назад нашел это.

Я надеюсь, что это может помочь вам

person maid450    schedule 03.01.2011
comment
Спасибо, maid450, но это не то, что я ищу, это шифрование/дешифрование строк, мне нужно шифровать/дешифровать Zip-файлы, спасибо за усилия. - person Ahmad Kayyali; 03.01.2011