最近我在一本书上读到了一篇关于使用字典破解zip文件密码的文章,觉得非常有趣,于是进行了一番研究。现在我想在这里分享一下,如果有任何错误,请多多包涵。
原理方面,主要是利用Python自带的zipfile库中的extractall函数来实现的。首先导入zipfile库,然后实例化一个ZipFile类。通过调用extractall()函数来解压文件,并在pwd参数中填入正确的密码。
import zipfile
zFile = zipfile.ZipFile(r"D:pythonfate.zip")
passFile = open(r"D:pythonpwd.txt")
for line in passFile.readlines():
password = line.strip('n')
# noinspection PyBroadException
try:
zFile.extractall(pwd=password.encode("utf=8"))
print("password="+password)
except Exception as e:
pass
在执行脚本之后,我们发现fate.zip文件会被成功解压,而如果填入错误的密码,则会像下图一样报错。因此,我们可以利用抛出的异常来测试字典文件中是否包含zip文件的密码,并使用try-except来处理异常信息。
代码方面,我们将zip文件的密码设为fate,字典文件为pwd.txt。
import zipfile
from threading import Thread
def extractfile(zFile,password): # noinspection PyBroadException try:
zFile.extractall(pwd=password.encode("utf=8"))
print("password="+password)
except Exception as e:
passdef main(): zFile = zipfile.ZipFile(r"D:pythonfate.zip")
passFile = open(r"D:pythonpwd.txt")
for line in passFile.readlines():
password = line.strip('n')
t = Thread(target=extractfile(zFile , password)) t.start()if __name__ == "__main__":
main()
需要注意的是,Python 3不再自动支持ASCII编码,所以在extractall函数的pwd参数后需要手动添加编码类型。而# noinspection PyBroadException则是为了防止PyCharm报错。
为了提高性能,我们可以将程序模块化,并利用多线程来处理。可以使用Thread来实现多线程处理。