python全排列(可重复)以及暴力破解zip

1.暴力破解zip

思路很简单,暴力破解顾名思义就是尝试所有的可能,for套for套for套for…,但是我们并不知道密码有多少位,有多少个for,emmmmm,没关系,我们可以递归呀

我们这里讨论几种比较有效的生成随机密码的方法

先上代码以及测试效果,想了解细节的小伙伴可以继续往下看

import zipfile
import random
import datetime
import sys
import threading

global i,pwd,pdict,flag
flag = False            #用来判断是否找到了密码
i = 0                   #密码的生成位数,在递归中用到
pwd = str()             #密码测试的字符串
pdict = '0123456789'    #定义的密码字典,密码中所有出现的字符来自于此

def dictPass(zfile, p):     #测试是否找到密码的方法
    global flag
    if flag:                #找到退出
        sys.exit(0)
        return
    try:                    #尝试解压,解压到当前目录./extract文件夹下
        zfile.extractall(path="./extract/", pwd=str(p).encode('utf-8'))
        print("the password is {}".format(p))
        flag = True
    except Exception as e:  #打印所有测试的密码
            print('error',p)

def redict(zfile,loop):     #递归顺序输出所有的排列组合的可能情况
    if flag:
        return
    global i,pdict,pwd
    i += 1
    if i>loop:
        return 
    for d in pdict:
        pwd = pwd[:i-1] + d
        if i < loop:
            redict(zfile,loop)
            i -= 1
        else :              #创建线程去执行测试密码的函数,加快破译速度
            t = threading.Thread(target=dictPass,args=(zfile,pwd))
            t.start()
            t.join()


def extract():
    
    zfile = zipfile.ZipFile("exfile.zip")       #定义需破解文件
    
    start_time = datetime.datetime.now()
    print("Start Time: {}".format(start_time))

    for pnum in range(1,11):                    #定义破解的密码位数
        global loop,i,pwd
        pwd = '0'
        i = 0
        redict(zfile,pnum)
        if flag:
            break
        
    endtime = datetime.datetime.now()
    
    print ("Start Time: {}".format(start_time)) #打印整个过程的时间
    print ("End   Time: %s" % endtime)
    print ("Spend Time: %s" %((endtime - start_time)))
    print ("Press Enter to exit !")
    m = input()
            
if __name__ == '__main__':
    extract()

测试结果截图:
在这里插入图片描述
在这里插入图片描述
文件解压成功
在这里插入图片描述
我测试的文件有10M,然后用zfile.extractall方法解压文件会特别慢,所以整个解压过程也相对较慢,这个也和电脑配置有关系,自己测试应该有1s100条以上的速度(本人的垃圾笔记本配置如下)
在这里插入图片描述

我的密码字典只有数字,如果加上字母再加标点符号,就可以破解全字符的密码了,但是这个速度…

下面是我自己研究的思路

2.随机密码生成方法

2.1 permutations方法

这个是我最开始想到的方法,直接排列组合
import itertools

def test():
    letters = "1234"
    pList = list(itertools.permutations(letters,3))
    for p in pList:
        p = ''.join(p)
        print(p)

if __name__ == '__main__':
    test()

在这里插入图片描述

用该方法来生成随机密码,唯一的问题就是所有的重复的都无法实现,例如112,113,224…,所以我就没有使用该方法了

2.2 random取随机数方法

import random

def test():
    letters = "1234"
    p = str()
    while p != '123':
        p = ''
        for i in range(3):
            p += random.choice(letters)
        print(p)
        
if __name__ == '__main__':
    test()

这个方法可以在规定的集合里面随机取出数字
在这里插入图片描述
似乎一下子就找到密码了,但是在次尝试一下呢?
在这里插入图片描述
由于是全随机,所以有一定的巧合性,可能一次直接找到密码,如果你是欧皇,那我推荐你直接用这个方法,说不定一次就成功了XD

但是由于我是非酋,所以我选择权不列举出来ToT

2.3 递归全排列(可重复)方法

global pwd,pdict
pwd = ''
pdict = '123'

def test():
    global pwd,pdict
    for a in pdict:
        pwd += a
        for b in pdict:
            pwd += b
            for c in pdict:
                pwd += c
                print(pwd)
                pwd = pwd[:-1]
            pwd = pwd[:-1]
        pwd = pwd[:-1]
        
if __name__ == '__main__':
    test()

在这里插入图片描述
这里是用循环嵌套来写的,结果集确实是我们想要的,但是我们无法轻松的改变需要循环的次数,所以我把这个方法改成了递归,如下:
(其实是我逻辑能力不太行,不能一口气写出递归orz,小声bb)

global i,loop,pwd,pdict
i = 0
loop = 1		#改变loop次数即可改变我们循环的次数
pwd = ''
pdict = '123'

def test():
    global i,pdict,pwd,loop
    i += 1
    if i>loop:
        return 
    for d in pdict:
        pwd = pwd[:i-1] + d
        if i < loop:
            test()
            i -= 1
        else :
            print(pwd)
        
if __name__ == '__main__':
    test()

在这里插入图片描述
在这里插入图片描述
然后就大功告成 !

本人没有python知识可能连入门都算不上,没有系统学习过,各路大神轻喷(瑟瑟发抖)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值