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字符串的encode与decode研究心得乱码问题解决方法
Mar 23 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
利用Python进行异常值分析实例代码
Dec 07 Python
python+opencv识别图片中的圆形
Mar 25 Python
python实现名片管理系统
Nov 29 Python
Pyqt5实现英文学习词典
Jun 24 Python
python数据归一化及三种方法详解
Aug 06 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
Nov 29 Python
Python动态导入模块和反射机制详解
Feb 18 Python
Django admin管理工具TabularInline类用法详解
May 14 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
Oct 31 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 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的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
2015/12/02 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
2016/08/16 Javascript
详解支持Angular 2的表格控件
2017/01/19 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
python2.7的编码问题与解决方法
2016/10/04 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
PHP如何去执行一个SQL语句
2016/03/05 面试题
银行会计财务工作个人的自我评价
2013/10/29 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
结婚纪念日感言
2015/08/01 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers
Python函数对象与闭包函数
2022/04/13 Python