Python解压AES-128加密文件
Posted
技术标签:
【中文标题】Python解压AES-128加密文件【英文标题】:Python unzip AES-128 encrypted file 【发布时间】: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
【问题讨论】:
【参考方案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】:您可以使用库 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')
【讨论】:
【参考方案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)
【讨论】:
以上是关于Python解压AES-128加密文件的主要内容,如果未能解决你的问题,请参考以下文章