微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用pycrypto实现XML加密解析LCP编码文件

如何解决使用pycrypto实现XML加密解析LCP编码文件

我正在尝试在 Python 中实现 LCP DRM,但我无法理解其初始加密过程中的数据流。

他们的 license.lcpl 文件的关键部分是

{                                                                                                    
    "provider":"http://www.epagine.fr","id":"6666065a-e7bd-44b4-93ad-abd0336374dd","issued":"....","encryption":                                                                                    
    {                                                                                                
        "profile":"http://readium.org/lcp/profile-1.0","content_key":{                                                                              
            "algorithm":"http://www.w3.org/2001/04/xmlenc#aes256-cbc","encrypted_value":"itxQlsi5sxcSZ89eW2m80UCOyEDqBZzgTX3E/kG3rqWstvnFXOqOXVwiodlHUmtUSqxdbToy02fubOSt1/37AQ=="
        },"user_key":{                                                                                 
            "algorithm":"http://www.w3.org/2001/04/xmlenc#sha256","text_hint":"Quelle est votre Clé LCP ?","key_check":"pFoXDupsQReQ5H5e9Vg6JtHkjkbVkOlkGYUWvWmFSgfZN8anAyMP7T6+zW3FJn+GzQpatvRQW7W54wixrUeorQ=="}

    },

这意味着 - 我相信 - 供应商发布的 User Passphrase 4EeffRhPz6(或者这可能是 256 位 User Key?)应该散列到 some User Key 长度为 256 位的值 H。然后我应该能够从 key_check 字段中的数据中提取 AES 初始化向量,并使用 AES256-CBC 将 id 6666065a-e7bd-44b4-93ad-abd0336374dd 加密为 key_check 的值.完成后,我应该使用相反的过程来解密内容密钥,然后使用内容密钥来解密我的文件。 (来自示例文件的数据在底部给出。)

我认为 H 的相关值是 VDDcCeWkbZlZnjc5yJ+L0YDJqgvF480ej2cnqw3qMhE=,IV 应该是 pFoXDupsQReQ5H5e9Vg6Jg==。但我不确定,我无法复制 key_check 字段。我一直在使用 pycrypto 库并在将它们作为参数传递之前将所有内容转换为字节。

我的一些作品:

In [142]: from Crypto.Hash import SHA256,AES
In [143]: h = SHA256.new()
In [144]: h.update(b'4EeffRhPz6')
In [146]: h.digest()
Out[146]: b"T0\xdc\t\xe5\xa4m\x99Y\x9e79\xc8\x9f\x8b\xd1\x80\xc9\xaa\x0b\xc5\xe3\xcd\x1e\x8fg'\xab\r\xea2\x11"

In [147]: codecs.encode(h.digest(),'base64')
Out[147]: b'VDDcCeWkbZlZnjc5yJ+L0YDJqgvF480ej2cnqw3qMhE=\n'

In [148]: ciphertext = codecs.decode(b'itxQlsi5sxcSZ89eW2m80UCOyEDqBZzgTX3E/kG3rqWstvnFXOqOXVwiodlHUmtUSqxdbToy02fubOSt1/37AQ==','base64')
In [149]: key_check = codecs.decode(b"pFoXDupsQReQ5H5e9Vg6JtHkjkbVkOlkGYUWvWmFSgfZN8anAyMP7T6+zW3FJn+GzQpatvRQW7W54wixrUeorQ==",'base64')
In [150]: iv = key_check[:16]
In [151]: user_key_bytes = h.digest()
In [152]: aes_obj = AES.new(user_key_bytes,AES.MODE_CBC,iv)

In [153]: codecs.encode(aes_obj.encrypt(id_field.replace('-','')),'base64')
Out[153]: b'uTP9Z7ykqxS5xnpwafgxE12KBd5HuHdPARE2Qa64OsI=\n'

In [154]: codecs.encode(iv + aes_obj.encrypt(id_field.replace('-','base64')
Out[154]: b'pFoXDupsQReQ5H5e9Vg6Jifk96zVYc4Ast38IQfR6z6sMqUxrTTbNEwQVJRxT2S6\n' # wrong

c01_cover.xhtml内容,加密前使用 Deflate 进行了压缩,原为 792 字节:

CJIqkyl4gAsQjaKJo8+D5imsgTc4jEJdm+xHmKr0kV/Nyyf87OclI+1hUCsXuvp42gSZOgSLejjVek3wguvE/4XBE6Mq/KWcAeoXbB/mMYMyQD66QfpL1j5tWPo/kSFVt8TNVebcvUQRCY43VkmEAryjmpg1CzLJIDfJrJqmfeHYO5uP5kOV5xL+dF4NQCPCFdvRExF1X+XprMoq7Cj1BMNyUfUBMVx1Z8emKBBaW+AkSVJIw3cjSJdeto0hBzm/7Qu78YwkA184fLTtEQ0dD3HzzkvMfL052i0mJT6cSR/LVWt7BZTbxRVf7s6fvjhK4LYT8arLNIvKy7UianJIngn3MRUFXexs7rLPrhw5nXDazexEh3rWzGTBxHBySL1ldjs2cvlc0BKhpCyWfGGbaEPZl1mHt7tIHQhO5oHHl079K1t/oL2Q5FJ6RdCnKIL9sxbPMcFnmPZFyVE0GK6Ucx1KiaC8xoQirEJWDB7iTniwp8Vl/t/HeHUh+/nbVdx6ohQm10lxmOoRTMtYAUo7kg==

任何想法将不胜感激!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?