4

有没有办法直接用 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
4

3 回答 3

7

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

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

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

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

于 2013-03-21T17:37:49.027 回答
7

您可以使用库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')
于 2019-03-22T10:02:44.743 回答
0

您可以使用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)
于 2021-09-19T10:31:35.260 回答