源码要点解析:
1.基本思路过程: 建立密码字典(常用的密码库)——尝试用每一个密码,来效验解压文件——解压成功,获取密码,跳出循环。破解失败,可能存在着其他的密码类型。
写了个“字典生成器”,你需要做的是传入两个参数“字典的组成元素”和“密码的长度列表”。比如,纯数字的“123”,你就传入如下的参数:
[0,1,2,3,4,5,6,7,8,9],数字就这9个
[3],密码的长度
自己准备一个要要压缩的文件夹,把zip压缩包的密码设置为123,3为数的数字密码,如下图所示。方便测试以下py源码的破解。
2.zfile.extractall关键字参数的用法: 用于将压缩文件(如 ZIP 文件)中的所有文件和子目录解压到一个指定的目录。这个函数是 zipfile 模块的一部分,下面是 zfile.extractall() 函数的参数:
-
path: 必需,解压后的目标路径。
-
members: 可选,一个包含想要解压的文件名称的列表。如果未指定,那么所有的文件都将被解压。
-
pax_headers: 可选,一个包含 pax 头信息的字典。这个参数允许你为 pax 格式的压缩文件提供额外的头部信息。
-
path_resolver: 可选,一个函数,用于在解压过程中决定如何解析路径。默认情况下,使用系统的路径解析器。
-
numeric_names: 可选,如果设置为 True,那么在解压过程中将忽略文件名中的字符编码。默认情况下,这个参数是 False。
-
remove_trailing_slashes: 可选,如果设置为 True,那么在解压过程中会删除目标路径中的尾部斜杠。默认情况下,这个参数是 False。
-
mode: 可选,指定解压的模式。默认情况下,使用系统的默认模式。
-
pwd: 可选,一个包含密码的 bytes 对象,用于解密 ZIP 文件中的加密文件。
这个函数没有返回值,但是它会将压缩文件中的所有文件和子目录解压到指定的目录中。
**3.进度条可视化:**看到破解的过程,本程序使用 tqdm库
密码迭代器
密码总个数
4. 运行后的代码输出:
[‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]
11%|█ | 111/1000 [00:00<00:01, 888.06it/s]
恭喜破解成功:压缩文件的密码是: 111
破解时长:0.18748879432678223秒
进程已结束,退出代码0
↓ 源码如下 ↓
import time
from typing import List
from tqdm import tqdm
from itertools import chain
from zipfile import ZipFile
start_time = time.time()
# chr(97) -> 'a' 这个变量保存了密码包含的字符集
'''
dictionaries = [chr(i) for i in
chain(range(97, 123), # a - z
range(65, 91), # A - Z
range(48, 58))] # 0 - 9
'''
# 设置数字密码库0-9
dictionaries = [str(i) for i in range(10)]
print(dictionaries)
# 1. 生成可能的密码库
def all_passwd(dictionaries: List[str], maxlen: int):
# 返回由 dictionaries 中字符组成的所有长度为 maxlen 的字符串
def helper(temp: list, start: int, n: int):
# 辅助函数,是个生成器
if start == n: # 达到递归出口
yield ''.join(temp)
return
for t in dictionaries:
temp[start] = t # 在每个位置
yield from helper(temp, start + 1, n)
yield from helper([0] * maxlen, 0, maxlen)
# 2. 破解密码
def cracking_passwords(file_path: str, pwd: str, save_path: str) -> bool:
# zfile: 一个ZipFile类, pwd: 密码
zfile = ZipFile(file_path, 'r')
try:
zfile.extractall(save_path, pwd=pwd.encode('utf-8'))
# 密码输入错误的时候会报错
now_time = time.time() # 故使用 try - except 语句
# 将正确的密码输出到控制台
print(f'恭喜破解成功:压缩文件的密码是: {pwd}')
print(f'破解时长:{now_time - start_time}秒')
return True
except:
return False
if __name__ == '__main__':
# 设置密码长度
lengths = [3]
# 获取密码的组合数
total = sum(len(dictionaries) ** n for n in lengths)
for password in tqdm(chain.from_iterable(all_passwd(dictionaries, maxlen) for maxlen in lengths), total=total):
# 如果破解成功,程序结束,./ 表示解压到当前目录
if cracking_passwords('pic2/pic3.zip', password, './'):
break
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典