Office文件一旦被设置了打开密码,如果忘记了,一般情况下是很难找回的。
前2年研究过一下,以前写过的复合文档解析的文章,也和这个相关。
当时看的是微软官方文档:[MS-OFFCRYPTO] - v20171212,英文的!
我英语相当不咋地,很多时候都是边在线翻译边看,好难看懂。
经过边看边猜的漫长过程,也蒙出来点东西,由于用VBA代码太难实现了,所以一直也没有写,最近想着用go语言做个工具:
1 Office文件加密方式
根据[MS-OFFCRYPTO] - v20171212文档,连蒙带猜应该是有以下几种加密的方式:
测试使用的是笔记本电脑,CPU是i5、4核
现在的Office365不知道在哪设置加密的方式了!第2种没找到,就没做测试。
从文档的加密方式来看,因为使用了hash函数,所以直接破解出密码理论上应该是不可能的。
从hash 的次数来看:
- 03版本的(xls、doc、ppt等后缀的),每秒38万的测试速度,如果是纯数字的密码,那么10位数字内的密码,总数100亿,大概要7小时。
- ECMA-376格式的(应该就是07版本以上,xlsx、docx、pptx等后缀的),理论上如果设了一个较为复杂的密码,是不可能破解的;如果设置的密码简单,比如纯数字的6位数,总数是100万,按第3种每秒66个的话,大概要4小时。
这还是可以接受的。
同时因为hash函数里还加了点“盐”(salt随机数),所以想事先将密码的hash值计算好存储起来,以此来节省hash的时间也是不可能的!
2 使用VBA测试密码
因为VBA里提供了Workbooks.Open方法,是允许带密码参数的,所以使用这个也可以做个简单的密码测试工具:
代码语言:javascript复制Set wk = Workbooks.Open(Filename:=file_name, UpdateLinks:=False, PassWord:=str)
If Not wk Is Nothing Then
UnProtectExcel = str
Exit Do
End If
主要的代码就是使用错误捕获的方式来判断是否成功打开了文件。
用这个方法测试的速度:
速度明显慢了很多。
3 关于工具
因为文档是英文的,很多地方是连蒙带猜的,应该会有一些错误的地方。
工具左边是个树形目录,展示的是复合文档的结构,Office文件加密后都是保存为复合文档的,后续看情况把复合文档的一些解析功能也加进来,比如VBAProject里介绍的VBA模块代码的提取、模块的隐藏等。
工具获取密码的方式目前提供了2种:
- 一种是输入元素进行排列组合获取:元素按空格隔开,可以是多个字符的元素,比如[0 1 aa xiong 2],这表示5个元素;排列组合选择的数量可以输入多个,比如可能是元素中的3个或者4个的排列组合,输入[3 4]
- 一种是直接选择保存了密码的文本文件按行读取
工具使用的是go语言编写,UI使用的是fyne,理论上应该是可以跨平台,但我没有其他平台电脑,没做相关测试,如果有其他平台需要的可以联系,顺便帮忙测试。
使用过程中发现bug也欢迎随时联系我。
获取方式:
在微信公众号回复oct获取