2010-09-17 17 views
2

Je dois être capable de décompresser certains fichiers zip chiffrés AES (WinZip) à partir d'un code C/C++ sous Windows. Est-ce que quelqu'un a un moyen de le faire? J'espère un code approprié ou une DLL que je peux utiliser (avec un exemple d'utilisation). Jusqu'à présent, mes recherches se sont révélées infructueuses.Décompressez par programme un fichier zip chiffré AES sous Windows

Les bibliothèques InfoZip fréquemment prescrites ne prennent pas en charge le cryptage AES.

La meilleure solution que j'ai actuellement est d'appeler le programme de ligne de commande 7z.exe de mon programme, mais étant donné que je vais décompresser 100 fichiers, c'est loin d'être idéal.

+0

Je ne le publie pas en réponse parce que c'est juste une suggestion, mais vous pouvez jeter un oeil dans les sources 7z et voir quelle bibliothèque zip il utilise. Puisque le tout est GPL, il devrait utiliser des trucs GPLed/LGPLed aussi pour le décodage zip "normal". Malheureusement, d'après ce que j'ai vu, le code de compression zip n'est pas dans le SDK fourni (qui est juste pour le format 7z), donc vous devez creuser dans le code 7z * application *. –

Répondre

5

Voici la contribution minizip zlib avec le support AES pour le chiffrement et le décryptage. https://github.com/nmoinvaz/minizip

+0

C'est le code que j'ai fini par utiliser, car j'utilisais déjà le code minizip. Quelques conseils cependant: Il y a deux endroits où le compilateur essaie de comprendre l'endian de votre système (aesopt.h & sha1.c). Cela n'a pas fonctionné avec le compilateur que j'utilisais et j'ai mis du temps à comprendre que c'était le problème. Recommande d'écrire un code de test autour de sha1.c pour prouver qu'il produit les résultats attendus dans un premier temps si le décompresseur ne fonctionne pas correctement. – Evan

+1

Le lien est mort maintenant. – Crashworks

+0

J'ai mis à jour la bibliothèque aes afin qu'elle corrige les problèmes d'endian. –

0

DotNetZip peut le faire. Si vous n'êtes pas opposé à l'utilisation de Managed C++.

Depuis le DotNetZip documentation, il s'agit du code créer un fichier zip AES Encrypted. (Le code à extraire est similaire).

#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; 
} 

Aussi - j'ai écrit DotNetZip donc j'ai un certain degré de favoritisme à son égard! Mais je ne vois pas ce qui ne va pas avec l'exécution de 7z.exe 100 fois? Êtes-vous préoccupé par la performance?