Программно разархивируйте zip-файл, зашифрованный AES, в Windows

#c #c #windows #aes #unzip

#c #c #Windows #aes #разархивируйте

Вопрос:

Мне нужно иметь возможность разархивировать некоторые zip-файлы, зашифрованные AES (WinZip), из некоторого кода C / C в Windows. У кого-нибудь есть способ сделать это? Я надеюсь либо на какой-нибудь подходящий код, либо на DLL, которую я могу использовать (с примером использования). Пока что мои поиски оказались бесплодными.

Обычно предписываемые библиотеки InfoZip не поддерживают шифрование AES.

Лучшим решением, которое у меня есть на данный момент, является вызов 7z.exe программа командной строки из моей программы, но, учитывая, что я буду разархивировать около 100 файлов, это далеко не идеально.

Комментарии:

1. Я не публикую это как ответ, потому что это всего лишь предложение, но вы могли бы заглянуть в исходные тексты 7z и посмотреть, какую zip-библиотеку он использует. Поскольку все это GPLed, он должен использовать GPLed / LGPLed материал также для «обычного» декодирования zip. К сожалению, из того, что я видел, код сжатия zip отсутствует в предоставленном SDK (который предназначен только для формата 7z), поэтому вам придется копаться в коде приложения 7z.

Ответ №1:

Вот вклад minizip zlib с поддержкой AES как для шифрования, так и для дешифрования. https://github.com/nmoinvaz/minizip

Комментарии:

1. В конечном итоге я использовал этот код, поскольку я уже использовал код minizip. Однако, несколько советов: есть два места, где компилятор пытается определить порядковый номер вашей системы (aesopt.h amp; sha1.c). Это не сработало с компилятором, который я использовал, и потребовалось некоторое время, чтобы выяснить, в чем проблема. Рекомендуем написать некоторый тестовый код вокруг sha1.c, чтобы доказать, что он дает ожидаемые результаты, в качестве первого шага, если распаковка не работает «из коробки».

2. Я обновил библиотеку aes, чтобы она исправила проблемы с порядковым номером.

3. Возможно, вам придется указать сжатие (степень) -9, чтобы получить отчет в 7-zip с указанием AES-256 Deflate как свойства сжатого файла (записей). Дерево каталогов zip не зашифровано, то есть имена файлов видны. НАМНОГО проще, чем использовать библиотеки 7-zip IMO.

Ответ №2:

DotNetZip может это сделать. Если вы не прочь использовать управляемый C .

Из документации DotNetZip следует, что это код для создания zip-файла, зашифрованного AES. (Код для извлечения аналогичен).

 #include "stdafx.h"

using namespace System;
using namespace Ionic::Zip;

int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Hello World");

    ZipFile ^ zip;
    try
    {
        zip = gcnew ZipFile();
        zip->Password = "Harbinger";
        zip->Encryption = EncryptionAlgorithm::WinZipAes128;
        zip->AddEntry("Readme.txt", "This is the content for the Readme.txt entry.");
        zip->Save("test.zip");
    }
    finally
    {
        zip->~ZipFile();
    }

    Console::WriteLine(L"Press <ENTER> to quit.");
    Console::ReadLine();
    return 0;
}
  

Кроме того, я написал DotNetZip, поэтому у меня к нему определенный интерес! Но я не вижу, что не так с выполнением 7z.exe 100 раз? Вас беспокоит производительность?

Ответ №3:

http://www.artpol-software.com/ZipArchive / — лучший выбор.