【问题标题】:Programatically unzip an AES encrypted zip file on Windows在 Windows 上以编程方式解压缩 AES 加密的 zip 文件
【发布时间】:2010-09-17 06:40:28
【问题描述】:

我需要能够从 Windows 上的一些 C/C++ 代码中解压缩一些 AES (WinZip) 加密的 zip 文件。有没有人有办法做到这一点?我希望有一些合适的代码或我可以使用的 DLL(带有示例用法)。到目前为止,我的搜索都没有结果。

常用的 InfoZip 库不支持 AES 加密。

目前最好的解决方案是从我的程序中调用 7z.exe 命令行程序,但考虑到我将解压缩 100 个左右的文件,这不太理想。

【问题讨论】:

  • 我不会将其作为答案发布,因为这只是一个建议,但您可以查看 7z 源代码并查看它使用的 zip 库。由于整个事情是 GPLed,它也应该使用 GPLed/LGPLed 的东西来进行“正常”的 zip 解码。不幸的是,据我所见,提供的 SDK 中没有 zip 压缩代码(仅适用于 7z 格式),因此您必须在 7z 应用程序代码中进行挖掘。

标签: c++ c windows aes unzip


【解决方案1】:

这里是 minizip zlib 的贡献,它支持 AES 加密和解密。 https://github.com/nmoinvaz/minizip

【讨论】:

  • 这是我最终使用的代码,因为我已经在使用 minizip 代码。不过有一些建议:编译器会尝试在两个地方找出系统的字节序(aesopt.h 和 sha1.c)。它不适用于我正在使用的编译器,并且需要一段时间才能找出问题所在。建议在 sha1.c 周围编写一些测试代码,以证明如果解压缩无法开箱即用,作为第一步它会产生预期的结果。
  • 我已经更新了 aes 库,所以它应该可以解决字节序问题。
  • U 可能必须指定压缩(度)-9 以获取 7-zip 格式的报告,将 AES-256 Deflate 作为压缩文件(条目)的属性。 zip 目录树未加密,即文件名可见。比使用 7-zip 库 IMO 更简单。
【解决方案2】:

DotNetZip 可以做到。如果您不反对使用托管 C++。

来自DotNetZip documentation,这是创建 AES 加密 zip 文件的代码。 (提取的代码类似)。

#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】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      相关资源
      最近更新 更多