为什么 pkzip 接受两个密码?

Why pkzip accept two passwords?

我正在努力做这个作业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 接受两个密码?

我认为正在使用的加密是旧的、非常弱的加密,它是原始 PKZIP 格式的一部分。

该加密方法在压缩数据之前有一个 12 字节的盐 header。来自 PKWare 规范:

After the header is decrypted, the last 1 or 2 bytes in Buffer should be the high-order word/byte of the CRC for the file being decrypted, stored in Intel low-byte/high-byte order. Versions of PKZIP prior to 2.0 used a 2 byte CRC check; a 1 byte CRC check is used on versions after 2.0. This can be used to test if the password supplied is correct or not.

它最初在 1.0 规范中是两个字节,但在 2.0 规范和相关的 PKZIP 版本中,校验值被更改为一个字节,以便像您正在做的那样更难搜索密码.结果是每 256 个随机密码中大约有一个会导致通过第一次检查,然后继续尝试解压缩错误解密的压缩数据,然后才 运行 出错。

因此 "accepted" 远远不止两个密码。然而,不需要很多字节的解压缩数据就可以检测到密码仍然不正确。