如果你有压缩包的密码忘记了,并且压缩包的加密算法采用的是ZipCrypto,并且压缩参数如下图所示:

那么你就可以使用本文中的方法进行破解。

压缩包的加密,是根据输入的密码进行运算加密,输入不同的密码,加密后的结果就是不同的二进制流。所以在进行解密的时候,不同的密码会解密出不同的结果,但是只有一种结果是你想要的正确的结果。

假设组成密码的字符总共有 a 个,密码是1 ~ n位,那么可以组合出 S 种不同的密码,一个字符占一个字节,所有密码的所有字符加在一起总共有 Q 个字节。下面分别给出 S 和 Q 的计算公式:
S=a1+a2+a3+a4+......+an(1)S = a^1+a^2+a^3+a^4+... ...+a^n\tag{1} S=a1+a2+a3+a4+......+an(1)
aS=a2+a3+a4+......+an+an+1(2)aS=a^2+a^3+a^4+... ...+a^n+a^{n+1}\tag{2}aS=a2+a3+a4+......+an+an+1(2)
(1)式减去(2)式得:
(1−a)S=a1−an+1(1-a)S=a^1-a^{n+1}(1−a)S=a1−an+1
最后可以化简得到:
S=a(1−an)1−a.S=\dfrac{a(1-a^n)}{1-a}.S=1−aa(1−an)​.

Q=1⋅a1+2⋅a2+3⋅a3+......+n⋅an(3)Q=1·a^1+2·a^2+3·a^3+... ... + n·a^n\tag{3}Q=1⋅a1+2⋅a2+3⋅a3+......+n⋅an(3)
aQ=1⋅a2+2⋅a3+3⋅a4+......+(n−1)⋅an+n⋅an+1(4)aQ=1·a^2+2·a^3+3·a^4+... ...+(n-1)·a^n+n·a^{n+1}\tag{4}aQ=1⋅a2+2⋅a3+3⋅a4+......+(n−1)⋅an+n⋅an+1(4)
(3)式减去(4)式得:
(1−a)Q=a1+a2+a3+a4+......+an−n⋅an+1(1-a)Q=a^1+a^2+a^3+a^4+... ...+a^n-n·a^{n+1}(1−a)Q=a1+a2+a3+a4+......+an−n⋅an+1
化简得:
Q=a(1−an)(1−a)2+n⋅an+1a−1.Q=\dfrac{a(1-a^n)}{(1-a)^2}+\dfrac{n·a^{n+1}}{a-1}.Q=(1−a)2a(1−an)​+a−1n⋅an+1​.

一开始,我的思路是先写一个程序,这个程序把所有的密码组合出来,写入一个文件,然后再写一个程序,这个程序负责把写入的密码读取出来,再逐个暴力破解。但是后来发现这种思路存在几个问题,如果密码的组合可能性太多的时候,那么存取所有密码的这个文件将会达到几十个G(甚至更大)。压缩包的密码位数可以是1 ~ 127位的(超过127位的密码也有)。以最大位数127位为例,假如不知道密码是多少位,那么可以组合出:
941+942+943+......+94126+9412794^1+94^2+94^3+... ... + 94^{126}+94^{127} 941+942+943+......+94126+94127
种不同的密码组合。使用上面的式子计算一下,就可以知道总共有:39073499766929905093170936199210360403225359398866973176589007276420630179610064715271048101086598784117989282816367722389837036292113256007435625512903036280893835514194448335273218252856958007222866912360893842268293858285256762926406241457713184768 种不同的密码。

如果将所有的密码组合写入文件,不算回车换行符号,那么这个文件将会占 4961914325241313777553199490046598363526519239925145287832966868945419472665422521762910503472996114196429684959005740369797942759811562831081763117671397554605682022967601468185686939482979425062618339967434564286481867349313821628002924237784812093440 个字节。

并且,如果正确密码是最后一个,那么将要循环到最后一个密码才能破解成功,这样将会很耗费时间。所以,我采用了随机密码暴力破解。

下面是代码:

import zipfileimport osimport numpy as nppwdCharset = ['`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '_', '=', '+', '[', ']', '{', '}', ';', ':', "'", '"', '\\', '|', ',', '<', '.', '>', '/', '?', 'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', 'z', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
# 94\CharsetInput = []def gPwd(chST, lgth, rgth):while True:pl = int(np.random.random() * 100)if pl >= lgth and pl <= rgth:breakpwd = ""chStLen = len(chST)for i in range(0, pl):while True:idx = int(np.random.random() * 100)if idx >= 0 and idx < chStLen:breakpwd += chST[idx]return pwddef dcryp(fileName, lLen, rLen, chST):fp = zipfile.ZipFile(fileName)count = 0while True:pwd = gPwd(chST, lLen, rLen)count += 1try:for file in fp.namelist():fp.extract(file, pwd=pwd.encode())os.rename(file, file.encode('cp437').decode('gbk'))print("%d Success! The password is %s" % (count, pwd))breakexcept:print("%d %s no" % (count, pwd))if __name__ == "__main__":fileName = input("请输入要破解的压缩包文件名:")choose = input("按1选择暴力破解。\n按2选择指定条件破解\n")if "1" == choose:leftLen = int(input("确定密码的长度范围:\n请输入密码的最小长度:"))rightLen = int(input("请输入密码的最大长度:"))dcryp(fileName, leftLen, rightLen, pwdCharset)elif "2" == choose:charSt = input("请输入密码中可能包含的字符:\n")for i in charSt:CharsetInput.append(i)leftLen = int(input("确定密码的长度范围:\n请输入密码的最小长度:"))rightLen = int(input("请输入密码的最大长度:"))dcryp(fileName, leftLen, rightLen, CharsetInput)else:print("无效输入!")

下面是测试:



这里选用的是4位的定长密码,尝试了10515次,用了不到10秒钟的到结果。



4位定长密码,如果不指定字符集,用所有可能的字符集暴力随机破解,总共有78074896种不同的密码组合,一共尝试了13478113次,将会用大概20多分钟的时间。

密码越长,且可能的字符越多,则破解的时间越长。

针对长而复杂的密码,如果加密的内容很重要,一定要破解出来的话,可以采用分布式破解,即一台主机通过网络将破解内容分发给一个计算机集群,集群中的每一台主机同时运行多个破解进程,并定期向控制主机发送心跳信号,反馈破解信息,这样可以大大缩短破解时间。

使用python暴力破解zip压缩包的密码相关推荐

  1. python暴力破解压缩包密码(python暴力破解zip压缩包)

    python暴力破解压缩包密码 简介 简介: ZIP文件格式是一种数据压缩和文档储存的文件格式,原名Deflate,发明者为菲尔·卡茨(Phil Katz),他于1989年1月公布了该格式的资料.ZI ...

  2. Python 暴力破解zip文件密码(相对简单的密码)

               Python 暴力破解zip文件密码(相对简单的密码) 密码的使用范围很广,首先,我们要明确密码的作用,其次要明白密码的类型. 密码的作用是进行权限的限制,判断用户的合法性,(不 ...

  3. python暴力破解Zip文件,就是不讲道理

    本次实验将带领大家用Python的zipfile模块实现Zip文件的暴力破解,涉及的知识点包括:zipfile.argparse的用法等等. 一.实验说明 1. 实验简介 我们在网上好不容易下载到一个 ...

  4. 暴力破解zip压缩包

    1:Windows下使用工具archpr工具进行破解 bandzip专业版也可以破解 2:python脚本破解 import zipfilef = open('password.txt', 'w') ...

  5. python暴力破解zip加密文件

    目录 前言: 一.破解zip加密文件的思路: 1.准备一个加密的zip文件. 2.zipfile模块可以解压zip文件. 3.itertools.permutations实现全字符的全排列. 二.实操 ...

  6. python 暴力破解zip文件

    基本原理: 暴力破解(一)--python脚本暴力破解 加密的zip压缩文件简介:zip格式是常见的压缩文件格式,它支持压缩时设置解压密码:有两种加密方式:1传统加密方式和普通的加密方式.传统加密方式 ...

  7. 使用fcrackzip暴力破解zip压缩包

    fcrackzip是一款用于破解zip类型压缩文件密码的工具 命令: fcrackzip -hUSAGE: fcrackzip[-b|--brute-force] use brute force al ...

  8. 【脚本工具】Python暴力破解ZIP文件

    # -*-coding:utf-8-*- import itertools import time import zipfilefilepath = "文件路径" uncompre ...

  9. python暴力破解zip密码文件

    原理非常简单,不说了直接上代码 update:说一些注意点,python3.x 下的string不支持bytes编码方式,而python2.x下是支持的.encode(),和decode()方法就是进 ...

最新文章

  1. anaconda prompt 执行pip install --upgrade pip 错误解决办法
  2. 有网友提问,关于本地XML转JSON的小工具
  3. 发布到服务器接口404_接口测试怎么做?
  4. 解决Azure DevOps部署到Azure后.NET Core网站无法启动的问题
  5. Node.js之HTPP URL
  6. xor方程组消元 UVA 11542 Square
  7. matlab生成均匀部分散点图,应用halton序列生成均匀散点图
  8. POJ1993+矩阵相乘
  9. 解读30个提高Web程序执行效率的好经验
  10. 测试linux内核工具,多种测试linux内核的方法
  11. 计算机硬盘除了c盘其他全不见了,电脑除了c盘其他盘都不见了
  12. 安装,激活(不更新升级)Navicat premium12.0.24(12.0.18)
  13. Python各类常用库整理
  14. Java之对象转型(casting)
  15. 升级iOS 15后iPhone无法连接App Store怎么办?
  16. Python从入门到实践
  17. 选股方法之各种指标的选股方法分析
  18. OpenJudge计算概论-鸡尾酒疗法
  19. Git (代码托管)
  20. vue踩坑笔记06---vuex的state,getter,mustation,action,module

热门文章

  1. 2020年中国网络经济年度洞察报告
  2. 如何使用mount命令远程挂载
  3. 工具 | Cursor:一个不只是写代码的工具
  4. 点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
  5. m0n0wall 1.3b18增加3322.org动态域名支持过程实录
  6. 【Arduino】编码器OMRON E6B2-CWZ6C
  7. mysql 查询不返回结果_MySQL查询不返回所有记录
  8. 我们跟30家PoS团队聊了聊,Staking最硬核的干货都在这儿了
  9. 选择、恪守、进阶、蝶变,“向上”五年做对了什么?
  10. Virtual Private Network虚拟专用网络-在Linux上搭建专用通道