我用Python打开了女朋友的加密压缩包
📣 概况
女朋友的压缩包密码忘记了,在她说明是6位数的某一个日期后,我决定帮她打开,毕竟我也想看看加密的压缩包里面是什么图片。
关键字:多进程 产消模型
首先我们需要生成一个密码库,已知密码是6位数的纯数字,即000000-999999。这就简单了。上代码:
#生成从000000到99999的密码表
f = open('passdict.txt','w')
for id in range(1000000):
password = str(id).zfill(6)+'\n'
f.write(password)
f.close()
这样就生成一个名为passdict的文本密码库了。
没想到这密码库竟然有7.62MB这么大。
接下来就可以逐个尝试了,当然不是手动一个个尝试啦,让程序帮我们逐个尝试。
import zipfile
import time
def extractFile(zipFile, password):
try:
zipFile.extractall(pwd=bytes(password, "utf8"))
print("压缩包密码是" + password) # 破解成功
t = True
return t
except:
print("尝试" + password + "失败")
def main():
t1 = time.time()
zipFile = zipfile.ZipFile('compression.zip')
PwdLists = open('passdict.txt') # 读入所有密码
for line in PwdLists.readlines(): # 挨个挨个的写入密码
Pwd = line.strip('\n')
if extractFile(zipFile, Pwd):
break
t2 = time.time()
print("总耗时:{}".format(str(t2-t1)))
if __name__ == '__main__':
main()
找呀找呀!!!!
通过程序,我最终找到了压缩包的密码,
是141012,应该是她在14年10月14日建的压缩包图片。
不过竟然花费了将近405秒图片,这怎么能忍。
可以尝试一下生产者与消费者的模型和多进程实现。
生产者:通过读取密码,分别put进队列中,代码如下:
# 创建生产者
def producer(q):
pwdLists = open('passdict.txt')
for line in pwdLists.readlines(): # 挨个挨个的写入密码
pwd = line.strip('\n')
q.put(pwd)
消费者:通过队列获取密码,然后尝试解密,代码如下:
# 创建消费者,消费者一般是个死循环,要一直监听是否有需要处理的信息。
def customer(q, num, t1):
time.sleep(1)
while 1:
if num.value == 1:
t2 = time.time()
print("总耗时:{}秒".format(str(t2-t1.value)))
break
pwd = q.get() # 收消息
extractFile(pwd, num)
def extractFile(password, num):
zipFile = zipfile.ZipFile('compression.zip')
try:
zipFile.extractall(pwd=bytes(password, "utf8"))
print("成功!女朋友的压缩包密码是" + password) # 破解成功
num.value = 1
except:
print("尝试" + password + "失败")
在这里,我使用了生产者与消费者的模型,通过多进程的方式可以更快速的进行尝试。
方案优化后只花费了298秒就找到了。
完整代码公众号回复“压缩包”获取。