【问题标题】:How to generate a password file to crack the zip file?如何生成密码文件来破解 zip 文件?
【发布时间】:2019-07-17 10:31:26
【问题描述】:

我有一个关于使用 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


【问题讨论】:

  • 我正在使用手机,无法输入答案,但解决此问题的一种方法是将text.readlines() 替换为generator
  • 嗨@AndrewF 如何用生成器函数替换text.readlines()?我已经通过了生成器功能,但仍然无法弄清楚。

标签: python hash zip


【解决方案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

【讨论】:

  • 嗨@DasHund 感谢您的回答!非常感谢!!我可以知道# Run your extraction here. If it fails, it will throw a runtime error. See the source for additional details.此评论中需要添加哪些代码吗?
  • 已更新并将您的代码放入其中。值得注意的是,没有尝试运行它。
  • 我尝试在评论部分插入这些代码z = zipfile.ZipFile(r"C:/Users/tcc/Desktop/zip file cracker/input/a2.zip", 'r')z.extractall(r"C:/Users/tcc/Desktop/zip file cracker/output", pwd=password.encode())z.close,它成功破解了zip文件,但奇怪的是,它只能破解2位数的密码'00',如果密码多于2位像'000',会显示zlib.error: Error -3 while decompressing data: invalid code lengths set,我不明白是什么问题,我的密码有什么问题吗?
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多