Zip密码功能有误

时间:2018-04-20 10:20:32

标签: python python-3.x zip brute-force

我有一个矛盾,我无法解释。 简而言之:我构建了一个python脚本,它应该破解一个受密码保护的压缩文件。

这就是我所做的:

(1)压缩文本文件: zip --password bla zip3.zip myZip所以密码短语是" bla"。

(2)然后我使用以下Python脚本:

import zipfile
import itertools
from itertools import *
import string
import time

这是基本功能,如果给定的密码有效,应该检查:

def crack(File, pwd):
    try:
        File.extractall(pwd=str.encode(pwd))
        print("\n---- SUCCESS! {0} ----".format(pwd))
    except:
        print("{0} did not work.".format(pwd))
        pass

这里我指定了我想用来尝试的字符: myLetters = string.ascii_letters

这里我指定哪个zip文件要破解: File = zipfile.ZipFile("PATH/TO/MY/zip3.zip", 'r')

这里我指定密码短语的时长: pwd_len = 3

这里我指出,存在多少种可能的特征组合: all_poss = (len(myLetters)**pwd_len)

以下是具体密码破解的过程:

 count = 0
 start_time = time.time()
 for i in range(0,pwd_len+1):   
     for j in map(''.join, itertools.product(myLetters, repeat=i)):
         crack(File, j)  
         count += 1
 print(round((count/all_poss)*100, 1), end='\r')
 res_time = time.time() - start_time
 print("\n--- {} ---".format(round(res_time,2)))

我使用嵌套循环来尝试每个密码。如果它有效,我应该得到成功消息。否则,我应该只看到"没有工作的消息"。

...然而

如果我输入我的终端:python3 pwdCracker.py >> out我得到一个很长的文本文件,其中包含许多"不起作用的消息"但是我也得到了一大堆"成功消息",虽然只有一个(" bla")应该是正确的。

这是一个小提取物:

wN did not work.
---- SUCCESS! wO ----
wO did not work.
wP did not work.`

显然" wO"工作..但为什么??我将密码设置为" bla"!我真的可以打开文件" wO" ...为什么会发生这种情况?

希望你能帮忙!

2 个答案:

答案 0 :(得分:1)

众所周知,默认的zip加密很弱,我认为您正在看到哈希冲突12

大多数加密方法(包括zip文件中使用的加密方法)都需要一个固定长度的密钥,因此密码经过哈希处理以提供该密钥。 zip中使用的哈希函数是crc32(指定here,虽然它详细说明了一种不同的攻击),它是为错误检查而不是加密哈希而设计的。因此,它很容易受到这种攻击。

答案 1 :(得分:0)

旧的zip格式包含一个检查字节,可以快速验证您的密码是对还是错。对照已解密的“解密标头”的最后一个字节验证此校验字节。

因为校验字节只有一个字节,所以误报率很高(1/256)。在这些情况下,暴力破解者通常要做的是检查来自同一存档的多个文件(因此使用多个校验字节)。

来自PkWare的APPNOTE.TXT:

  

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

所以您看到的只是误报。