前两天帮一位做财务的朋友恢复了一个加密的 Excel 文件密码——那里面存着三年的税务数据,密码忘了但文件又不能丢。Office 文档的加密机制和压缩包完全不同,恢复策略也有很大差异。这篇文章把 Office 文档密码恢复的技术原理和实战方案完整梳理一遍。

Office 文档的加密演进#

Office 文档的加密方案随着版本迭代发生了很大变化。了解加密版本是选择恢复方案的前提。

Office 97-2003(.doc / .xls / .ppt):
  加密方式:RC4(40-bit 密钥)
  安全性:极弱
  恢复难度:★☆☆☆☆
  说明:40-bit 密钥空间只有 2^40 ≈ 1 万亿种组合,现代 GPU 几小时即可穷举

Office 2007(.docx / .xlsx / .pptx):
  加密方式:AES-128 + SHA-1
  密钥派生:PBKDF2,迭代 50,000 次
  安全性:中等
  恢复难度:★★★☆☆
  说明:迭代次数显著增加了暴力破解的难度

Office 2010:
  加密方式:AES-128 + SHA-1
  密钥派生:PBKDF2,迭代 100,000 次
  安全性:中等偏上
  恢复难度:★★★☆☆

Office 2013-2021 / Microsoft 365:
  加密方式:AES-256 + SHA-512
  密钥派生:PBKDF2,迭代 100,000 次(可配置到 1,000,000)
  安全性:强
  恢复难度:★★★★☆
  说明:AES-256 + 高迭代次数,对暴力破解有很强的抵抗力

查看你的文档使用的加密版本#

# 使用 msoffcrypto-tool 查看加密信息
import msoffcrypto

with open('encrypted.xlsx', 'rb') as f:
    file = msoffcrypto.OfficeFile(f)
    print(f"加密类型: {file.file_type}")
    print(f"密钥大小: {file.keyTypes}")
    # 或者使用命令行:
    # msoffcrypto-tool -t encrypted.xlsx

Office 的两种「加密」:别搞混了#

很多用户混淆了 Office 的两种保护机制:

1. 文档加密(Encrypt with Password)
   作用:打开文件时需要输入密码
   加密范围:整个文件内容都被加密
   恢复方式:必须恢复密码才能查看内容
   
2. 工作表保护 / 编辑限制(Protect Sheet / Restrict Editing)
   作用:可以查看文件,但不能编辑
   加密范围:只锁定编辑功能
   恢复方式:可以通过修改 XML 结构绕过(见下文)

工作表保护:无需密码即可解除#

如果你的文件只是被「保护工作表」锁住了(可以查看但不能编辑),不需要恢复密码:

# 步骤 1:将 .xlsx 文件重命名为 .zip
cp protected.xlsx protected.zip

# 步骤 2:解压
unzip protected.zip -d extracted/

# 步骤 3:删除工作表保护标签
# 打开 extracted/xl/worksheets/sheet1.xml
# 找到 <sheetProtection ... /> 标签并删除

# 步骤 4:重新打包为 .xlsx
cd extracted/
zip -r ../unprotected.xlsx .

# 步骤 5:将 .xlsx 改回来
mv unprotected.xlsx ../unprotected.xlsx

原理很简单:.xlsx 文件本质上是一个 ZIP 压缩包,里面是 XML 文件。工作表保护只是在 XML 中加了一个 <sheetProtection> 标签,并没有真正加密文件内容。

文档加密的恢复方案#

如果你的文件是真正的「打开密码」加密,那需要正经的密码恢复。

方案一:msoffcrypto-tool(Python,免费)#

import msoffcrypto
import io

# 尝试用密码列表恢复
passwords = ['password123', 'admin2024', 'MyDoc@2024', ...]

with open('encrypted.xlsx', 'rb') as f:
    file = msoffcrypto.OfficeFile(f)
    
    for pwd in passwords:
        try:
            file.load_key(password=pwd)
            decrypted = io.BytesIO()
            file.decrypt(decrypted)
            print(f"密码找到: {pwd}")
            
            with open('decrypted.xlsx', 'wb') as out:
                out.write(decrypted.getvalue())
            break
        except Exception:
            continue
    else:
        print("字典中未找到正确密码")

优点:免费、Python 生态、容易集成到自动化流程中。

缺点:纯 CPU 运算,速度慢;不支持 GPU 加速;没有内置字典。

方案二:Hashcat(免费,GPU 加速)#

# 1. 使用 office2john 提取哈希
python office2john.py encrypted.xlsx > hash.txt

# 2. 根据 Office 版本选择 Hashcat 模块
# Office 2007: -m 9400
# Office 2010: -m 9500
# Office 2013+: -m 9600

# 3. 字典攻击
hashcat -m 9600 hash.txt wordlist.txt

# 4. 规则变异攻击
hashcat -m 9600 hash.txt wordlist.txt -r rules/best64.rule
Hashcat 性能参考(RTX 4090):

Office 2007 (RC4):    约 200,000 次/秒
Office 2010 (AES128): 约 50,000 次/秒
Office 2013+ (AES256): 约 8,000 次/秒

以 Office 2013+ 为例:
  6 位纯数字密码:10^6 / 8000 ≈ 2 分钟
  8 位字母+数字:62^8 / 8000 ≈ 27 年

注意:Office 2013+ 的高迭代次数使得每次密码尝试都很慢。这意味着 GPU 加速的优势被大幅削弱——即使 RTX 4090 也只能做到每秒 8000 次尝试。

方案三:云端恢复服务#

对于不想折腾命令行的用户,或者本地 GPU 算力不够用的场景,可以考虑云端服务。

猫密网 支持 Office 文档(Word、Excel、PowerPoint)的密码恢复。上传加密文件后,系统会使用云端分布式算力和优化过的密码字典进行恢复。

Office 文档恢复的特殊考虑:

1. 文件安全性
   Office 文档通常包含敏感信息(财务数据、合同、个人信息)
   猫密网支持本地特征提取(Catpasswd-Convert 工具)
   只上传文件特征,不上传源文件本身
   从架构角度看,这种设计在保证恢复效果的同时最大程度保护了隐私

2. 恢复时间
   免费版约 7 天排队
   专业版约 24 小时
   如果文件比较紧急,可以考虑付费升级

3. 文件格式支持
   .doc / .docx / .xls / .xlsx / .ppt / .pptx 都支持
   包括 Office 97 到 Microsoft 365 的所有版本

方案四:Passware Kit(商业软件)#

Passware Kit Forensic:
  - 支持 GPU 加速
  - 支持分布式计算(多台电脑同时破解)
  - 内置智能密码猜测策略
  - 价格:$995 - $3,495
  - 适合:企业 IT 部门、数据恢复公司、执法机构

恢复策略的优先级建议#

Step 1:确认加密类型
  - 是打开密码还是编辑保护?
  - 如果是编辑保护 → 直接改 XML(5 分钟搞定)
  - 如果是打开密码 → 继续

Step 2:确认 Office 版本
  - Office 97-2003 → 恢复很容易,Hashcat 几小时搞定
  - Office 2007-2010 → 中等难度,取决于密码复杂度
  - Office 2013+ → 较难,需要好字典和足够时间

Step 3:按成本从低到高尝试
  - 先回忆密码(0 成本)
  - 再用 msoffcrypto-tool 跑字典(0 成本,适合技术人员)
  - 再用 Hashcat + GPU(0 成本,需要 GPU)
  - 最后考虑云端服务或商业软件

实战案例:恢复一个加密的 Excel 税务文件#

这是我最近帮朋友恢复的真实案例(已脱敏):

场景:
  文件:2023_tax_summary.xlsx
  加密版本:Office 2019(AES-256)
  密码线索:朋友记得密码里包含 "Tax" 和数字,大概 8-10 位

恢复过程:

1. 使用 msoffcrypto-tool 确认加密版本
   → AES-256, PBKDF2 迭代 100,000 次

2. 构建定制字典
   基于线索 "Tax" + 数字:
   - Tax2023, Tax2023!, tax2023, TAX2023
   - Tax@2023, Tax#2023, Tax$2023
   - MyTax2023, Tax2023ok, Tax2023!!
   - ... 共生成约 5000 个候选密码

3. 使用 Hashcat 跑定制字典
   hashcat -m 9600 hash.txt custom_wordlist.txt
   → 3 分钟后找到密码:Tax@2023Q4

4. 解密文件
   msoffcrypto-tool -p 'Tax@2023Q4' encrypted.xlsx decrypted.xlsx

总耗时:约 20 分钟

关键洞察:定制字典比通用字典有效得多。如果你能回忆起关于密码的任何线索——哪怕只是「大概包含什么字符」——都能将恢复时间从「几年」缩短到「几分钟」。

Office 文档加密的最佳实践#

如果你正在用密码保护 Office 文档,以下建议可以帮助你避免将来忘记密码:

1. 密码存入密码管理器
   创建文档加密密码后,立即存入 Bitwarden / 1Password
   在备注中记录文件名和存放位置

2. 使用 Microsoft 365 的云端方案
   如果文件存储在 OneDrive/SharePoint 中
   可以使用 Microsoft Purview 的敏感信息管理
   比密码加密更安全,也更不容易丢失访问权限

3. 考虑替代方案
   - 敏感文档:使用 Veracrypt 创建加密容器(更标准、更可控)
   - 协作场景:使用 Microsoft 365 的权限管理(IRM)
   - 传输场景:使用 Signal/ProtonMail 的端到端加密

结语#

Office 文档的密码恢复难度随着版本迭代急剧上升。Office 2003 的加密形同虚设,而 Office 2013+ 的 AES-256 + 高迭代 PBKDF2 已经具备了相当的抗暴力破解能力。

好消息是,大多数用户设置的密码强度远低于加密算法的安全强度。一个精心构建的定制字典,配合 Hashcat 或云端算力,仍然能恢复大部分「人类可记忆」的密码。

最后,最好的恢复方案是在加密的那一刻就把密码存好。这听起来是废话,但确实是最高效的「恢复策略」。