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

暴力破解ZIP文件
本文介绍如何使用Python通过暴力破解的方法尝试打开受密码保护的ZIP文件,重点在于生成字典和多线程处理。

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

密码的使用范围很广,首先,我们要明确密码的作用,其次要明白密码的类型。

密码的作用是进行权限的限制,判断用户的合法性,(不包括合理性?)既然名字都叫密码,密的意思是秘密的意思,这应该毫无疑义,但忘记密码的人间惨剧时有发生,我想,密码验证是合法的,但如果因为各种原因比如遗忘密码,把主人挡在了门外,这就很尴尬了。通常,这样的情况下是没有什么好的处理方式,暴力破门基本是唯一选项(说个题外话,比如QQ密码等等,也会有遗忘的情况,但密码不是唯一验证用户合法性的方式,可以通过绑定的唯一手机,邮箱等找回密码,或者痛苦的申述?)。文件被加密了,一般是没有什么乱七八糟的找回服务,申诉服务,只有两个选项,一个是毁灭这个文件(眼不见心不烦),一个是暴力破解。

那么,在暴力破解前,我们应该知道密码都有什么样的类型?在明文密码中,通常分为 强密码,弱密码这两类,强密码通常指密码位数大于8,密码中使用了特殊字符以及数字和大小写字母的组合而成的密码,并至少有一个特殊字符,密码中不包含与用户相关的信息,如账号名称,生日,等等相关信息。弱密码通常指单一的类型的密码,只由数字 或者大写字母,小写字母,特殊符号这四类中的一类单纯的组成,密码长度小于8位。并与用户的信息相关联。密文密码不在本文讨论中,比较复杂,因此有密码学这么一门学科。

本文中的暴力破解密码指的是暴力弱密码,即使破解弱密码,也需要电脑的配置比较高,时间也可能很长(有的密码破解可以持续几个月甚至以年单位。当然,这样的情况是变态复杂的密文密码),既然是暴力,自然需要的力量要很大哦,硬盘,cpu,内存越高越好。(小孩子踹铁门可能n下,那换成大人来,可能很快就踹开了)。暴力破解通常需要一个包含目标密码的字典,也就是说密码是大概率存在字典内的某一个值,字典是什么?好比,拿钥匙开门,首先,你得有一大串钥匙,然后,无脑的暴力的 挨个试着开门,直到打开门,在打开门前,很大的一串钥匙里应该是有一把能开门的钥匙,这个钥匙串就是字典喽,因此,无重复的钥匙串越大越好,也就是说精度要高,不要重复太多,毕竟拿钥匙开门需要时间的。如果这个钥匙串里一定有开门的钥匙,那么,无脑的暴力用钥匙挨个试着开门总会成功的、以上就是暴力破解密码的大体原理、

  • 本文介绍一个暴力破解纯数字只有五位数字组成的密码,该密码应用于zip压缩包。
  • 暴力破解首先要解决钥匙串的问题,也就是字典,其次,有字典后,不停的使用字典内的值挨个试验密码是否能正确打开zip压缩包,直到某个密码可以打文件,把该密码打印出来,并统计暴力破解的时间。

下面开始第一步,生成字典文件。

dict_1.py

import random
import itertools
passwd_dicts = list(itertools.permutations(['0','1','2','3','4','5','6','7','8','9',],5))
#5代表的是元组的长度,在这设为5. 生成一个0到9中的任意五位数字的元组集合。
for k in passwd_dicts:
    passwd = ''.join(list(k))
    with open('pass.txt','a+') as f:
        f.write('\n'+passwd)

#该文件名为dict_1.py,运行后,会在该文件所在目录下生成一个名字为pass.txt的文件。
#itertools,迭代器工具集,或者迭代器生成工具。Python操作迭代器的模块,用来生成各种迭代器。
#permutations(iterable,r=None)返回的是可迭代元素中的一个排列组合,返回的是元组,并且是按顺序返回
#的,且不包含重复的结果

pojie.py

import zipfile
import threading
import time
flag=True
start_time = time.time()
#程序运行时的时间,记录
def extractall(zfile,password):
#由于在试密码时,会报错,因此将试密码这段try了,为了不每次捕获异常都处理该异常,使用pass站位
    try:
        zfile.extractall(pwd = bytes(password, "utf8" ))
        print('文件解压密码为:',password)
        now = time.time()
#获取当前时间
        #print('程序运行时长为:%s'%(now-start_time))
#可以两种格式化输出任选一个,无关紧要。
        print("程序运行时长为:{}秒".format(now - start_time))
        global flag
#一定要将旗标提成全局变量,否则变量传不出去,程序无法终止
        flag = False
#当密码正确时,旗标false,程序终止
    except:
        pass
def main():
    zfile = zipfile.ZipFile('2.zip')
#读取一个名字为2的zip文件,注意,这是相对路径!!!!!
    with open(r'pass.txt') as f:
#with方法,打开字典文件,注意,仍然是相对路径!!!!!
        for line in f.readlines():
#按行读取。
            password = line.strip('\n')
#每一行是一个密码
            #print(password)
            if flag is True:
                t = threading.Thread(target = extractall,args = (zfile,password))
#多线程上面的函数,函数名 extractall,参数,zfile和password
                t.start()
#开启线程
                t.join()
if __name__=='__main__':
#调用函数,执行暴力破解
    main()
'''导入了多线程模块,zipfile读取zip文件模块,时间模块,程序开始时设置starttime和flag,flag表示旗标,为了在获取到正确的密码后停止多线程并停止程序的运行'''

 

相关说明:

1.总共四个文件,一个是生成字典的程序文件,本例为 dict_1.py,一个是执行暴力破解的python程序文件,也就是pojie.py ,一个是dict_1.py所生成的字典 ,名称为pass.txt文本文件,一个是需要暴力破解的zip文件,本例为a.zip,该文件密码为纯数字五位数的密码。建议从字典文件中复制一个随机密码作为该文件密码。

2.生成字典的方式为有限的迭代生成,因此,精度并不高,有些五位数的数字并不在字典当中,当然,可以不使用字典,直接range,在此主要是想使用字典的练习。

3.程序运行时间和字典的大小,计算机的内存,cpu,硬盘的配置有关,仅做参考、

4.四个文件都放在一个文件夹内,如果cmd运行,需要更改路径为绝对路径。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚风_END

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值