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中的文件I/O操作
May 24 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
python爬虫入门教程--快速理解HTTP协议(一)
May 25 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
Aug 07 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
Jul 19 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
在pycharm中显示python画的图方法
Aug 31 Python
Python实现电视里的5毛特效实例代码详解
May 15 Python
Python调用jar包方法实现过程解析
Aug 11 Python
Python3.8安装Pygame教程步骤详解
Aug 14 Python
总结几个非常实用的Python库
Jun 26 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 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 5.3.5安装memcache注意事项小结
2011/04/12 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
Gird事件机制初级读本
2007/03/10 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
一个简单的python程序实例(通讯录)
2013/11/29 Python
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
Python字符串匹配算法KMP实例
2015/07/18 Python
简单的python后台管理程序
2017/04/13 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
美的官方商城:Midea
2016/09/14 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
美容师的职业规划书
2013/12/27 职场文书
打架检讨书2000字
2014/02/22 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
新学期开学标语
2014/06/30 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
小组口号霸气押韵
2015/12/24 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang