Python выдает "zipfile.BadZipFile: Bad CRC-32" ТОЛЬКО когда я передаю "D" в качестве пароля - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь создать скрипт 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, что я и ожидал.

Однако, когда я запускаю EXACT тот же код, кроме как с 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'

1 Ответ

0 голосов
/ 03 марта 2019

Это ожидаемое поведение из протокола распаковки.Иногда неверный пароль пройдет проверку пароля и будет обнаружен проверкой CRC.Из man unzip (документ для Linux, но алгоритм не зависит от платформы):

Правильный пароль всегда проверяется на соответствие заголовку, но есть 1 в256 вероятность того, что неверный пароль будет также.(Это функция безопасности формата zipfile PKWARE; она помогает предотвратить атаки методом перебора, которые в противном случае могут получить большое преимущество в скорости, проверяя только заголовок.) В случае, если задан неправильный пароль, но он все равно проходит проверку заголовкалибо для извлеченных данных будет сгенерирован неправильный CRC, либо разархивирование завершится с ошибкой во время извлечения, потому что `` расшифрованные '' байты не составляют допустимый поток сжатых данных.

Существует Python сообщение об ошибке , где это обсуждается.

...