Python解压AES-128加密文件

6

有没有一种直接使用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个回答

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"])

另一个选择是使用Python模块"PyLzma",它可以处理AES加密的7zip归档文件:https://github.com/fancycode/pylzma。它不直接支持解密经典的zip文件,但你可以使用它的例程编写自己的解压函数。

你能帮忙解决如何读取subprocess.call的输出吗?@Bernhard Kausler - Jahnab Kumar Deka

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接