2025年3月27日 星期四 甲辰(龙)年 月廿六 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

python破解zip压缩包密码

时间:03-09来源:作者:点击数:41

曾经,在网上下载过一份“学习资料”,zip格式的一份不小的压缩文件。

费劲巴拉的从“某盘”下载,却发现解压需要“密码”,顿时心里有句不当讲的话…

为了破解压缩文件的密码,我在搜索引擎输入“python zip”两个关键词。

经过过一番总结,发现破解的思路都是一样的,暴力破解。

过程如下: 建立密码字典(常用密码)

尝试用每一个密码,来解压文件

解压成功,跳出循环 密码字典

比如,现在一个纯数字的六位密码“050825”

可以从依次遍历“000000”到“999999”,把所有的结果保存到txt文件。

这样的缺点就是比较死板,只能是6位数字,另外就是比较占内存。

于是,有个大神写了个“字典生成器”,你需要做的是传入两个参数“字典的组成元素”和“密码的长度列表”

比如,纯数字的“050825”,你就传入如下的参数:

  • [0,1,2,3,4,5,6,7,8,9],数字就这9个
  • [6],密码的长度

如此,便可按你的要求得到密码的Python 生成器。我们知道,生成器是不占用内存的。

如果数字不过瘾,比如有的密码是字符串。可以考虑在第一个参数中,加入“a-z”和“A-Z”

zipfile解压文件

zipfile模块是python自带的,用于对zip文件的读、写、追加、解压操作等。

“解压”主要是用到ZipFile对象的extractall()方法

extractall(path=None, members=None, pwd=None)方法主要有三个参数。

我们来看一下每个参数的含义:

  • path 指定解压后文件的存储位置
  • members(可选)指定Zip文件中要解压的文件,这个文件名称必须是通过namelist()方法返回列表的子集
  • pwd 指定Zip文件的解压密码(编码“utf-8”)贴个代码:

贴个代码:

  • import zipfile
  • try:
  • with zipfile.ZipFile('test.zip') as zFile:
  • # 创建ZipFile对象
  • # 解压文件
  • zFile.extractall(path='./',pwd=b'1234')
  • print('解压成功!')
  • except:
  • print('解压失败')

进度条可视化

关于进度条,本程序使用 tqdm扩展库

1、密码迭代器

2、密码总个数

  • for pwd in tqdm(chain.from_iterable(all_passwd(dictionaries, maxlen) for maxlen in lengths), total=total):
  • if extract(zfile, pwd): # 记得extract函数返回的是bool类型的哦
  • break

这是破解的结果:

在这里插入图片描述

测试结果:

在这里插入图片描述

全部代码:

  • import time
  • from typing import List
  • from tqdm import tqdm
  • from itertools import chain
  • from zipfile import ZipFile
  • start = 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
  • dictionaries = [str(i) for i in range(10)]
  • # print(dictionaries)
  • # dictionaries.extend(['.com', 'www.']) # 添加自定义的字符集
  • file_name =r"./test.zip" # 你的文件路径
  • 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)
  • zfile = ZipFile(file_name, 'r') # 很像open
  • def extract(zfile: ZipFile, pwd: str) -> bool:
  • # zfile: 一个ZipFile类, pwd: 密码
  • try:
  • zfile.extractall(path='.', pwd=pwd.encode('utf-8')) # 密码输入错误的时候会报错
  • now = time.time() # 故使用 try - except 语句
  • print(f"Password is: {pwd}") # 将正确的密码输出到控制台
  • return True
  • except:
  • return False
  • # 用 bool 类型的返回值告诉主程序是否破解成功 (意思就是返回 True 了以后就停止)
  • lengths = [6] # 密码长度
  • total = sum(len(dictionaries) ** k for k in lengths) # 密码总数
  • for pwd in tqdm(chain.from_iterable(all_passwd(dictionaries, maxlen) for maxlen in lengths), total=total):
  • if extract(zfile, pwd): # 记得extract函数返回的是bool类型的哦
  • break
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门