【发布时间】:2013-02-12 06:51:21
【问题描述】:
我有一个delphi 应用程序,它使用Delphi Encryption Compendium (DEC) 来加密一些数据。它工作得很好,我可以毫无困难地加密和解密。我正在使用 Rijndael 加密。
我的挑战是使用 Node.JS 解密使用 Delphi 加密的数据(使用加密中的功能)。我查看了 StackOverflow 问题 Delphi DEC library (Rijndael) encryption 和 AES encrypt in Node.js Decrypt in PHP. Fail.,我想我对我的问题有了更好的理解。
我学到的是,我需要在节点端模仿 DEC 使用的密钥派生。我不能以任何方式覆盖或更改加密方面。我必须使用已经存在的内容。
我的问题是:DEC 使用的密钥派生(给定密钥和 iv)标准,还是 DEC 库专用的东西?如果它是标准的,那么在给定相同输入的情况下,有没有人看到任何 javascript 代码产生与 DEC 中的函数相同的输出?
我看到密钥派生序列的一部分涉及对密钥进行哈希处理(在本例中,是一个 32 字节的密钥,使用 RipeMD-256 进行哈希处理)。我进一步看到,作为密钥派生过程的一部分,密钥的大小从 32 个字节减少到了 16 个字节。我在 Delphi 代码中被绊倒的地方是 DEC 如何使用密钥和 iv 来派生实际用于解密的密钥。
我很乐意使用任何必要的代码对其进行编辑。我希望熟悉 DEC 库和 javascript / node.js 的人可以为我指明正确的方向。
===编辑===
所以在进行了一些额外的挖掘之后,我发现this Javascript code for AES 作为使用加密模块的替代方法。作者取CIV值作为密文的前8个字节,所以我只是:
var encryptedData='B6F03982E2F6303ACA7313'; // 纯文本是 'Hello There' 变量键='01234567890123456789012345678901'; var hashedKey=hash('ripemd256',key); var civ='549621EEF38647BE'; var decryptedData=''; var charEncryptedData=hex2a(encryptedData); var charKey=hex2a(hashedKey); var charCiv=hex2a(civ); decryptedData=Aes.Ctr.decrypt(charCiv+charEncryptedData,hashedKey,128); console.log('解密数据:'+decryptedData);但毕竟,我想知道这个库中的密钥派生是否与 DEC 中的相同。
=== 编辑 ===
在回答评论时,不,在给定相同的密钥和 civ 值的情况下,这两种实现似乎不会计算相同的加密数据。调用
var reEncryptedData=Aes.Ctr.encrypt('hello there', charKey, 128, charCiv);
产生一个完全不同的加密字符串,即使考虑到 CIV 到加密文本的前置,它仍然比 delphi 端的输出长 8 个字节。
===编辑===
Aes.Ctr 代码库(上面提到的)正在使用 CTR 模式,我在 delphi 端进行 CBC。 -叹气-
再次感谢。
【问题讨论】:
-
确定这两种实现是否兼容不只是使用相同的密钥/iv 对加密并查看输出是否相同吗?
-
问题已被编辑以解决此评论。简短的回答是 - 不,它们不一样!
-
听起来这些库之一不符合 AES 规范。所以现在你需要找到第三个来确定哪个有效,哪个无效:)
-
然后可能是第四个来验证 1 和 3 的操作!
标签: javascript delphi node.js encryption