📜  如何在Python暴力破解 ZIP 文件密码?

📅  最后修改于: 2022-05-13 01:55:21.523000             🧑  作者: Mango

如何在Python暴力破解 ZIP 文件密码?

在本文中,我们将看到一个Python程序,该程序将使用暴力破解方法破解 zip 文件的密码。

ZIP 文件格式是一种常见的存档和压缩标准。它用于压缩文件。有时,压缩文件是保密的,所有者不想让每个人都可以访问。因此,zip 文件受密码保护。如果密码是通用的,那么它很容易被破解。在这里,我们将使用蛮力方法来破解 zip 文件的密码。

蛮力方法是使用一组预定义值来破解密码直到成功的方法。这基本上是一种“命中和尝试”方法。如果值集很高,这种方法可能需要很长时间,但它的成功率很高。值的数量越多,破解密码的机会就越大。在这里,我们将使用大小为 133 MB 的“rockyou”文本文件和超过 1400 万组密码来尝试。在此处下载文本文件。

方法:

  • 首先,导入 zipfile 模块。
  • 初始化 ZipFile 对象,这有助于提取 zip 文件的内容。
  • 计算“rockyou.txt”文件中出现的单词数并将其显示在终端上。
  • 调用“crack_password”函数,如果找到密码则返回true,否则返回false。将文本文件的名称和 ZipFile 对象作为参数传递。
  • idx 变量用于跟踪行号。
  • 以“rb”模式打开文本文件“rockyou.txt”,以二进制形式处理文件内容。这是因为文件包含一些特殊符号,如果文件以“r”模式打开,则无法处理这些特殊符号,并且会生成UnicodeDecodeError
  • 打开文件后,从文件中提取该行,然后从中拆分单词。
  • 在 try 块中,通过将密码提供给 extractall 方法的 pwd 字段来提取 zip 文件的内容。 extractall()方法会将 zip 文件的所有内容提取到当前工作目录。上面的程序在与这个Python脚本相同的目录中提取了一个名为“gfg.zip”的zip文件。
  • 如果密码不正确,则会产生异常。在 except 块中,继续循环以检查文件中的其他单词。
  • 如果找到密码返回真否则最后返回假并显示所需的消息。

下面是完整的实现:



Python3
import zipfile
  
  
def crack_password(password_list, obj):
    # tracking line no. at which password is found
    idx = 0
  
    # open file in read byte mode only as "rockyou.txt"
    # file contains some special characters and hence
    # UnicodeDecodeError will be generated
    with open(password_list, 'rb') as file:
        for line in file:
            for word in line.split():
                try:
                    idx += 1
                    obj.extractall(pwd=word)
                    print("Password found at line", idx)
                    print("Password is", word.decode())
                    return True
                except:
                    continue
    return False
  
  
password_list = "rockyou.txt"
  
zip_file = "gfg.zip"
  
# ZipFile object initialised
obj = zipfile.ZipFile(zip_file)
  
# count of number of words present in file
cnt = len(list(open(password_list, "rb")))
  
print("There are total", cnt,
      "number of passwords to test")
  
if crack_password(password_list, obj) == False:
    print("Password not found in this file")


输出: