【代码】Python|Windows 批量尝试密码去打开加密的 Word 文档(docx和doc)

文章目录

    • 前言
    • 完整代码
    • 代码解释
      • [1. msoffcrypto 方法(用于解密 .docx 文件)](#1. msoffcrypto 方法(用于解密 .docx 文件))
        • [read_secret_word_file 函数](#read_secret_word_file 函数)
        • 密码生成与解密尝试
        • [try_decrypt_file 函数](#try_decrypt_file 函数)
      • [2. comtypes 方法(用于解密 .doc 文件)](#2. comtypes 方法(用于解密 .doc 文件))
        • [read_secret_word_file 函数](#read_secret_word_file 函数)
        • 注意事项
      • 总结
    • 结语

前言

加密永远只能拦住自己啊啊啊啊!我又忘记密码了但是我超级多可能的密码。

于是我试图自动化尝试。

完整代码

为了避免浪费大家的时间,我这里先贴上完整的代码,代码分段解释附在文末。

Github

顺手也扔Github上了,链接是:shandianchengzi/windows_word_decrypt: 这个仓库用Python对word文档进行解密,适用于实在想不起来密码准备乱试的人。

docx

本代码来源于 GPT,msoffcrypto-tool 这个工具不能用来解密 doc,只能解密 docx。

安装:

bash 复制代码
pip install msoffcrypto-tool

完整代码:

python 复制代码
import msoffcrypto
from io import BytesIO
import logging

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def read_secret_word_file(file_path, password):
    """
    解密加密的 Word 文件并返回解密的内容。
    
    :param file_path: 加密的 Word 文件路径
    :param password: 用于解密的密码
    :return: None
    """
    try:
        with open(file_path, 'rb') as encrypted_file:
            # 使用 msoffcrypto 解密
            office_file = msoffcrypto.OfficeFile(encrypted_file)
            office_file.load_key(password=password)  # 提供密码
            
            # 尝试解密文件
            decrypted_content = BytesIO()
            office_file.decrypt(decrypted_content)
            logging.info(f"成功解密文件,密码是: {password}")
            return decrypted_content.getvalue()
    except Exception as e:
        logging.error(f"解密失败,密码错误: {password}, 错误信息: {e}")
        raise

def generate_passwords(try_words):
    """
    根据给定的单词列表生成所有可能的密码组合。
    
    :param try_words: 用于生成密码的单词列表
    :return: 密码列表
    """
    try_passwd = []
    for i in range(1, 4):
        for j in range(0, len(try_words)):
            for k in range(0, len(try_words)):
                for l in range(0, len(try_words)):
                    passwd = try_words[j]
                    if i > 1:
                        passwd += try_words[k]
                    if i > 2:
                        passwd += try_words[l]
                    try_passwd.append(passwd)
    
    # 去重并返回
    return list(set(try_passwd))

def try_decrypt_file(file_path, try_words, result_path):
    """
    尝试使用不同的密码解密文件并记录结果。
    
    :param file_path: 加密的 Word 文件路径
    :param try_words: 密码候选词列表
    :param result_path: 结果输出文件路径
    """
    # 生成密码列表
    try_passwd = generate_passwords(try_words)

    # 清空结果文件
    with open(result_path, "w", encoding="utf-8") as f:
        f.write("")

    # 尝试每个密码
    for passwd in try_passwd:
        try:
            decrypted_content = read_secret_word_file(file_path, passwd)
            # 如果解密成功,写入结果并退出
            with open(result_path, "a") as f:
                f.write(f"{passwd} 密码正确\n")
            break
        except Exception as e:
            # 如果解密失败,记录错误并继续尝试
            with open(result_path, "a", encoding="utf-8") as f:
                f.write(f"{passwd} 密码错误,尝试下一个密码: {e}\n")

# 使用示例
if __name__ == "__main__":
    try_words = ["password", "1234", "qwerty"]  # 自定义密码尝试词
    file_path = "secret.docx" # 加密的 Word 文件路径
    result_path = "result.txt"

    try_decrypt_file(file_path, try_words, result_path)

doc

本代码所使用的库的灵感来源于Python在Linux,Windows上打开有密doc,docx文件(密码已知)_python 读取有密码的docx-CSDN博客,代码由GPT生成。

这个可以用来打开docx和doc,但是速度比上一个慢非常多。并且,需要注意的是,用这个代码之前需要先把word这个软件打开 ,打开就行不用管打开了具体什么文件,不打开任何文件都行,只要word这个软件打开就行。不然会提示"RPC 服务器不可用"

安装:

bash 复制代码
pip install comtypes

完整代码:

python 复制代码
import os
import logging
from comtypes.client import CreateObject

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def read_secret_word_file(filename, password):
    """
    使用指定的密码打开加密的 Word 文件。
    
    :param filename: 加密的 Word 文件路径
    :param password: 用于解密的密码
    :return: None
    """
    try:
        # 启动 Word 应用程序
        word = CreateObject('Word.Application')
        word.Visible = False  # 设置为不可见
        
        # 打开加密的 Word 文件
        doc = word.Documents.Open(filename, PasswordDocument=password)
        logging.info(f"成功解密文件,密码是: {password}")
        doc.Close()
    except Exception as e:
        logging.error(f"解密失败,密码错误: {password}, 错误信息: {e}")
        raise

def generate_passwords(try_words):
    """
    根据给定的单词列表生成所有可能的密码组合。
    
    :param try_words: 用于生成密码的单词列表
    :return: 密码列表
    """
    try_passwd = []
    for i in range(1, 4):
        for j in range(0, len(try_words)):
            for k in range(0, len(try_words)):
                for l in range(0, len(try_words)):
                    passwd = try_words[j]
                    if i > 1:
                        passwd += try_words[k]
                    if i > 2:
                        passwd += try_words[l]
                    try_passwd.append(passwd)
    
    # 去重并返回
    return list(set(try_passwd))

def try_decrypt_file(file_path, try_words, result_path):
    """
    尝试使用不同的密码解密文件并记录结果。
    
    :param file_path: 加密的 Word 文件路径
    :param try_words: 密码候选词列表
    :param result_path: 结果输出文件路径
    """
    # 生成密码列表
    try_passwd = generate_passwords(try_words)

    # 清空结果文件
    with open(result_path, "w") as f:
        f.write("")

    # 尝试每个密码
    for passwd in try_passwd:
        try:
            read_secret_word_file(file_path, passwd)
            # 如果解密成功,写入结果并退出
            with open(result_path, "a") as f:
                f.write(f"{passwd} 密码正确\n")
            break
        except Exception as e:
            # 如果解密失败,记录错误并继续尝试
            with open(result_path, "a") as f:
                f.write(f"{passwd} 密码错误,尝试下一个密码: {e}\n")

# 使用示例
if __name__ == "__main__":
    try_words = ["password", "1234", "qwerty"]  # 自定义密码尝试词
    file_path = "secret.doc"  # 加密的文件路径
    result_path = "result.txt"  # 结果文件路径

    # 将文件路径转换为绝对路径
    file_path = os.path.abspath(file_path)
    logging.info(f"使用的文件路径是: {file_path}")

    try_decrypt_file(file_path, try_words, result_path)

代码解释

本部分将详细解释上文中提到的两种解密方法的代码,尤其是 read_secret_word_file 函数的实现,以及它们如何应用于解密加密的 Word 文件。

1. msoffcrypto 方法(用于解密 .docx 文件)

read_secret_word_file 函数
python 复制代码
def read_secret_word_file(file_path, password):
    """
    解密加密的 Word 文件并返回解密的内容。
    
    :param file_path: 加密的 Word 文件路径
    :param password: 用于解密的密码
    :return: None
    """
    try:
        with open(file_path, 'rb') as encrypted_file:
            # 使用 msoffcrypto 解密
            office_file = msoffcrypto.OfficeFile(encrypted_file)
            office_file.load_key(password=password)  # 提供密码
            
            # 尝试解密文件
            decrypted_content = BytesIO()
            office_file.decrypt(decrypted_content)
            logging.info(f"成功解密文件,密码是: {password}")
            return decrypted_content.getvalue()
    except Exception as e:
        logging.error(f"解密失败,密码错误: {password}, 错误信息: {e}")
        raise

该函数的目的是通过 msoffcrypto 库来解密加密的 .docx 文件。下面是主要步骤的解释:

  1. 打开加密文件

    • with open(file_path, 'rb') as encrypted_file 以二进制模式打开指定的加密 Word 文件。
  2. 解密操作

    • 使用 msoffcrypto.OfficeFile 类加载加密文件,并通过 office_file.load_key(password=password) 提供密码。
    • 然后,调用 office_file.decrypt(decrypted_content) 解密文件,将解密后的内容保存在 decrypted_content 中。
  3. 返回解密内容

    • 解密后的内容通过 decrypted_content.getvalue() 返回,以字节流的形式保存解密结果。
  4. 异常处理

    • 如果密码错误或其他问题导致解密失败,代码会捕捉异常并记录错误信息。
密码生成与解密尝试
python 复制代码
def generate_passwords(try_words):
    """
    根据给定的单词列表生成所有可能的密码组合。
    
    :param try_words: 用于生成密码的单词列表
    :return: 密码列表
    """
    try_passwd = []
    for i in range(1, 4):
        for j in range(0, len(try_words)):
            for k in range(0, len(try_words)):
                for l in range(0, len(try_words)):
                    passwd = try_words[j]
                    if i > 1:
                        passwd += try_words[k]
                    if i > 2:
                        passwd += try_words[l]
                    try_passwd.append(passwd)
    
    # 去重并返回
    return list(set(try_passwd))

这段代码通过组合给定的单词列表(try_words)生成可能的密码组合,生成的密码会用于解密文件。

  • 代码使用三重嵌套循环,生成从 1 到 3 个单词组合的密码,并将所有组合保存到 try_passwd 列表中。
  • list(set(try_passwd)) 语句去除了重复的密码组合。
try_decrypt_file 函数
python 复制代码
def try_decrypt_file(file_path, try_words, result_path):
    """
    尝试使用不同的密码解密文件并记录结果。
    
    :param file_path: 加密的 Word 文件路径
    :param try_words: 密码候选词列表
    :param result_path: 结果输出文件路径
    """
    # 生成密码列表
    try_passwd = generate_passwords(try_words)

    # 清空结果文件
    with open(result_path, "w", encoding="utf-8") as f:
        f.write("")

    # 尝试每个密码
    for passwd in try_passwd:
        try:
            decrypted_content = read_secret_word_file(file_path, passwd)
            # 如果解密成功,写入结果并退出
            with open(result_path, "a") as f:
                f.write(f"{passwd} 密码正确\n")
            break
        except Exception as e:
            # 如果解密失败,记录错误并继续尝试
            with open(result_path, "a", encoding="utf-8") as f:
                f.write(f"{passwd} 密码错误,尝试下一个密码: {e}\n")

在此函数中,我们尝试使用多个密码解密文件:

  1. 密码生成 :调用 generate_passwords 函数生成候选密码列表。
  2. 清空结果文件:每次尝试解密时,都会清空之前的结果,并准备记录新的解密结果。
  3. 尝试解密 :遍历每个生成的密码,并调用 read_secret_word_file 函数解密文件。如果密码正确,则记录并退出。
  4. 失败记录:如果解密失败,记录失败的密码和错误信息,并继续尝试下一个密码。

2. comtypes 方法(用于解密 .doc 文件)

对于 .doc 文件(较旧的 Word 格式),使用了 comtypes 库,方法与 .docx 文件的解密略有不同。这个方法依赖于本地安装的 Microsoft Word,并且需要 Word 程序处于运行状态。

read_secret_word_file 函数
python 复制代码
def read_secret_word_file(filename, password):
    """
    使用指定的密码打开加密的 Word 文件。
    
    :param filename: 加密的 Word 文件路径
    :param password: 用于解密的密码
    :return: None
    """
    try:
        # 启动 Word 应用程序
        word = CreateObject('Word.Application')
        word.Visible = False  # 设置为不可见
        
        # 打开加密的 Word 文件
        doc = word.Documents.Open(filename, PasswordDocument=password)
        logging.info(f"成功解密文件,密码是: {password}")
        doc.Close()
    except Exception as e:
        logging.error(f"解密失败,密码错误: {password}, 错误信息: {e}")
        raise

此方法依赖 comtypes 调用本地安装的 Word 应用程序:

  1. 启动 Word 应用程序 :通过 CreateObject('Word.Application') 启动 Word。
  2. 打开文件 :调用 word.Documents.Open(filename, PasswordDocument=password) 使用提供的密码打开加密的 .doc 文件。
  3. 成功解密:如果密码正确,解密的文件会被打开,解密后关闭文件。
  4. 错误处理:如果密码错误或其他问题发生,会捕捉异常并记录错误信息。
注意事项
  • 在使用此方法时,必须确保 Microsoft Word 已经启动。否则,会出现 "RPC 服务器不可用" 的错误提示。
  • 本方法相对于 msoffcrypto 库,解密速度较慢,因此推荐使用 msoffcrypto 来解密 .docx 文件。

总结

  • msoffcrypto 方法 适用于 .docx 文件,操作简便且解密速度较快。
  • comtypes 方法 适用于 .doc 文件,解密时依赖于本地 Word 应用程序,并且速度较慢。

通过这两种方法,你可以轻松尝试破解已加密的 Word 文件,前提是你知道文件的某些潜在密码并准备进行密码破解。

结语

令人感到悲伤的是,我尝试了几千个密码都没有成功,我电脑都卡死重启了,于是我准备重做我的文档。

然后我开始在电脑里搜索文档的历史存档,搜到目录的那一瞬间,我想起来了一切qwq

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/144888638。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

相关推荐
傲笑风3 小时前
【openvino】tinybert基于openvino服务化部署(四)
人工智能·python·自然语言处理·nlp·bert·openvino
维基框架4 小时前
WIKI 知识库 v1.1.1 正式发布
人工智能·python
谢白羽8 小时前
SGLang的AWQ量化笔记
笔记·python·sglang
jyOverQ8 小时前
ChatGPT Windows 客户端点击无反应、有进程却没窗口?一次 MSIX 非系统盘启动卡死的完整排查
windows·chatgpt
迷迭香yy8 小时前
基金档案数据工程实战从收入分析到持仓穿透的Python解析 IG50免费开源股票数据API接口
开发语言·python
清水白石0088 小时前
Python 类型设计深度解析:TypedDict 能否替代 dataclass?从 JSON 数据边界到 API 设计的最佳实践
java·python·json
️学习的小王9 小时前
Git项目提交忽略文件怎么做?以Python项目为例,详解.gitignore
git·python·elasticsearch
前端 贾公子9 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
evans在进步9 小时前
Java 常用设计模式入门:建造者、工厂、单例、外观与代理
java·python·设计模式
统计学小王子9 小时前
数学建模国赛倒计时8天——《搭建建模Word框架(字体字号)》
数学建模·word