测试Zip文件密码时触发zlib.error:无效块类型问题排查
问题原因与解决方案
这个错误的核心原因是:某个候选密码通过了Zip的初始密码校验,但实际并非正确密码。Zip的传统加密(ZipCrypto)验证机制很弱,只校验文件头的CRC值,不验证整个加密流,所以偶尔会出现错误密码“蒙混过关”的情况,此时后续解压数据就会因为密钥不对,导致zlib抛出解压错误。
修复代码的关键步骤
新增zlib.error异常捕获
扩展异常处理逻辑,捕获zlib.error,遇到时直接跳过当前密码,继续尝试下一个:import zipfile import zlib found = False zipFilename = "你的压缩文件路径.zip" # 假设your_wordlist是你的密码候选列表 for word in your_wordlist: password = bytes(word, 'utf-8') print('Trying ' + word) zip = zipfile.ZipFile(zipFilename) zip.setpassword(password) try: bad_file = zip.testzip() # if anything returned without error then password was correct print('Password is ' + word) found = True exit() except RuntimeError as e: if e.args[0].startswith('Bad password for file'): continue raise e # throw any other exception to print on console except zlib.error: # 错误密码通过初始校验,解压失败,直接跳过 continue优化ZipFile的打开方式
每次循环重新打开Zip文件会浪费IO资源,建议把打开操作移到循环外:import zipfile import zlib found = False zipFilename = "你的压缩文件路径.zip" # 循环外仅打开一次Zip文件 with zipfile.ZipFile(zipFilename) as zip_ref: for word in your_wordlist: password = bytes(word, 'utf-8') print('Trying ' + word) zip_ref.setpassword(password) try: bad_file = zip_ref.testzip() print('Password is ' + word) found = True break except RuntimeError as e: if e.args[0].startswith('Bad password for file'): continue raise e except zlib.error: continue排查文件本身问题
如果异常频繁出现,建议用7-Zip等工具打开Zip文件,确认:- 文件是否损坏
- 是否使用了Python标准库
zipfile不支持的加密算法(比如AES加密,这种情况需要用第三方库如pyzipper)
内容的提问来源于stack exchange,提问作者Tony Klieber
相关产品推荐
相关产品推荐

