文章目录
-
- 前言
- 完整代码
- 代码解释
-
- [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
文件。下面是主要步骤的解释:
-
打开加密文件:
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()
返回,以字节流的形式保存解密结果。
- 解密后的内容通过
-
异常处理:
- 如果密码错误或其他问题导致解密失败,代码会捕捉异常并记录错误信息。
密码生成与解密尝试
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")
在此函数中,我们尝试使用多个密码解密文件:
- 密码生成 :调用
generate_passwords
函数生成候选密码列表。 - 清空结果文件:每次尝试解密时,都会清空之前的结果,并准备记录新的解密结果。
- 尝试解密 :遍历每个生成的密码,并调用
read_secret_word_file
函数解密文件。如果密码正确,则记录并退出。 - 失败记录:如果解密失败,记录失败的密码和错误信息,并继续尝试下一个密码。
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 应用程序:
- 启动 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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。