首页 > 系统相关 >【代码】Python|Windows 批量尝试密码去打开加密的 Word 文档(docx和doc)

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

时间:2025-01-02 19:27:31浏览次数:8  
标签:docx Python doc 解密 try 密码 passwd file path

文章目录

前言

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

于是我试图自动化尝试。

完整代码

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

Github

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

docx

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

安装:

pip install msoffcrypto-tool

完整代码:

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 服务器不可用”

安装:

pip install comtypes

完整代码:

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 函数
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. 异常处理

    • 如果密码错误或其他问题导致解密失败,代码会捕捉异常并记录错误信息。
密码生成与解密尝试
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 函数
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 函数
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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

标签:docx,Python,doc,解密,try,密码,passwd,file,path
From: https://blog.csdn.net/qq_46106285/article/details/144888638

相关文章

  • python中常用的内置函数介绍
    python中常用的内置函数介绍1.print()2.len()3.type()4.str(),int(),float()5.list(),tuple(),set(),dict()6.range()7.sum()8.max(),min()9.sorted()10.zip()11.enumerate()12.map()13.filter()14.any(),all()15.abs()16.pow()17.round()18.or......
  • python文件操作相关(excel)
    python文件操作相关(excel)1.openpyxl库openpyxl其他用法创建与删除操作单元格追加数据格式化单元格合并单元格插入图片公式打印设置保护工作表其他功能2.pandas库3.xlrd和xlwt库4.xlsxwriter库5.pyxlsb库应用场景参考资料在Python中,操作Excel文件通......
  • docker基本概念,docker镜像管理,docker命令
    docker基本概念镜像管理docker命令一.docker 1.基本概念 (1)docker:能够将程序和环境进行打包的工具 (2)容器:自带独立运行环境的特殊进程 (3)镜像:镜像可以被理解为一个模板,通过这个模板可以实例化出很多容器,包含容器所需的所有文件和配置信息. (4)仓库:用来存储......
  • DL00681-基于YOLO算法的山体滑坡检测python含数据集
    山体滑坡是常见的自然灾害之一,尤其在多雨或地震活动频繁的地区,滑坡的发生往往会对人类生命财产造成严重威胁。传统的山体滑坡监测方法依赖人工巡查、地质勘探以及静态监测设备,这些手段不仅周期长、成本高,而且难以实现对滑坡灾害的及时预警。随着遥感技术和计算机视觉技术的进步,基......
  • Python爬虫获取股市数据,有哪些常用方法?
    Python股票接口实现查询账户,提交订单,自动交易(1)Python股票程序交易接口查账,提交订单,自动交易(2)股票量化,Python炒股,CSDN交流社区>>>网页直接抓取法Python中有许多库可用于解析HTML页面来获取股市数据。例如BeautifulSoup,它能够轻松地从网页的HTML结构中提取出想要的数据......
  • 基于Python+Django的网上银行综合管理系统设计与实现(毕业设计/课程设计源码+论文+部署
    文章目录前言详细视频演示项目运行截图技术框架后端采用Django框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • 基于Python的教师职业发展与晋升平台设计与实现(毕业设计/课程设计源码+论文+部署)
    文章目录前言详细视频演示项目运行截图技术框架后端采用Django框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • python 时间库之pendulum
    Pendulum:掌握时间的艺术,让Python日期时间操作不再复杂第一部分:背景介绍在Python开发中,处理日期和时间是一个常见但复杂的任务。datetime模块虽然功能强大,但使用起来不够直观。Pendulum库的出现,就是为了简化这一过程,它提供了更人性化的API来处理日期和时间。第二部分:Pendulum......
  • 【python】词云wordcloud
    参考链接知乎:Python库——词云库Wordcloud(附源码):由浅入深知乎:ython生成词云图太简单了|拿来就用能的Python词云图代码:进阶【Python】生成词云图太简单了|拿来就用能的词云图代码:辅助参考使用Python绘制词云图的详细教程:辅助参考csdn使用Python绘制词云图的详细教程TB......
  • Python 3 安装与环境配置完整教程
    Python3安装与环境配置完整教程Python是一门强大且易学的编程语言,广泛应用于数据分析、人工智能、Web开发等领域。如果你打算在Windows系统中使用Python3,本教程将详细指导你如何完成Python3的下载、安装以及环境变量的配置。......