0

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

4

1 回答 1

1

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

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

标头解密后,Buffer 中的最后 1 或 2 个字节应该是被解密文件的 CRC 的高位字/字节,以 Intel 低字节/高字节顺序存储。2.0 之前的 PKZIP 版本使用 2 字节 CRC 校验;2.0 之后的版本使用 1 字节 CRC 校验。这可以用来测试提供的密码是否正确。

它最初在 1.0 规范中是两个字节,但在 2.0 规范中,以及在 PKZIP 的相关版本中,检查值被更改为一个字节,以使密码搜索变得更加困难,就像你正在做的那样。结果是大约每 256 个随机密码中的一个将导致通过第一次检查,然后继续尝试解压缩错误解密的压缩数据,然后才遇到错误。

因此,要“接受”的密码远不止两个。然而,它不需要很多字节的解压缩数据来检测密码仍然不正确。

于 2016-11-13T14:12:28.973 回答