我想用Python 3解压缩受密码保护的档案。我知道密码,但似乎zip标准中有几种加密算法。
首先,我使用标准的Ubuntu Archive Manager 3.16.5创建一个zip存档,使用密码“1”。然后我运行以下代码:
import zipfile
zip_file = zipfile.ZipFile('archive.zip')
zip_file.extractall(pwd=b'1')
结果,我得到RuntimeError: ('Bad password for file', <ZipInfo filename='contents.txt' compress_type=99 filemode='-rw-rw-r--' external_attr=0x8020 file_size=40 compress_size=60>)
。
当我运行Archive Manager进行解压缩时,它运行正常。但是,一旦我尝试unzip
,它就无法胜任:
$ unzip -P 1 archive.zip
Archive: archive.zip
skipping: contents.txt need PK compat. v5.1 (can do v4.6)
据我了解,问题是unzip
使用PKZIP算法,而libarchive
广泛使用7zip
而档案管理员通常更喜欢AES加密(并且有一个很好的安全理由)。
那么,如何在Python中选择解压缩算法?或者我应该不关心zip格式本身并找到任何AES解密器并以某种方式将其连接到unzip
以后?
我考虑在bash调用中使用7zip
,但它会带来与操作系统交互的进一步问题(如果执行机器没有那么?)。我还查找了libarchive
端口到Python 3(即python3-libarchive-c
包) - 它是与C实现分开开发的,并不像今天那样支持加密/解密。