仅当我通过“ D”作为密码时,Python才会抛出“ zipfile.BadZipFile:错误的CRC-32”

时间:2019-03-03 11:18:23

标签: python zip zipfile

我正在尝试创建一个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'

我尝试了多个字符串,例如pletmeinpassword1DDDDD,它们都可以正常工作。仅设置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'

1 个答案:

答案 0 :(得分:0)

这是解压缩协议中的预期行为。有时,无效的密码会通过密码检查并被CRC校验捕获。来自man unzip(Linux文档,但该算法与平台无关):

  

正确的密码将始终根据标题检出,但其中有一个1-in-256          密码不正确的机会也将出现。 (这是PKWARE zip文件的安全功能。          格式;它有助于防止暴力攻击,否则可能会通过这种方式获得较大的速度优势          仅测试标题。)如果输入了错误的密码,但密码通过了          无论如何进行标头测试,将为提取的数据生成错误的CRC或解压缩          在提取过程中将失败,因为``已解密''字节不构成有效的命令-          按下的数据流。

这里讨论了一个Python bug report