好的,所以在安全和超级用户被拒绝之后,我第三次怀疑:(
似乎有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字节。
密钥派生算法给出了here:
我的文档密码为x
(单个字符)。我试图首先导出EncryptedVerifier
(我认为这是一个随机数)。但是,我得到了不同的结果:(
在导出 TruncatedHash 之前,加密密钥派生算法非常简单。在此之后,我对我应该做的事感到困惑。
我只是从文档中取出EncryptedVerifier
并使用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'
我正在使用this网站进行RC4加密/解密。
我做错了什么?如果您需要文档中的其他内容,请与我们联系。 谢谢!