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才可以退出循环