当前位置:
首页 > temp > python入门教程 >
-
手把手教你使用Python解决简单的zip文件解压密码
简介
使用的核心模块是python标准库中的zipfile模块。这个模块可以实现zip文件的各种功能,具体可以查看官方参考文档。这里的暴力破解的意思是对密码可能序列中的值一个一个进行密码尝试,这对人来说是很难的,可是对计算机而言并不难。有时候我们下载的zip文件需要密码解压而我们不知道,需要付费才知道。所以这里主要介绍两种暴力破解的密码:纯数字密码和英文数字组合密码。
文件创建
很多人学习python,不知道从何学起。 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经做案例的人,却不知道如何去学习更加高深的知识。 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码! QQ群:861355058 欢迎加入,一起讨论 一起学习!
首先测试文件为test.txt(仅包含单行文本),压缩后文件为test.zip,压缩密码为2340,压缩后删除目录下的txt文件。。
上图注意勾选传统加密。
纯数字密码
指的是不用0开头的数字密码,0开头见后面的字母组合。原理就是zipfile模块解压压缩文件时,一旦密码不正确,程序会终止,在try语句只有成功解压的密码才会执行到extract函数调用后面的语句。
代码:
import zipfile import time import threading startTime = time.time() # 判断线程是否需要终止 flag = True def extract(password, file): try: password = str(password) file.extractall(path='.', pwd=password.encode('utf-8')) print("the password is {}".format(password)) nowTime = time.time() print("spend time is {}".format(nowTime-startTime)) global flag # 成功解压其余线程终止 flag = False except Exception as e: print(e) def do_main(): zfile = zipfile.ZipFile("test.zip", 'r') # 开始尝试 for number in range(1, 9999): if flag is True: t = threading.Thread(target=extract, args=(number, zfile)) t.start() t.join() if __name__ == '__main__': do_main()
显然,解压成功,这里提一下这种编码 密码的方式只适用于传统zip加密,winrar有一种新式的默认加密方式,是不可以的。
字母数字混合密码
这里情况密码组合太多,为了防止内存溢出,改用迭代器。这种情况费时很久,可以闲来无事挂着脚本。这里再次压缩文件,密码为python。
import zipfile
import random
import time
import sys
class MyIterator():
# 单位字符集合
letters = 'abcdefghijklmnopqrstuvwxyz012345678'
min_digits = 0
max_digits = 0
def __init__(self, min_digits, max_digits):
# 实例化对象时给出密码位数范围,一般4到10位
if min_digits < max_digits:
self.min_digits = min_digits
self.max_digits = max_digits
else:
self.min_digits = max_digits
self.max_digits = min_digits
# 迭代器访问定义
def __iter__(self):
return self
def __next__(self):
rst = str()
for item in range(0, random.randrange(self.min_digits, self.max_digits+1)):
rst += random.choice(MyIterator.letters)
return rst
def extract():
start_time = time.time()
zfile = zipfile.ZipFile("test.zip")
for p in MyIterator(5, 6):
try:
zfile.extractall(path=".", pwd=str(p).encode('utf-8'))
print("the password is {}".format(p))
now_time = time.time()
print("spend time is {}".format(now_time-start_time))
sys.exit(0)
except Exception as e:
pass
if __name__ == '__main__':
extract()
字符的序列组合很多,需要等待。
补充说明
很多人反馈这个方法无效,这主要是因为文件路径不正确(我的代码是默认该Python脚本所在目录下的zip文件进行解压的)和加密方式并非传统加密。这种暴力破解方法只在自己大致记得密码位数和密码格式(如只有字母等)时比较实用,完全的暴力破解是不现实的,毕竟做加密的也不是白做的。
原文:https://www.cnblogs.com/pythonQqun200160592/p/15508588.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数