如何使用Python解决简单的zip文件解压密码
小编给大家分享一下如何使用Python解决简单的zip文件解压密码,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
文件创建
首先测试文件为test.txt(仅包含单行文本),压缩后文件为test.zip,压缩密码为2340,压缩后删除目录下的txt文件。。
上图注意勾选传统加密。
纯数字密码
指的是不用0开头的数字密码,0开头见后面的字母组合。原理就是zipfile模块解压压缩文件时,一旦密码不正确,程序会终止,在try语句只有成功解压的密码才会执行到extract函数调用后面的语句。
代码:
importzipfileimporttimeimportthreadingstartTime=time.time()#判断线程是否需要终止flag=Truedefextract(password,file):try:password=str(password)file.extractall(path='.',pwd=password.encode('utf-8'))print("thepasswordis{}".format(password))nowTime=time.time()print("spendtimeis{}".format(nowTime-startTime))globalflag#成功解压其余线程终止flag=FalseexceptExceptionase:print(e)defdo_main():zfile=zipfile.ZipFile("test.zip",'r')#开始尝试fornumberinrange(1,9999):ifflagisTrue:t=threading.Thread(target=extract,args=(number,zfile))t.start()t.join()if__name__=='__main__':do_main()
显然,解压成功,这里提一下这种编码 密码的方式只适用于传统zip加密,winrar有一种新式的默认加密方式,是不可以的。
字母数字混合密码
这里情况密码组合太多,为了防止内存溢出,改用迭代器。这种情况费时很久,可以闲来无事挂着脚本。这里再次压缩文件,密码为python。
importzipfileimportrandomimporttimeimportsysclassMyIterator():#单位字符集合letters='abcdefghijklmnopqrstuvwxyz012345678'min_digits=0max_digits=0def__init__(self,min_digits,max_digits):#实例化对象时给出密码位数范围,一般4到10位ifmin_digits<max_digits:self.min_digits=min_digitsself.max_digits=max_digitselse:self.min_digits=max_digitsself.max_digits=min_digits#迭代器访问定义def__iter__(self):returnselfdef__next__(self):rst=str()foriteminrange(0,random.randrange(self.min_digits,self.max_digits+1)):rst+=random.choice(MyIterator.letters)returnrstdefextract():start_time=time.time()zfile=zipfile.ZipFile("test.zip")forpinMyIterator(5,6):try:zfile.extractall(path=".",pwd=str(p).encode('utf-8'))print("thepasswordis{}".format(p))now_time=time.time()print("spendtimeis{}".format(now_time-start_time))sys.exit(0)exceptExceptionase:passif__name__=='__main__':extract()
字符的序列组合很多,需要等待。
看完了这篇文章,相信你对“如何使用Python解决简单的zip文件解压密码”有了一定的了解,如果想了解更多相关知识,欢迎关注恰卡编程网行业资讯频道,感谢各位的阅读!