python全排列(可重复)以及暴力破解zip
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python全排列(可重复)以及暴力破解zip,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3745字,纯文字阅读大概需要6分钟。
内容图文
目录
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知识可能连入门都算不上,没有系统学习过,各路大神轻喷(瑟瑟发抖)
内容总结
以上是互联网集市为您收集整理的python全排列(可重复)以及暴力破解zip全部内容,希望文章能够帮你解决python全排列(可重复)以及暴力破解zip所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。