zipfile模块返回不可靠结果

2 投票
1 回答
1332 浏览
提问于 2025-04-16 09:50

我对加密的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类会继续解压缩,这时候就会出问题(因为“解密”的数据其实是垃圾)。

撰写回答