我有一个矛盾,我无法解释。 简而言之:我构建了一个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" ...为什么会发生这种情况?
希望你能帮忙!
答案 0 :(得分:1)
众所周知,默认的zip加密很弱,我认为您正在看到哈希冲突1,2。
大多数加密方法(包括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校验。 可以用来测试提供的密码是否正确。
所以您看到的只是误报。