2016-11-12 127 views
0

我正在尝试做这个功课https://www.root-me.org/en/Challenges/Cryptanalysis/File-PKZIP当我写一个函数来破解它。为什么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的字节/高字节顺序。版本 2.0之前的PKZIP使用2字节的CRC校验;在2.0之后的版本中使用1字节的CRC校验是 。这可以用来测试密码 是否正确。

它最初是1.0规范中的两个字节,但在2.0规范和相关版本的PKZIP中,检查值已更改为一个字节,以便像进行更多操作一样进行密码搜索难。其结果是,每256个随机密码中就有一个会导致首先通过该检查,然后继续尝试解压缩未正确解密的压缩数据,然后才会发生错误。

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

+0

看起来像是在RSA的填充Oracle攻击! – Mr2uang