我正在尝试创建一个Python脚本来测试受密码保护的zip文件上的密码。唯一的问题是,每当我尝试专门传递“ D”作为密码时,我都会得到zipfile.BadZipFile: Bad CRC-32'
要进行测试,我创建了p.zip
,密码为p
,只有一个名为p.txt
的文件并运行了以下代码:
from zipfile import ZipFile
with ZipFile("p.zip") as zf:
password = "E"
try:
zf.extractall(pwd=bytes(password, "utf-8"))
except RuntimeError:
print("wrong password: " + password)
我刚得到wrong password: E
,这正是我的期望。
但是,当我运行完全相同的代码时,除了使用password = "D"
之外,我得到zipfile.BadZipFile: Bad CRC-32 for file 'p.txt'
我尝试了多个字符串,例如p
,letmein
,password1
,DD
,DDD
,它们都可以正常工作。仅设置password = "D"
会得到zipfile.BadZipFile: Bad CRC-32 for file 'p.txt'
。
有人知道这个原因或可能的解决方法吗?
这是控制台上的完整错误:
Traceback (most recent call last):
File "C:/Users/argolis/workspace/zip-breaker/zip-breaker/script2.py", line 6, in <module>
zf.extractall(pwd=bytes(password, "utf-8"))
File "C:\Users\argolis\AppData\Local\Programs\Python\Python37\lib\zipfile.py", line 1594, in extractall
self._extract_member(zipinfo, path, pwd)
File "C:\Users\argolis\AppData\Local\Programs\Python\Python37\lib\zipfile.py", line 1649, in _extract_member
shutil.copyfileobj(source, target)
File "C:\Users\argolis\AppData\Local\Programs\Python\Python37\lib\shutil.py", line 79, in copyfileobj
buf = fsrc.read(length)
File "C:\Users\argolis\AppData\Local\Programs\Python\Python37\lib\zipfile.py", line 876, in read
data = self._read1(n)
File "C:\Users\argolis\AppData\Local\Programs\Python\Python37\lib\zipfile.py", line 966, in _read1
self._update_crc(data)
File "C:\Users\argolis\AppData\Local\Programs\Python\Python37\lib\zipfile.py", line 894, in _update_crc
raise BadZipFile("Bad CRC-32 for file %r" % self.name)
zipfile.BadZipFile: Bad CRC-32 for file 'p.txt'
答案 0 :(得分:0)
这是解压缩协议中的预期行为。有时,无效的密码会通过密码检查并被CRC校验捕获。来自man unzip(Linux文档,但该算法与平台无关):
正确的密码将始终根据标题检出,但其中有一个1-in-256 密码不正确的机会也将出现。 (这是PKWARE zip文件的安全功能。 格式;它有助于防止暴力攻击,否则可能会通过这种方式获得较大的速度优势 仅测试标题。)如果输入了错误的密码,但密码通过了 无论如何进行标头测试,将为提取的数据生成错误的CRC或解压缩 在提取过程中将失败,因为``已解密''字节不构成有效的命令- 按下的数据流。
这里讨论了一个Python bug report。