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批量修改文件后缀示例代码分享
Dec 24 Python
python用字典统计单词或汉字词个数示例
Apr 22 Python
Python实现从脚本里运行scrapy的方法
Apr 07 Python
Python中使用strip()方法删除字符串中空格的教程
May 20 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
python实现彩色图转换成灰度图
Jan 15 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
Python 词典(Dict) 加载与保存示例
Dec 06 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
python如何通过pyqt5实现进度条
Jan 20 Python
Python利用capstone实现反汇编
Apr 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
汉字转化为拼音(php版)
2006/10/09 PHP
玩转虚拟域名◎+ .
2006/10/09 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
jQuery$命名冲突怎么办如何解决
2014/01/16 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
Python中基础的socket编程实战攻略
2016/06/01 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
python递归实现快速排序
2018/08/18 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
python二维图制作的实例代码
2020/12/03 Python
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
2014年小学元旦活动方案
2014/02/12 职场文书
领导失职检讨书
2014/02/24 职场文书
单位接收函格式
2015/01/30 职场文书
财务人员入职担保书
2015/09/22 职场文书
成人成长感言如何写?
2019/08/16 职场文书
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers
Python闭包的定义和使用方法
2022/04/11 Python
Nginx反向代理、重定向
2022/04/13 Servers