Почему pkzip принимает два пароля?
Я пытаюсь сделать это домашнее задание https://www.root-me.org/en/Challenges/Cryptanalysis/File-PKZIP Когда я пишу функцию, чтобы взломать ее.
import subprocess from time import sleep
file = open('/home/begood/Downloads/SecLists-master/Passwords/'
'rockyou-75.txt', 'r') lines = file.readlines() file.close() for line in lines:
command = 'unzip -P ' + line.strip() + ' /home/begood/Downloads/ch5.zip'
print command
p = subprocess.Popen(
command,
stdout=subprocess.PIPE, shell=True).communicate()[0]
if 'replace' in p:
print 'y\n'
sleep(1)
Остановитесь в пароле = scooter
:
unzip -P scooter /home/begood/Downloads/ch5.zip replace readme.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename:
но когда я использую это, чтобы распаковать это сказал:
inflating: /home/begood/readme.txt
error: invalid compressed data to inflate
И это настоящий пароль: 14535
, Почему pkzip принимает два пароля?
1 ответ
Я предполагаю, что используемое шифрование - это старое, очень слабое шифрование, которое было частью оригинального формата PKZIP.
Этот метод шифрования имеет 12-байтовый солевой заголовок перед сжатыми данными. Из спецификации PKWare:
После дешифрования заголовка последние 1 или 2 байта в буфере должны быть старшим словом / байтом CRC для дешифруемого файла, хранящегося в младшем / старшем байтовом порядке Intel. Версии PKZIP до 2.0 использовали 2-байтовую проверку CRC; 1-байтовая проверка CRC используется в версиях после 2.0. Это можно использовать для проверки правильности введенного пароля.
Первоначально это было два байта в спецификации 1.0, но в спецификации 2.0 и в связанной версии PKZIP значение проверки было изменено на один байт, чтобы сделать поиск паролей более сложным. В результате примерно один из каждых 256 случайных паролей будет проходить эту первую проверку, а затем продолжать пытаться распаковывать неправильно дешифрованные сжатые данные, только после этого возникнет ошибка.
Так что это гораздо больше, чем два пароля, которые будут "приняты". Однако не требуется очень много байтов распакованных данных, чтобы обнаружить, что пароль, тем не менее, неверен.