python - 如何打开 WinZip 密码保护的存档?
问题描述
我知道解密是一个广阔的世界,我是新手,但我有一个 WinZip 文件,我可以通过 WinZip UI 使用已知密码在 WinZip 中轻松打开。
但是,提供相同的密码,我无法在 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 实用程序,您可以很容易地找到它。
首先,如果您有可用的 Infozip 实现,请使用该选项unzip
运行它。-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
推荐阅读
- regex - 如果全部为真,如何组合两个或多个正则表达式并匹配
- java - 来自 Hibernate 的多级对象的延迟加载
- vue.js - Vue:我可以在计算属性中使用组件过滤器吗?
- javascript - 在概念化如何将 if else 语句更改为 switch 语句时遇到问题
- microsoft-cognitive - 无法获取 Microsoft Academic 的认知服务实验室 API 密钥
- php - 可以在浏览器上使用 URL 发送电子邮件,但在 Angular 上它不起作用
- python - 需要一点帮助来理解 range() 和 len()
- reactjs - 将点击事件传递给子级
- python - GPU Mac Pro AMD OpenCL 上的矩阵乘法错误结果
- python - Python:全局使用局部变量不起作用