Python 解压 AES-128 加密文件

6 投票
3 回答
16105 浏览
提问于 2025-04-17 19:54

有没有办法直接用Python解压一个用AES-128加密的文件,因为ZipFile会报错说密码不对。如果我用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

3 个回答

1

你可以使用 stream-unzip 来解密用 AES 加密的 ZIP 文件(顺便说一下:这是我写的)

from stream_unzip import stream_unzip

def zipped_chunks(filename):
    with open(filename, 'rb') as f:
        while chunk := f.read(65536):
           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)
9

你可以使用一个叫做 pyzipper 的库:https://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')
8

Python标准库中的zipfile模块只支持CRC32加密的zip文件(你可以在这里查看:http://hg.python.org/cpython/file/71adf21421d9/Lib/zipfile.py#l420)。所以,如果你想处理其他类型的加密文件,就需要依赖一些第三方工具。

最简单的方法就是安装7zip,然后使用标准库中的subprocess模块来调用命令行工具7z

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

另外一个选择是使用名为“PyLzma”的Python模块,它也可以处理AES加密的7zip压缩文件:https://github.com/fancycode/pylzma。这个模块虽然不直接支持解密经典的zip文件,但你可以利用它的功能来编写自己的解压缩函数。

撰写回答