新闻动态

手把手教你使用Python解决简单的zip文件解压密码

发布日期:2021-12-12 00:19 | 文章来源:源码之家

简介

使用的核心模块是python标准库中的zipfile模块。这个模块可以实现zip文件的各种功能,具体可以查看官方参考文档。这里的暴力破解的意思是对密码可能序列中的值一个一个进行密码尝试,这对人来说是很难的,可是对计算机而言并不难。有时候我们下载的zip文件需要密码解压而我们不知道,需要付费才知道。所以这里主要介绍两种暴力破解的密码:纯数字密码和英文数字组合密码。

文件创建

首先测试文件为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文件进行解压的)和加密方式并非传统加密。这种暴力破解方法只在自己大致记得密码位数和密码格式(如只有字母等)时比较实用,完全的暴力破解是不现实的,毕竟做加密的也不是白做的。

到此这篇关于手把手教你使用Python解决简单的zip文件解压密码的文章就介绍到这了,更多相关Python zip文件解压密码内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部