使用Python zipfile库解压带密码的.zip文件失败

5

我使用Gnome Archive Manager(Ubuntu操作系统)创建了一个带密码的zip文件,并尝试使用Python库zipfile解压缩它:

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>

我该如何解压缩文件?


我尝试了你的代码,它对我有效。你能用另一个程序解压它并使用相同的密码吗? - Nico Müller
为什么异常中的文件名是“NegSkew.pdf”? - liorr
@liorr你认为文件权限是问题吗?我有一些PDF文件被压缩在tester.zip中。 - Mahmoud Abdel-Rahman
2
嗯,这是一个有趣的问题,我能够重现你的观察结果。我正在运行Ubuntu 18.04.4 LTS,使用Python 3.7.5。我创建了一个简单的文本文件,在Gnome Archive Manager中进行了压缩和加密。像你一样,当我尝试执行extractall时,我看到了Bad password for file <ZipInfo filename='sample.txt' ...>。这绝对会得到我的赞同,并且我会稍微研究一下它。我倾向于认为Python内置的ZIP库可能不支持Gnome Archive Manager使用的加密算法,但我还没有任何依据来支持这一点。 - Spencer D
1
@liorr 异常显示了应从zip文件中提取的文件名称。 - Sam
显示剩余3条评论
1个回答

2

zipfile库不支持AES加密(compress_type=99),仅支持CRC-32,如在_ZipDecrypter代码中所述(https://hg.python.org/cpython/file/a80c14ace927/Lib/zipfile.py#l508)。在extractall中引发特定的RuntimeError之前,会调用并使用_ZipDecrypter,可以追踪到这个问题。

您可以使用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'))

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