#生成从0000到9999的密码表
f = open('passdict4.txt','w')
for id in range(10000):
password = str(id).zfill(4)+'n'
f.write(password)
f.close()
为了提高文章的SEO效果,我将重新构建文章内容,保持原有信息的基础上,确保相似度低于30%。以下是经过修改的文章内容:
最近,我在网上下载了一些项目案例,但不幸的是,它们都是加密的压缩包。为了解决这个问题,我开始寻找压缩包破解工具。然而,由于工具破解速度太慢,我放弃了,决定寻找其他方法。
幸运的是,我发现这些压缩包都是使用4位数字密码加密的。这让我想到可以使用密码字典进行破解。我立即开始尝试,结果证实了我的猜想,破解速度大大加快。既然有更快的方法,为什么不研究一种自动化的解决方案呢?
我发现Python中有一个名为ZipFile的库可以解压zip文件。通过阅读相关文档,我了解到可以使用ZipFile.extractall(path=None, members=None, pwd=None)函数将指定的文件解压到当前目录。只需循环读取文件夹下的zip文件,然后逐个解压即可。需要注意的是,Python 3中存在一个中文文件名乱码的问题,但只需将ZipFile.py中的“cp437”改为“gbk”即可永久解决。
在这个基础上,我又加入了循环密码字典的功能。由于解压时密码错误会导致异常,我使用try-except语句进行处理。然而,事情并没有像我想象的那么简单。虽然大多数情况下都可以成功破解,但总有一些情况下破解失败,让我束手无策。我在各个网站上寻找解决方法,最初以为是extractall方法调用错误,但错误提示却是密码错误,这让我感到困惑。
直到偶然间,我在一篇文章中得知,默认情况下,WinRAR在CTR模式下使用AES-256加密ZIP文件,而Python标准库中的zipfile模块只支持CRC32加密的zip文件。这意味着无法使用zipfile库解压使用AES-256加密的zip文件。我已经花了很多心思,如果在这里放弃,那就太可惜了。既然加密方式不同,那么解压软件是如何直接解压的呢?
我产生了一个构想,如果能够从代码中调用解压软件,那就解决了问题。我迅速使用绝技,成功找到了多款解压软件如7z等,它们都有相关的命令行功能。通过调用第三方软件的命令行,配置环境变量,我验证了这个方法的可行性,配置成功。
尽管解决了加密方式的问题,但人的贪欲是无止境的。重复调用命令行让我感到不爽。幸运的是,在查找加密方式的过程中,我发现Python有一个名为pyzipper的库,可以很好地兼容并替代zipfile,可以读写AES加密的zip文件。既然走到了这一步,就没有退路可言。只需安装pyzipper(pip install pyzipper),并解决中文名乱码问题,这个方法堪称完美。
在文章的结尾,我提供了一些参考链接,包括补丁破解工具、Python批量解压zip文件、Python破解压缩包密码等相关内容。
# zipfile打开zip文件
z = zipfile.ZipFile(f'{file_path}', 'r'
# path为解压路径,解包后位于该路径下
z.extractall(path=f"{root})
z.close()
# 获取字典中的内容
passFile = open(r"D:pythonpassdict4.txt")
# 循环获得单个密码
for line in passFile.readlines():
# 去换行
password = line.strip('n')
try:
zip_file.extractall(path=f"{root}", pwd=password.encode("utf-8"))
print(password)
# 密码对了就不继续下去了
break
except:
# 什么都不做
pass
zip_file.close() # 关闭文件,必须有,释放内存
passFile = open(r"D:pythonpassdict4.txt")
for line in passFile.readlines():
password = line.strip('n')
# t 测试
command='7z -p'+password+' t '+file_path
child=subprocess.call(command)
if(child==0):
print(password)
break
f1 = open('D:pythonpassdict4.txt','r')
with pyzipper.AESZipFile(file_path,'r') as f:
for i in f1:
i = i.rstrip('n')
f.pwd = str.encode(i)
try:
f.extractall(path=f"{root}")
print(file_path+"t密码是:"+i)
break
except Exception:
pass
f.close()
f1.close()