zipfile模块返回不可靠结果
我对加密的zip文件进行了字典攻击,使用的是zipfile
库。当我开始使用很大的字典时,有时候会出现错误的结果,比如密码可能是“wool”,但“12630”也被认为是正确的。在这种情况下,解密后的文件明显是乱码。
这不是我代码的问题,而是zipfile
库检查提供的密码是否正确的方式出了问题。我通过检查解密后文件的大小来减少错误结果,如果文件大小等于0,就认为是错误的,然后继续搜索。但我的问题依然存在,因为即使文件是乱码,它的大小也大于0。所以我想知道,有没有办法在Python中判断一个文件是否正确解密,或者它是否包含乱码?
顺便说一下,我知道用zipfile
解密zip文件很慢,但正如我之前所说,我这样做是为了更好地掌握Python。
这是我的代码:
import zipfile
import os
zfile=raw_input("Please input zip's file name\n")
diction=raw_input("Please input dictionary\n")
found = False
zipf = zipfile.ZipFile( zfile, 'r' )
f = open(diction, 'r')
for line in f:
pswd = line
pswd = pswd[:-1]
zipf.setpassword(pswd)
try:
zipf.extractall()
if (os.path.getsize(zfile[:-4]) != 0):
found = True
break
except RuntimeError:
continue
except Exception:
continue
zipf.close()
这是我在Python的bug追踪器上提交的一个bug报告。正如你所看到的,他们并不认为这是库的“bug”,所以我在寻求其他检查文件是否正确解密的方法。
顺便提一下,对于在乎这个问题的人,在上面提供的链接中,他们告诉我这是zip文件格式的问题,没办法解决。所以我想,问题算是有点答案了。
1 个回答
3
来自这个关于zipfile的错误报告
这个密码检查的方式是用一个字节来检查zip文件的头部,以确保它们是一致的。所以有大约1/256的几率会出现误判,也就是说,有些不好的密码会被错误地认为是好的;然后ZipFile类会继续解压缩,这时候就会出问题(因为“解密”的数据其实是垃圾)。