python 破解加密zip文件的密码


Posted in Python onApril 22, 2021

今天的文章来自 盏茶作酒 同学。他在老电脑中发现了一个加密的 zip 文件,于是用 Python 破解了文件密码。在破解的过程中出现了内存爆炸的问题,通过阅读 Python 源代码找到了解决方案。

下面就来给大家分享一下他的操作。

之前在家里的老电脑中,发现一个加密zip压缩包,由于时隔太久忘记密码了,依稀记得密码是6位字母加数字,网上下载了很多破解密码的软件都没有效果,于是想到自己用Python写一个暴力破解密码的脚本。
Python 有一个内置模块 zipfile 可以解压 zip 压缩包。先来测试一波:创建一个测试文件,压缩,设置解压密码为123。

python 破解加密zip文件的密码

import zipfile

# 创建文件句柄
file = zipfile.ZipFile("测试.zip", 'r')
# 提取压缩文件中的内容,注意密码必须是bytes格式,path表示提取到哪
file.extractall(path='.', pwd='123'.encode('utf-8'))

运行效果如下图所示,提取成功。

python 破解加密zip文件的密码

既然如此,那我不停尝试所有可能的密码组合去解压缩不就行了嘛~

好了,开始破解老文件的密码。

为了提高速度,我还加了多线程的代码:

import zipfile
import itertools
from concurrent.futures import ThreadPoolExecutor

def extract(file, password):
    if not flag: return
    file.extractall(path='.', pwd=''.join(password).encode('utf-8'))


def result(f):
    exception = f.exception()
    if not exception:
        # 如果获取不到异常说明破解成功
        print('密码为:', f.pwd)
        global flag
        flag = False


if __name__ == '__main__':
    # 创建一个标志用于判断密码是否破解成功
    flag = True
    # 创建一个线程池
    pool = ThreadPoolExecutor(100)
    nums = [str(i) for i in range(10)]
    chrs = [chr(i) for i in range(65, 91)]
    # 生成数字+字母的6位数密码
    password_lst = itertools.permutations(nums + chrs, 6)
    # 创建文件句柄
    zfile = zipfile.ZipFile("加密文件.zip", 'r')
    for pwd in password_lst:
        if not flag: break
        f = pool.submit(extract, zfile, pwd)
        f.pwd = pwd
        f.pool = pool
        f.add_done_callback(result)

然而,事情并没有那简单……

代码跑一会儿,内存爆了!

python 破解加密zip文件的密码

于是,为了找寻问题所在,我就去查看了一下源码,发现ThreadPoolExecutor默认使用的是无界队列。而程序中尝试密码的速度跟不上生产密码的速度,就会把生产任务无限添加到队列中。导致内存被占满。内存直接飙到95:

python 破解加密zip文件的密码

找到病根儿,剩下的就是对症下药了。

继承并重写了ThreadPoolExecutor类中的_work_queue属性,将无界队列改成有界队列,这样就不会出现内存爆满的问题,看代码:

import queue
from concurrent.futures import ThreadPoolExecutor


class BoundedThreadPoolExecutor(ThreadPoolExecutor):
    def __init__(self, max_workers=None, thread_name_prefix=''):
        super().__init__(max_workers, thread_name_prefix)
        self._work_queue = queue.Queue(self._max_workers * 2) # 设置队列大小

用自定义的BoundedThreadPoolExecutor类替代前面代码中的ThreadPoolExecutor。

再次执行……

python 破解加密zip文件的密码

程序输入如下图内容:

python 破解加密zip文件的密码

Bingo!破解成功!(原来密码如此简单……)
话说回来,毕竟这个压缩包我是隐约知道它的位数和范围(字母和数字),所以破解出来需要的时间是可以忍受的。如果有天你在网上找了一个无人认领的加密压缩包,想要一窥究竟但又并不知道它有多少位密码,那我只能祝你好运啦~

以上就是python 破解加密zip文件的密码的详细内容,更多关于python 破解zip文件密码的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python分割文件的常用方法
Nov 01 Python
详解Python中使用base64模块来处理base64编码的方法
Jul 01 Python
python中的字典操作及字典函数
Jan 03 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
django之状态保持-使用redis存储session的例子
Jul 28 Python
python修改FTP服务器上的文件名
Sep 11 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
tensorflow 变长序列存储实例
Jan 20 Python
tensorflow 实现自定义梯度反向传播代码
Feb 10 Python
python正则过滤字母、中文、数字及特殊字符方法详解
Feb 11 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
django美化后台django-suit的安装配置操作
Jul 12 Python
python入门之算法学习
Apr 22 #Python
python使用XPath解析数据爬取起点小说网数据
Apr 22 #Python
python 实现德洛内三角剖分的操作
python 三边测量定位的实现代码
python如何读取.mtx文件
Apr 22 #Python
Python中tkinter的用户登录管理的实现
python爬虫之利用selenium模块自动登录CSDN
You might like
把77A收信机改造成收音机
2021/03/02 无线电
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
详解Python爬虫的基本写法
2016/01/08 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
如何在python中写hive脚本
2019/11/08 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
函授本科毕业自我鉴定
2013/10/09 职场文书
作弊检讨书1000字
2014/02/01 职场文书
上班玩游戏检讨书
2014/02/07 职场文书
学生党员公开承诺书
2014/05/28 职场文书
群众路线自我剖析范文
2014/11/04 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏