好的,在被安全性和超级用户拒绝之后,我第三次怀疑了:(
似乎有 3 种主要的加密模式。我创建了一个模拟文档并使其受密码保护。经过一番窥探,我猜我的文档使用了 RC4 加密方法。这是位于0x1200
地址的加密标头:
01 00 01 00 27 cf 34 9f a9 86 50 53 ad 66 58 e9
42 c4 bb 8c 11 00 41 26 f1 a9 37 d7 6e 1c d0 37
3d fb 97 02 a6 9b c0 8f 71 df 28 a2 6b 6f 83 69
fc 69 57 e3 70 a9 9d fc b3 8d 4f 35 0e ff d0 8c
da b2 b5 67 0f 50 40 6b b8 54 58 e2 41 8e f3 f8
根据文档,前 4 个字节是主要、次要版本,然后是 Salt、EncryptedVerifier、EncryptedVerifierHash,每个 16 个字节。
这里给出了密钥推导算法:
我的文档的密码是x
(单个字符)。我试图推导出第EncryptedVerifier
一个(我认为是一个随机数)。但是,我得到了不同的结果 :( 加密密钥派生算法在派生TruncatedHash之前非常简单。在此之后,我对我应该做什么感到困惑。
我只是EncryptedVerifier
从文档中获取并使用密钥 as 使用 RC4 算法对其进行解密MD5(TruncatedHash + 00000000).
但是当我对它进行散列并将其与EncryptedVerifierHash
(解密后)进行比较时,这两个结果是不同的。
代码的一部分是:
>>> import hashlib
>>> h0 = hashlib.md5()
>>> h0.update('x')
>>> h0 = h0.hexdigest()
>>> h0
'9dd4e461268c8034f5c8564e155c67a6'
>>> h0tr = h0[0:10]
>>> h0tr
'9dd4e46126'
>>> ibuff = h0tr + '27cf349fa9865053ad6658e942c4bb8c'
>>> buff = ibuff * 16
>>> len(buff)/2
336
>>> h1 = hashlib.md5()
>>> h1.update(buff)
>>> h1 = h1.hexdigest()
>>> h1tr = h1[0:10]
>>> hf = hashlib.md5()
>>> hf.update(h1tr + '00000000')
>>> hf = hf.hexdigest()
>>> hf
'43e94942913b933273f5c65d3c859723'
我正在使用这个网站进行 RC4 加密/解密。
我究竟做错了什么?如果您需要文档中的其他内容,请告诉我。谢谢!