实验的知识点铺垫请见:python暴力破解加密的压缩文件(一)
一、实验目的
应用Python程序设计语言的相关知识,对加密的压缩文件进行破解。
二、实验内容
- 任务1:定义一个函数,函数带有一个参数L(类型为整数),函数返回一个长度为L、包含大小写字母和数字的随机密码(类型为字符串)。
- 任务2:定义一个函数,函数带有一个参数(类型为字符串,表示一个密码),函数判断密码是否符合要求:8 位以上,包含英文大小写字母、数字。如果符合要求,返回True;否则返回False。
- 任务 3:定义一个函数,函数带有两个参数,一个是要解压的文件路径,一个是解压密码。如果解压成功则返回True;否则返回False。
三、实验环境
Python 3.6及以上版本
四、实验原理和步骤
-
在任务1中,可以借助random中的choice,以及string库中的ascii_letters;至少用3个不同的长度测试函数的返回值。
-
在任务2中,如果想尝试更简洁的代码,可以考虑使用re模块;测试用例可以参考以下8组:
测试用例 输入 输出
示例1 13t11jtk False
示例2 12345678901 False
示例3 3aA245362 True
示例4 123t2lASDJ True
示例5 password False
示例6 Avbw23r9gfs True
示例7 23523523613 False
示例8 AJFQWEFQWFK False -
在任务3中,打开压缩文件可以借助模块zipfile中的ZipFile。
五、实验代码及运行结果
1、任务一:按要求生成随机密码
#生成随机密码
def get_cipher(L):
chars = string.ascii_letters + string.digits
s = [random.choice(chars) for i in range(L)]
return '{0}'.format(''.join(s)) #返回一个长度为L、包含大小写字母和数字的随机密码(类型为字符串)
print(get_cipher(9))
输出测试:
测试正确!
2、任务二:判断密码是否符合要求
#判断密码是否符合要求
def judge(string):
if(len(string) < 8): #8位以上
return False
else: #包含英文大小写字母、数字
capital_letter = re.search('[A-Z]',string)
small_letter = re.search('[a-z]',string)
digit = re.search('[0-9]',string)
if capital_letter != None and small_letter != None and digit != None:
return True
else:
return False
list1 = ["13t11jtk","12345678901","3aA245362","123t2lASDJ","password","Avbw23r9gfs","23523523613","AJFQWEFQWFK"]
for i in list1:
print(judge(i))
输出测试:
测试正确!
3、任务三:暴力破解加密的压缩文件
说明:考虑到时间和空间成本,这里仅以4位的纯数字密码为例
代码:
#暴力解压文件
def get_cipher_prue_digit(L):
chars = string.digits
s = [random.choice(chars) for i in range(L)]
return '{0}'.format(''.join(s))
def violent_unzip(p, cipher):
zip = zipfile.ZipFile(p,'r')
try:
zip.extractall(pwd=str.encode(cipher))
print("解压成功!密码为:"+cipher)
zip.close()
return True
except:
print("error!密码为:"+cipher)
return False
while(not (violent_unzip(r"E:\text\violent_unzip_text.zip",cipher=get_cipher_prue_digit(4)))) :
cipher=get_cipher_prue_digit(4)
运行结果:
(10s左右)
六、源代码
import random, string
import re
import zipfile
#生成随机密码
def get_cipher(L):
chars = string.ascii_letters + string.digits
s = [random.choice(chars) for i in range(L)]
return '{0}'.format(''.join(s)) #返回一个长度为L、包含大小写字母和数字的随机密码(类型为字符串)
# print(get_cipher(9))
#判断密码是否符合要求
def judge(string):
if(len(string) < 8): #8位以上
return False
else: #包含英文大小写字母、数字
capital_letter = re.search('[A-Z]',string)
small_letter = re.search('[a-z]',string)
digit = re.search('[0-9]',string)
if capital_letter != None and small_letter != None and digit != None:
return True
else:
return False
# list1 = ["13t11jtk","12345678901","3aA245362","123t2lASDJ","password","Avbw23r9gfs","23523523613","AJFQWEFQWFK"]
# for i in list1:
# print(judge(i))
#暴力解压文件
def get_cipher_prue_digit(L):
chars = string.digits
s = [random.choice(chars) for i in range(L)]
return '{0}'.format(''.join(s))
def violent_unzip(p, cipher):
zip = zipfile.ZipFile(p,'r')
try:
zip.extractall(pwd=str.encode(cipher))
print("解压成功!密码为:"+cipher)
zip.close()
return True
except:
print("error!密码为:"+cipher)
return False
while(not (violent_unzip(r"E:\text\violent_unzip_text.zip",cipher=get_cipher_prue_digit(4)))) :
cipher=get_cipher_prue_digit(4)