【问题标题】:Python unzip AES-128 encrypted filePython解压AES-128加密文件
【发布时间】:2013-03-21 16:36:34
【问题描述】:

有没有办法直接用 python 解压缩 AES-128 加密文件,因为 ZipFile 会引发 Bad Password 错误。如果我使用 7zip 它可以工作,所以密码是正确的,但是需要再次安装 7zip 作为依赖项。

我尝试了什么:

from ZipFile import ZipFile
zip = ZipFile('test.zip')
zip.extractall(pwd='password')

这会引发错误密码异常。

使用 7zip 检查文件

7z l -slt test.zip

这会返回:

Encrypted = +
Method = pkAES-128 Deflate

【问题讨论】:

    标签: python zip aes zipfile


    【解决方案1】:

    Python 标准库中的 zipfile 模块仅支持 CRC32 加密的 zip 文件(参见此处:http://hg.python.org/cpython/file/71adf21421d9/Lib/zipfile.py#l420)。所以,没有办法绕过一些第 3 方依赖。

    最简单的方法是安装 7zip 并使用标准库中的 subprocess 模块调用命令行实用程序 7z

    import subprocess
    subprocess.call(["7z", "x", "-ppassword", "test.zip"])
    

    另一个选项是 python 模块“PyLzma”,它也可以处理 AES 加密的 7zip 档案:https://github.com/fancycode/pylzma。它不直接支持解密经典 zip 文件,但您可以使用它的例程编写自己的解压缩器函数。

    【讨论】:

    • 你能帮忙看看如何读取这个 subprocess.call 的输出吗? @伯恩哈德考斯勒
    【解决方案2】:

    您可以使用库 pyzipperhttps://github.com/danifus/pyzipper。它的工作原理与 Python 的 zipfile 几乎相同:

    import pyzipper
    
    with pyzipper.AESZipFile('my_archive.zip') as f:
        f.pwd = b'myPassword'
        print(f.infolist())
        file_content = f.read('testfile.txt')
    

    【讨论】:

      【解决方案3】:

      您可以使用stream-unzip 来解密 AES 加密的 ZIP 文件(完全披露:由我编写)

      from stream_unzip import stream_unzip
      
      def zipped_chunks(filename):
          with open(filename, 'rb') as f:
              while True:
                 chunk = f.read(65536)
                 if not chunk:
                     break
                 yield chunk
      
      for file_name, file_size, unzipped_chunks in stream_unzip(zipped_chunks('test.zip'), password=b'password'):
          for chunk in unzipped_chunks:
              print(chunk)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        • 2018-04-04
        • 2021-06-25
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多