注意:密码没有加上符号。密码位数只到8位。 有更多想法的大佬可以把完善后的代码贴在评论下共享。
1 import time 2 from typing import List 3 from tqdm import tqdm 4 from itertools import chain 5 from zipfile import ZipFile 6 7 start = time.time() 8 9 # chr(97) -> 'a' 这个变量保存了密码包含的字符集 10 ''' 11 dictionaries = [chr(i) for i in 12 chain(range(97, 123), # a - z 13 range(65, 91), # A - Z 14 range(48, 58))] # 0 - 9 15 ''' 16 17 dictionaries = [chr(i) for i in 18 19 chain( 20 range(97, 123), # a - z 21 range(48, 58))] # 0 - 9 22 #dictionaries.extend(['.com', 'www.']) # 添加自定义的字符集 23 24 file_name = 'D:\qwe.zip' 25 26 def all_passwd(dictionaries: List[str], maxlen: int): 27 # 返回由 dictionaries 中字符组成的所有长度为 maxlen 的字符串 28 29 def helper(temp: list, start: int, n: int): 30 # 辅助函数,是个生成器 31 if start == n: # 达到递归出口 32 yield ''.join(temp) 33 return 34 for t in dictionaries: 35 temp[start] = t # 在每个位置 36 yield from helper(temp, start + 1, n) 37 38 yield from helper([0] * maxlen, 0, maxlen) 39 40 zfile = ZipFile(file_name, 'r') # 很像open 41 42 def extract(zfile: ZipFile, pwd: str) -> bool: 43 # zfile: 一个ZipFile类, pwd: 密码 44 try: 45 zfile.extractall(path='.', pwd=pwd.encode('utf-8')) # 密码输入错误的时候会报错 46 now = time.time() # 故使用 try - except 语句 47 print(f"Password is: {pwd}") # 将正确的密码输出到控制台 48 return True 49 except: 50 return False 51 # 用 bool 类型的返回值告诉主程序是否破解成功 (意思就是返回 True 了以后就停止) 52 53 lengths = [2, 3, 4 ,5 ,6 ,7 ,8 ] # 密码长度 54 total = sum(len(dictionaries) ** k for k in lengths) # 密码总数 55 56 57 for pwd in tqdm(chain.from_iterable(all_passwd(dictionaries, maxlen) for maxlen in lengths), total=total): 58 if extract(zfile, pwd): # 记得extract函数返回的是bool类型的哦 59 break
安装库方法:cmd-> pip install tqdm