如何生成用于破解zip文件的密码文件?

时间:2019-07-13 16:14:37

标签: python hash zipfile

我有一个关于使用python破解zip文件密码的任务。这不是不道德或非法的破解项目,而是学校的任务。我想问一下如何生成密码并一步一步地进行测试?即首先生成密码“ 0”,然后测试ingit,如果未成功破解,则将生成第二个密码“ 1”并再次进行测试。

我有一些代码,但是问题是它只在生成大量密码后才开始破解zip文件。例如,我将其设置为从'0000'到'9999'生成,当我运行代码时,它将生成从'0000'到'9999'的所有密码,然后它将开始破解zip文件。

这是我的代码:

import zipfile
from datetime import datetime
from itertools import product
import itertools  


str_09 = "0123456789"

file_pwd = 'password/pwd-str_09-8.txt'
mystring = str_09

myfile = open(file_pwd, 'w')
for a in range(1,6):
  for i in itertools.product(mystring, repeat=a):
    myfile.write("%s\n" % ''.join(map(str, i)))
myfile.close()

file_pwd = 'password/pwd-str_09-8.txt'
zip_file_created_a = 'file/a5.zip'

count = 1

with open(file_pwd,'rb') as text:
        for entry in text.readlines():
            password = entry.strip()
            try:
                with zipfile.ZipFile(zip_file_created_a,'r') as zf:
                    zf.extractall(pwd=password)
                    data = zf.namelist()[0]
                    data_size = zf.getinfo(data).file_size
                    print('''******************************\n[+] Password found! ~ %s\n ~%s\n ~%s\n******************************''' 
                        % (password.decode('utf8'), data, data_size))
                    break

            except:
                number = count
                print('[%s] [-] Password failed! - %s' % (number,password.decode('utf8')))
                count += 1
                pass


1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解该请求,但是您可以做的一件事(如另一篇评论所述)是使用生成器。首先,您不需要生成密码文件,可以在生成每个密码时对其进行测试。为此,您可以从发电机中产生收益。调整您的代码,我们有:

  1 import itertools                                                               
  2                                                                                
  3 def password_generator(min_length=1, max_length=6, chars='123456789'):         
  4     for i in range(min_length, max_length):                                    
  5         for password in itertools.product(chars, repeat=i):                    
  6             yield ''.join(password)                                            
  7                                                                                
  8 # Showing a sample of passowrds.                                               
  9 for _, password in zip(range(100), password_generator()):                      
 10     print(password)                                                            
 11                                                                                
 12 is_successful_extraction = False                                               
 13                                                                                
 14 for password in password_generator():                                          
 15     try:                                                                       
 16         with zipfile.ZipFile(zip_file_created_a,'r') as zf:
 17             zf.extractall(pwd=password)
 18             data = zf.namelist()[0]
 19             data_size = zf.getinfo(data).file_size
 20         print('[+] Extracted - password: {}'.format(password))                 
 21         is_successful_extraction = True                                        
 22         break                                                                  
 23     except RuntimeError:                                                       
 24         print('[-] Failure to extract - password: {}'.format(password))        
 25                                                                                
 26 if is_successful_extraction:                                                   
 27     print('[+] Successful extraction')                                         
 28 else:                                                                          
 29     print('[!] No extraction complete') 

这很有帮助,原因有很多。首先,生成器具有参数,因此您可以调整生成密码的长度。接下来,您不必将所有密码都存储在内存或磁盘中。应该快一点。请注意,readlines将文件的内容存储在RAM中。最后,您只需要遍历一次密码-即在生成密码时。

有关生成器的更多信息,请参阅此link

相关问题