【代码】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
文件。下面是主要步骤的解释:
-
打开加密文件:
with open(file_path, 'rb') as encrypted_file
以二进制模式打开指定的加密 Word 文件。
-
解密操作:
- 使用
msoffcrypto.OfficeFile
类加载加密文件,并通过office_file.load_key(password=password)
提供密码。 - 然后,调用
office_file.decrypt(decrypted_content)
解密文件,将解密后的内容保存在decrypted_content
中。
- 使用
-
返回解密内容:
- 解密后的内容通过
decrypted_content.getvalue()
返回,以字节流的形式保存解密结果。
- 解密后的内容通过
-
异常处理:
- 如果密码错误或其他问题导致解密失败,代码会捕捉异常并记录错误信息。
密码生成与解密尝试
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")
在此函数中,我们尝试使用多个密码解密文件:
- 密码生成:调用
generate_passwords
函数生成候选密码列表。 - 清空结果文件:每次尝试解密时,都会清空之前的结果,并准备记录新的解密结果。
- 尝试解密:遍历每个生成的密码,并调用
read_secret_word_file
函数解密文件。如果密码正确,则记录并退出。 - 失败记录:如果解密失败,记录失败的密码和错误信息,并继续尝试下一个密码。
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 应用程序:
- 启动 Word 应用程序:通过
CreateObject('Word.Application')
启动 Word。 - 打开文件:调用
word.Documents.Open(filename, PasswordDocument=password)
使用提供的密码打开加密的.doc
文件。 - 成功解密:如果密码正确,解密的文件会被打开,解密后关闭文件。
- 错误处理:如果密码错误或其他问题发生,会捕捉异常并记录错误信息。
注意事项
- 在使用此方法时,必须确保 Microsoft Word 已经启动。否则,会出现 “RPC 服务器不可用” 的错误提示。
- 本方法相对于
msoffcrypto
库,解密速度较慢,因此推荐使用msoffcrypto
来解密.docx
文件。
总结
msoffcrypto
方法 适用于.docx
文件,操作简便且解密速度较快。comtypes
方法 适用于.doc
文件,解密时依赖于本地 Word 应用程序,并且速度较慢。
通过这两种方法,你可以轻松尝试破解已加密的 Word 文件,前提是你知道文件的某些潜在密码并准备进行密码破解。
结语
令人感到悲伤的是,我尝试了几千个密码都没有成功,我电脑都卡死重启了,于是我准备重做我的文档。
然后我开始在电脑里搜索文档的历史存档,搜到目录的那一瞬间,我想起来了一切qwq。
本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/144888638。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
相关文章:
【代码】Python|Windows 批量尝试密码去打开加密的 Word 文档(docx和doc)
文章目录 前言完整代码Githubdocxdoc 代码解释1. msoffcrypto 方法(用于解密 .docx 文件)read_secret_word_file 函数密码生成与解密尝试try_decrypt_file 函数 2. comtypes 方法(用于解密 .doc 文件)read_secret_word_file 函数注…...
java开发中注解汇总
注解作用位置注意mybatis Data Getter Setter ToString EqualsAndHashCode AllArgsConstructor NoArgsConstructor Data 代替:无参构造,get,set,toString,hashCode,equals Getter Setter 可放在类和方法上&…...
C# 设计模式(结构型模式):外观模式
C# 设计模式(结构型模式):外观模式 (Facade Pattern) 在复杂系统中,往往会涉及到多个子系统、模块和类。这些子系统的接口和功能可能会让使用者感到困惑和复杂。在这种情况下,我们可以使用外观模式(Facade…...

PowerShell 常见问题解答
PowerShell 是微软开发的一种功能强大的命令行界面和脚本语言,广泛应用于系统管理和自动化任务。以下是一些使用 PowerShell 时常见的问题及其解决方法。 什么是 PowerShell? PowerShell 是基于 .NET 的命令行界面(CLI)和脚本语言…...

计算机网络 (15)宽带接入技术
前言 计算机网络宽带接入技术是指通过高速、大容量的通信信道或网络,实现用户与互联网或其他通信网络之间的高速连接。 一、宽带接入技术的定义与特点 定义:宽带接入技术是指能够传输大量数据的通信信道或网络,其传输速度通常较高,…...
前端Python应用指南(六)构建RESTful API:使用Flask和Django实现用户认证与授权
《写给前端的python应用指南》系列: (一)快速构建 Web 服务器 - Flask vs Node.js 对比(二)深入Flask:理解Flask的应用结构与模块化设计(三)Django vs Flask:哪种框架适…...
【Unity3D】基于UGUI——简易版 UI框架
https://github.com/AMikeW/BStandShaderResources/blob/master/milk_UIFramework.unitypackage UI框架支持如下功能: 1、层级控制 2、支持面板多次打开时,隐藏前一个打开的面板,当关闭面板时,能够恢复前一个打开面板状态 3、支…...
算法排序算法
文章目录 快速排序[leetcode 215数组中的第K个最大元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/)分析题解快速排序 桶排序[leetcode 347 前K个高频元素](https://leetcode.cn/problems/top-k-frequent-elements/)分析题解 快速排序 leetcode 215数组…...
第3章 总线
总线的定义 为多个部件 分时共享 公共信息传送线路。 系统之间、模块之间、芯片内部用来传递信息信号线集合。 共享 总线上可连接多个部件 各部件间相互交换信息 都可通过总线来。 分时 同一时刻 总线上只能传 一个部件信息。 采用标准总线的优点 简化系统软硬件设计 从硬件角度…...

手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电
手机实时提取SIM卡打电话的信令声音 --双卡手机来电如何获取哪一个卡的来电 一、前言 前面的篇章《手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案》中,我们论述了局域网SIP坐席通过手机外呼出去时,手机中主副卡的呼叫调度策略。 但…...
共阳极LED的控制与短路问题解析
共阳极LED的控制与短路问题解析 在电子电路中,LED(发光二极管)是最常见的元件之一。LED的连接方式分为共阳极和共阴极,不同的连接方式决定了LED的控制逻辑。本文将重点讲解共阳极LED的工作原理,并解答“为什么给1不会…...

华为消费级QLC SSD来了
近日,有关消息显示,华为的消费级SSD产品线,eKitStor Xtreme 200E系列,在韩国一家在线零售商处首次公开销售,引起了业界的广泛关注。 尽管华为已经涉足服务器级别的SSD制造多年,但直到今年6月才正式推出面向…...

liunx下载gitlab
1.地址: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 安装 postfix 并启动 yum install postfix systemctl start postfix systemctl enable postfix ssh服务启动 systemctl enable sshd systemctl start sshd开放 ssh 以及 http 服务,…...

深度学习模型预测值集中在某一个值
深度学习模型,训练过程中,经常遇到预测的结果集中在某个值,而且在学习的过程中会变,样例如下。 主要有如下解决方案 1、更换relu ->tanh 或者其他激活函数 2、更改随机种子,估计是没有初始化好,或者调…...

Sqoop的使用
每个人的生活都是一个世界,即使最平凡的人也要为他那个世界的存在而战斗。 ——《平凡的世界》 目录 一、sqoop简介 1.1 导入流程 1.2 导出流程 二、使用sqoop 2.1 sqoop的常用参数 2.2 连接参数列表 2.3 操作hive表参数 2.4 其它参数 三、sqoop应用 - 导入…...
OpenGL ES 04 图片数据是怎么写入到对应纹理单元的
从指定路径加载图像并转换为 CGImage。获取图像的宽度和高度。创建一个 RGB 颜色空间。为图像数据分配内存。创建一个位图上下文并将图像绘制到上下文中。创建一个新的纹理对象并绑定到指定的纹理单元。指定二维纹理图像。释放分配的内存。设置纹理参数,包括放大和缩…...
C# 设计模式的六大原则(SOLID)
C# 设计模式的六大原则(SOLID) 引言 在面向对象编程中,设计模式提供了高效、可复用和可维护的代码结构。SOLID原则是软件设计中的一组重要原则,用于确保代码具有良好的可维护性、可扩展性和灵活性。SOLID是五个设计原则的首字母…...

数据库自增 id 过大导致前端时数据丢失
可以看到,前端响应参数是没有丢失精度的 但是在接受 axios 请求参数时出现了精度丢失 解决方案一:改变 axios 字符编码 axios.defaults.headers[Content-Type] application/json;charsetUTF-8; 未解决 解决方案二:手动使用 json.parse() …...
第二十六天 自然语言处理(NLP)词嵌入(Word2Vec、GloVe)
自然语言处理(NLP)中的词嵌入(Word2Vec、GloVe)技术,是NLP领域的重要组成部分,它们为词汇提供了高维空间到低维向量的映射,使得语义相似的词汇在向量空间中的距离更近。以下是对这些技术的详细解…...
MongoDB 固定集合
MongoDB 固定集合 MongoDB中的固定集合(Capped Collections)是一种具有固定大小的集合,当集合中的数据达到其最大大小时,它会自动覆盖最早的文档。这种类型的集合在MongoDB中用于实现高效的、固定大小的循环缓冲区。本文将详细介…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...