from zipfile import ZipFile
import os
def pojie(path,pwd):
#对文件路径aa.zip进行切分两份,生成的压缩文件为[0],aa.zip为[1]
#-1代表从aa从1开始把点干掉到zip 只保留zip后缀名
type_1=os.path.splitext(path)[-1][1:]
if type_1=='zip': #判断这个获取到的是不是zip文件
#创建文件流路径与只读模式 赋给zip
with ZipFile(path,'r') as zip:
#解压所有文件到 哪个文件目录
print(f'正在尝试密码:{pwd}')
#尝试运行文件 zip压缩文件,附带密码,如果密码不对则不进行退出
#不打印错误,再次运行即可
try:
zip.extractall('./生成的压缩文件',pwd=str(pwd).encode('utf-8'))
print(f'解压成功,密码是{pwd}') #打印一下成功的密码
return True #返回一个True值则代表解压成功
#失败就跳过接续
except Exception as e:
pass
def create_pwd(lengh):
import itertools as its #导入生成所有排列组合的模块
#尝试的密码组合 包含了什么数字与字母或符号等
words='1234567890abcdefghijklmnopqrstuvwxyz\][{};:"@#$%^&~-=!'
#for循环多少位的密码组合,在不知道密码长度的情况下
for i in range(1,lengh):
#扔进去words 密码组合,repeat是有几位数的组合
#base存放的就是根据words里面的字符串 组合出多少位数的组合方式
base=its.product(words,repeat=i)
#对base对象进行遍历循环,base本身就是一个迭代对象
for i in base:
#所以这里必须生成一个迭代器,join(i)方法 将i变成字符串
yield ''.join(i)
if __name__ == '__main__':
#对create_pwd 方法进行遍历,最后保留的全是计算机尝试的密码
for p in create_pwd(4):
#给pojie方法中的path传入一个压缩包的路径,并传入一个p代表密码,并赋给flag
flag=pojie('./生成的压缩文件/aa.zip',p)
if flag: #如果flag有值那么就退出循环 不返回True的话是没有值的
break #返回True才可以退出循环