【代码】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.rhkb.cn/news/500786.html

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

相关文章

【网络安全 | 漏洞挖掘】硬编码凭据泄露实现支付系统账户接管

未经许可,不得转载。 文章目录 前言在APK中寻找硬编码凭据+账户接管在APP流程中寻找硬编码凭据+账户接管总结前言 硬编码凭据是指直接嵌入应用程序源代码中的敏感信息,例如 API 密钥、密钥、用户名或密码。这些凭据通常为了开发便捷而添加,但往往在发布到生产代码或应用路径…

【数据库系列】Spring Boot 中整合 MyBatis-Plus详细步骤

在 Spring Boot 中整合 MyBatis-Plus 可以按照以下步骤进行: 一、整合步骤 1. 创建 Spring Boot 项目 首先,使用 Spring Initializr(https://start.spring.io/)创建一个新的 Spring Boot 项目。在创建过程中,选择以…

JVM实战—8.如何分析jstat统计来定位GC

大纲 1.使用jstat了解线上系统的JVM运行状况 2.使用jmap和jhat了解线上系统的对象分布 3.如何分析JVM运行状况并合理优化 4.使用jstat分析模拟的BI系统JVM运行情况 5.使用jstat分析模拟的计算系统JVM运行情况 6.问题汇总 1.使用jstat了解线上系统的JVM运行状况 (1)JVM的…

[人工智能] 结合最新技术:Transformer、CLIP与边缘计算在提高人脸识别准确率中的应用

随着人工智能的快速发展,特别是深度学习和自然语言处理领域的革命性技术,越来越多的前沿技术被应用于人脸识别中。Transformer架构、CLIP模型以及边缘计算的结合,正成为提升人脸识别准确率和应用效能的关键技术路径。特别是在多样化场景下&am…

DataV数据可视化

阿里云 DataV 是一个强大的数据可视化工具,可以帮助用户通过创建丰富的图表、仪表盘、地图和互动视图,将复杂的数据转化为易于理解和分析的可视化信息。DataV主要用于大数据和实时数据的展示,可以帮助企业和个人更直观地理解数据背后的含义&a…

【国产NI替代】基于STM32+FPGA的8振动+4温度(16bits)数据采集板卡解决方案,支持全国产

一、8振动4温度(16bits)数据采集板卡解决方案 采用STM32H743做为主控芯片,针对工业现场 环境设计的12通道数据采集装置,采集器模 拟信号调理电路采用模块化设计,前通道模 块可配置,可扩展,其…

SpringMVC(一)配置

目录 引入 第一章:Java web的发展历史 一、Model I和Model II 1.Model I开发模式 2.Model II开发模式 二. MVC模式 第二章:SpringMVC的入门案例 搭建SpringMVC的入门程序 1.创建新项目 2.等待加载导入坐标 3.处理xml文件和其他 导入tomcat 运…

数据结构(ing)

学习内容 指针 指针的定义: 指针是一种变量,它的值为另一个变量的地址,即内存地址。 指针在内存中也是要占据位置的。 指针类型: 指针的值用来存储内存地址,指针的类型表示该地址所指向的数据类型并告诉编译器如何解…

Java网络套接字

在Java的开发中,有一个很重要!很重要!很重要!的东西,叫做网络套接字,它被广泛的用来二次开发服务,比如大数据中台的服务链路调用等。 它的实现原理是依靠三次握手来完成通信的建立,…

Mac 安装Mysql启动Mysql以及数据库的常规操作

Mac 安装Mysql启动Mysql以及数据库的常规操作 一、mysql的安装 1、登录官方网站:dev.mysql.com/downloads/mysql/ 二、查看系统架构 uname -m 在MAC中: 如果输出结果是 x86_64,则表示你的系统是 x86-64 架构。 如果输出结果是 arm64,则表示…

OpenCV的人脸检测模型FaceDetectorYN

OpenCV的人脸检测模型FaceDetectorYN 1. 官网地址2. 如何使用2.1.到opencv_zoo下载模型文件和代码2.2. 下载文件展示2.3. 修改了demo支持读取视频文件,默认是图片和摄像头## 2.4 效果展示 1. 官网地址 https://docs.opencv.org/4.x/df/d20/classcv_1_1FaceDetector…

DeepSeek-VL2

《DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding》是 DeepSeek-AI 团队发布的关于视觉语言模型 DeepSeek-VL2 的论文,以下是对该论文的详细介绍: 研究背景与动机 多模态理解的重要性:在当…

电子应用设计方案82:智能 AI 椅子系统设计

智能 AI 椅子系统设计 一、引言 智能 AI 椅子旨在为用户提供更加舒适、个性化和智能化的坐乘体验,结合了先进的技术和人体工程学原理。 二、系统概述 1. 系统目标 - 自动适应用户的体型和坐姿,提供最佳的支撑和舒适度。 - 实时监测用户的健康数据&…

Ps:创建数据驱动的图像

在设计实践中,常常需要处理大量内容变化但设计格式统一的任务,例如批量生成名片、工作证、学生证、胸牌、奖状或证书甚至图册。这些工作如果逐一手动制作,不仅耗时费力,还容易出错。 为解决这一问题,Photoshop 提供了强…

彻底解决 Selenium ChromeDriver 不匹配问题:Selenium ChromeDriver 最新版本下载安装教程

在 Python 的 Selenium 自动化测试中,ChromeDriver 是不可或缺的工具。它作为代码与 Chrome 浏览器的桥梁,但如果版本不匹配,就会导致各种报错,尤其是以下常见问题: selenium.common.exceptions.SessionNotCreatedExc…

天猫推荐数据集实践

参考自 https://github.com/xufengtt/recom_teach_code,学习记录。 环境配置(maxcomputedataworks) 下载天猫推荐数据集;开启 aliyun 的 maxcompute,dataworks,pai;使用 odpscmd 上传本地数据…

人脑处理信息的速度与效率:超越计算机的直观判断能力

人脑处理信息的速度与效率:超越计算机的直观判断能力 关键词: #人脑信息处理 Human Brain Information Processing #并行处理 Parallel Processing #视觉信息分析 Visual Information Analysis #决策速度 Decision Speed #计算机与人脑比较 Computer v…

checked 溢出问题

{try{int i int.MaxValue;int j;checked{j i 1;}}catch (OverflowException er){Console.WriteLine($"加Checked——>{er.Message}");}}{try{int i int.MaxValue;int j;j i 1;}catch (OverflowException er){Console.WriteLine($"没有加Checked——&g…

LabVIEW 使用 Resample Waveforms VI 实现降采样

在数据采集与信号处理过程中,降采样是一种重要的技术,用于在减少数据点的同时保留信号的关键特性,从而降低存储和计算需求。本文通过 LabVIEW 的 Resample Waveforms (continuous).vi 示例,详细介绍如何使用该功能实现波形数据的降…

数字化供应链创新解决方案在零售行业的应用研究——以开源AI智能名片S2B2C商城小程序为例

摘要: 在数字化转型的浪潮中,零售行业正经历着前所未有的变革。特别是在供应链管理方面,线上线下融合、数据孤岛、消费者需求多样化等问题日益凸显,对零售企业的运营效率与市场竞争力构成了严峻挑战。本文深入探讨了零售行业供应…