#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 / — лучший выбор.