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

文章目录

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

前言

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

于是我试图自动化尝试。

完整代码

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

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}")raisedef 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")breakexcept 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}")raisedef 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")breakexcept 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")breakexcept 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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

职场常用Excel基础04-二维表转换

大家好,今天和大家一起分享一下excel的二维表转换相关内容~ 在Excel中,二维表(也称为矩阵或表格)是一种组织数据的方式,其中数据按照行和列的格式进行排列。然而,在实际的数据分析过程中,我们常…

python-redis访问指南

Redis(Remote Dictionary Server)是一种开源的内存数据结构存储,可用作数据库、缓存和消息代理。它功能强大且灵活,可根据需求调整架构和配置,以高性能、简单易用、支持多种数据结构而闻名,广泛应用于各种场…

MySQL锁的概念

锁的基本概念 锁在 MySQL 中是一种并发控制机制,它确保在多用户或多事务环境下数据的完整性和一致性。当多个事务同时访问和操作数据库中的数据时,为了防止数据出现不一致、丢失更新、脏读、不可重复读和幻读等问题,就需要使用锁来协调这些事…

Java-多种方法实现多线程卖票

Java多线程卖票是一个经典的并发编程问题,它展示了如何在多个线程之间安全地共享和修改资 源。以下是几种实现方式: 使用synchronized关键字: 使用synchronized修饰符来同步方法或代码块,确保同一时刻只有一个线程可以访问临界区(即操 作共享资源的代码)。 使用Reen…

Px4 V2.4.8飞控Mavlink命令控制说明

首先,可以使用两种方法连接飞控,使用虚拟机(LINUX)或使用地面站(QGC)连接。 在px4的代码文件位置打开命令终端,输入连接命令: ./Tools/mavlink_shell.py 在控制台使用help来获取所有…

【Vue3】h、ref:vue3的两个新特性(重要)-h和ref

h、ref:vue3的两个新特性-重要 h 函数( createElement)ref 函数总结 在 Vue 3 中,h 和 ref 是两个非常重要的函数,它们在框架的运行和组件的创建中扮演着关键角色。在 Vue 3 中,这两个函数是构建现代 Vue 应…

MySQL8安装与卸载

1.下载mysql MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2.解压mysql安装包 解压到自己定义的目录,这里解压就是安装,解压后的路径不要有空格和中文。 3.配置环境变量 配置环境变量可以方便电脑在任何的路径…

简洁安装配置在Windows环境下使用vscode开发pytorch

简洁安装配置在Windows环境下使用vscode开发pytorch 使用anaconda安装pytorch,通过vscode集成环境开发pytorch 下载 anaconda 下载网址,选择对应系统的版本 https://repo.anaconda.com/archive/ windows可以选择Anaconda3-2024.10-1-Windows-x86_64.e…

25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)

一、JUC 简介 JUC 是 java.util.concurrent 工具包的简称,这是一个处理线程的工具包,从 JDK1.5 开始出现 二、进程与线程 1、基本介绍 (1)进程 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源…

使用 Jupyter Notebook:安装与应用指南

文章目录 安装 Jupyter Notebook1. 准备环境2. 安装 Jupyter Notebook3. 启动 Jupyter Notebook4. 选择安装方式(可选) 二、Jupyter Notebook 的基本功能1. 单元格的类型与运行2. 可视化支持3. 内置魔法命令 三、Jupyter Notebook 的实际应用场景1. 数据…

快速理解MIMO技术

引言 在无线通信领域,MIMO(Multiple-Input Multiple-Output,多输入多输出)技术是一项革命性的进步,它通过在发射端和接收端同时使用多个天线,极大地提高了通信系统的容量、可靠性和覆盖范围。本文简要阐释其…

unity学习3:如何从github下载开源的unity项目

目录 1 网上别人提供的一些github的unity项目 2 如何下载github上的开源项目呢? 2.1.0 下载工具 2.1.1 下载方法1 2.1.2 下载方法2(适合内部项目) 2.1.3 第1个项目 和第4项目 的比较 第1个项目 第2个项目 第3个项目 2.1.4 下载方法…

npm install --global windows-build-tools --save 失败

注意以下点 为啥下载windows-build-tools,是因为node-sass4.14.1 一直下载不成功,提示python2 没有安装,最终要安装这个,但是安装这个又失败,主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …

十二、Vue 路由

文章目录 一、简介二、安装与基本配置安装 Vue Router创建路由实例在应用中使用路由实例三、路由组件与视图路由组件的定义与使用四、动态路由动态路由参数的定义与获取动态路由的应用场景五、嵌套路由嵌套路由的概念与配置嵌套路由的应用场景六、路由导航<router - link>…

NLP 中文拼写检测纠正论文-08-Combining ResNet and Transformer

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…

深度学习中的离群值

文章目录 深度学习中有离群值吗&#xff1f;深度学习中的离群值来源&#xff1a;处理离群值的策略&#xff1a;1. 数据预处理阶段&#xff1a;2. 数据增强和鲁棒模型&#xff1a;3. 模型训练阶段&#xff1a;4. 异常检测集成模型&#xff1a; 如何处理对抗样本&#xff1f;总结…

儿童坐姿矫正器是如何实现语音提示功能?

儿童坐姿不正确&#xff0c;不仅影响他们的体态美观&#xff0c;更关乎其身体健康与成长发育。长期以往&#xff0c;可能会导致脊柱侧弯、近视加深等一系列健康问题。家长应当对此给予足够重视&#xff0c;及时纠正孩子们的坐姿习惯。 为了改善这一状况&#xff0c;可以从这方…

C++ 的 error_code 之三:自定义 error_condition

1 自定义 error_condition ​ 上一节我们实现了自定义的 error_code&#xff0c;通过定制 std::error_code 的内部机制&#xff0c;支持与系统相关错误码的隐式转换和直接比较&#xff0c;这一节我们再考虑一种情况。假设我们的支持库要同时支持 Windows 和 Linux 系统&#x…

pytdx,取市场股票列表,get_security_list,start参数为8000时,数据获取失败,导致无法获取全量数据的BUG修正

连接&#xff0c;普通行情&#xff08;服务器&#xff09;&#xff0c;想获取所有的深市A股的股票列表 调用get_security_list函数&#xff0c;但是发现&#xff0c;start为8000开始数据取不到了 于是&#xff0c;打开pytdx的源码 .conda/envs/qmt_mini/Lib/site-packages/p…

【蓝桥杯——物联网设计与开发】Part1:GPIO

目录 一、GPIO输出——LED &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;驱动原理 &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#x1f7e2;️main 函数 &#xff08;4&#xff09;实验现象 二…