如何打开 WinZip 密码保护的存档?

How to open WinZip password protected archive?

我知道解密是一个广阔的世界,我是一个新手,但我有一个 WinZip 文件,我可以通过 WinZip 使用已知密码轻松地在 WinZip 中打开 UI。

但是,提供相同的密码,我无法在 Python 中打开它。我怀疑编码可能在 AES 中,但我不想涉及非本地库来打开文件。在 Python 中是否有任何标准可以打开受密码保护的 WinZip 文件?我在 ZipFile 中尝试了不同的编码解码器。

from zipfile import ZipFile

with ZipFile(r'C:\Users\user\Desktop\Data.zip') as zf:
    pas = 'myPass'
    res = pas.encode('utf-32-le')
    zf.extractall(pwd=res)
zf
RuntimeError: Bad password for file ...

正常传递密码,不编码可能有效。

您首先需要确定 zip 文件使用的加密类型。 WinZip 本身可能有一个报告工具会告诉您。我没有,所以不知道。

如果您可以访问任何命令行 zip 实用程序,您可以很容易地找到。

首先,如果您有可用的 unzip 的 Infozip 实现,运行 它带有 -lv 选项。如果您有可用的 unzip 的非常新版本并且它在“方法”列中显示 AES_WG,则您的文件已通过 AES 加密。

$ unzip -lv my.zip
Archive:  /home/paul/perl/ext/Gzip/IO-Zippo/scratch/sample-zip/7z/7z-win32-aes128.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
    1933  AES_WG      884  54% 04-15-2010 22:26 00000000  0001-perl-74088.patch
--------          -------  ---                            -------
    1933              884  54%                            1 file

如果您 unzip 年龄较大,则方法列中字符串 Unk:099 的存在表示您的文件已通过 AES 加密。

$ unzip -lv my.zip
Archive:  IO-Zippo/scratch/sample-zip/7z/7z-win32-aes128.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
    1933  Unk:099     884  54% 2010-04-15 22:26 00000000  0001-perl-74088.patch
--------          -------  ---                            -------
    1933              884  54%                            1 file

另一种选择是使用 zipdetails(完全公开,我是 zipdetails 的作者)。要查找的关键是行 Compression Method 0063 'AES Encryption'

$ zipdetails my.zip

0000 LOCAL HEADER #1       04034B50
0004 Extract Zip Spec      33 '5.1'
0005 Extract OS            00 'MS-DOS'
0006 General Purpose Flag  0001
     [Bit  0]              1 'Encryption'
0008 Compression Method    0063 'AES Encryption'
...

如果事实证明您确实有 AES 加密并且您需要 python 方式来读取文件,标准的 zipfile 方式将不起作用。目前zipfile只支持弱加密。

有关读取 AES 加密 Zip 文件的其他 python 方法,请参阅 Python unzip AES-128 encrypted file