无法使用 python zipfile 库解压缩带有密码的 .zip 文件

Posted

技术标签:

【中文标题】无法使用 python zipfile 库解压缩带有密码的 .zip 文件【英文标题】:Unable to unzip a .zip file with a password with python zipfile library 【发布时间】:2020-05-30 18:44:05 【问题描述】:

我使用 Gnome Archive Manager (Ubuntu OS) 创建了一个 zip 文件。我使用密码创建了 zip 文件,并尝试使用 zipfile Python 库解压缩它:

import zipfile

file_name = '/home/mahmoud/Desktop/tester.zip'
pswd = 'pass'

with zipfile.ZipFile(file_name, 'r') as zf:
    zf.printdir()
    zf.extractall(path='/home/mahmoud/Desktop/testfolder', pwd = bytes(pswd, 'utf-8'))

当我运行此代码时,我收到以下错误,我很确定密码是正确的。错误是:

File "/home/mahmoud/anaconda3/lib/python3.7/zipfile.py", line 1538, in open
  raise RuntimeError("Bad password for file %r" % name)

RuntimeError: Bad password for file <ZipInfo filename='NegSkew.pdf' compress_type=99 filemode='-rw-rw-r--' external_attr=0x8020 file_size=233252 compress_size=199427>

如何解压文件?

【问题讨论】:

我试过你的代码,它对我有用,你能用另一个密码相同的程序解压吗? 为什么文件名在异常'NegSkew.pdf'中? 我尝试用 winrar 和 7z 解压缩文件,都运行良好,密码正确所有这些都是在 Windows 机器上完成的@NicoMüller 嗯。这是一个有趣的问题,我能够重现您的观察结果。我在带有 Python 3.7.5 的 Ubuntu 18.04.4 LTS 上运行。我制作了一个简单的文本文件,在 Gnome 存档管理器中对其进行压缩和加密。和你一样,当我尝试执行extractall 时,我看到的是Bad password for file &lt;ZipInfo filename='sample.txt' ...&gt;。这肯定会得到我的支持,我会稍微戳一下。我倾向于认为 Python 的内置 ZIP 库可能不支持 Gnome 的存档管理器使用的加密算法,但我还没有任何东西可以备份。 @liorr 异常显示要从 zip 中提取的文件的名称 【参考方案1】:

zipfile 库不支持 AES 加密 (compress_type=99),仅支持_ZipDecrypter 代码 (https://hg.python.org/cpython/file/a80c14ace927/Lib/zipfile.py#l508) 中提到的 CRC-32。 _ZipDecrypter 在 ZipFile.open 中引发特定 RuntimeError 之前被调用和使用,可以从 extractall 跟踪。

您可以使用pyzipper 库(https://github.com/danifus/pyzipper)代替zipfile 来解压文件:

import pyzipper

file_name = '/home/mahmoud/Desktop/tester.zip'
pswd = 'pass'

with pyzipper.AESZipFile(file_name) as zf:
    zf.extractall(path='/home/mahmoud/Desktop/testfolder', pwd = bytes(pswd, 'utf-8'))

【讨论】:

以上是关于无法使用 python zipfile 库解压缩带有密码的 .zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

python怎样压缩和解压缩ZIP文件

Python实现批量压缩文件/文件夹——zipfile

不支持 Python Zipfile 压缩方法

python zipfile解压缩

Python学习第九篇:zipfile 库操作压缩包

Python学习第九篇:zipfile 库操作压缩包