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中replace方法实例分析
Aug 20 Python
Python爬虫模拟登录带验证码网站
Jan 22 Python
使用Python进行二进制文件读写的简单方法(推荐)
Sep 12 Python
django实现前后台交互实例
Aug 07 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
python程序变成软件的实操方法
Jun 24 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
Python根据指定文件生成XML的方法
Jun 29 Python
Python 如何查找特定类型文件
Aug 17 Python
Pycharm连接gitlab实现过程图解
Sep 01 Python
用python-webdriver实现自动填表的示例代码
Jan 13 Python
PyCharm常用配置和常用插件(小结)
Feb 06 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
PHP文件注释标记及规范小结
2012/04/01 PHP
Session服务器配置指南与使用经验的深入解析
2013/06/17 PHP
php 强制下载文件实现代码
2013/10/28 PHP
Destoon模板制作简明教程
2014/06/20 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
jQuery中Dom的基本操作小结
2014/01/23 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
bootstrap table实例详解
2017/01/06 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
VueJs监听window.resize方法示例
2018/01/17 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
2020/06/12 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
python删除列表中重复记录的方法
2015/04/28 Python
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
某公司.Net方向面试题
2014/04/24 面试题
《故乡》教学反思
2014/04/10 职场文书
超市开店计划书
2014/04/26 职场文书
生物科学专业自荐书
2014/06/20 职场文书
元旦晚会活动总结
2014/07/09 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
优秀团员个人总结
2015/02/26 职场文书
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python