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爬虫爬取美剧网站的实现代码
Sep 03 Python
Python数据抓取爬虫代理防封IP方法
Dec 23 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
用python画一只可爱的皮卡丘实例
Nov 21 Python
Python中使用gflags实例及原理解析
Dec 13 Python
python使用协程实现并发操作的方法详解
Dec 27 Python
Pytorch 实现权重初始化
Dec 31 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
Feb 13 Python
pytorch实现seq2seq时对loss进行mask的方式
Feb 18 Python
python selenium自动化测试框架搭建的方法步骤
Jun 14 Python
如何实现更换Jupyter Notebook内核Python版本
May 18 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
May 25 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/08/21 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
jqGrid读取选择的多行的某个属性代码
2014/05/18 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
vue实现局部刷新的实现示例
2019/04/16 Javascript
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
Python编程入门的一些基本知识
2015/05/13 Python
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
全面理解Python中self的用法
2016/06/04 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
python中时间模块的基本使用教程
2019/05/14 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
python读写文件write和flush的实现方式
2020/02/21 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
python openpyxl模块的使用详解
2021/02/25 Python
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
作文评语怎么写
2014/12/25 职场文书
用python修改excel表某一列内容的操作方法
2021/06/11 Python
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL
对象析构函数__del__在Python中何时使用
2022/03/22 Python