我有一个使用Delphi Encryption Compendium (DEC) 加密某些数据的 delphi 应用程序。它工作得很好,我可以毫不费力地加密和解密。我正在使用 Rijndael 加密。
我的挑战是使用 Node.JS 解密加密的 Delphi 数据(使用加密中的功能)。我查看了 StackOverflow 问题Delphi DEC 库 (Rijndael) 加密和AES 加密在 Node.js 中解密在 PHP 中。失败。,并且我认为我对我的问题的理解更好一些。
我学到的是,我需要模仿 DEC 在节点端使用的密钥派生。我不能以任何方式覆盖或更改加密方面。我必须使用已经存在的内容。
我的问题是:DEC 使用的密钥派生(给定密钥和 iv)标准,还是 DEC 库专用的东西?如果它是标准的,那么在给定相同输入的情况下,是否有人见过任何产生与 DEC 中的函数相同的输出的 JavaScript 代码?
我看到密钥派生序列的一部分涉及对密钥进行哈希处理(在本例中,是一个 32 字节的密钥,使用 RipeMD-256 进行哈希处理)。我进一步看到,作为密钥派生过程的一部分,密钥的大小从 32 个字节减少到了 16 个字节。我在 Delphi 代码中被绊倒的地方是 DEC 如何使用密钥和 iv 来派生实际用于解密的密钥。
我很高兴使用任何必要的代码来编辑它。我希望熟悉 DEC 库和 javascript / node.js 的人可以为我指明正确的方向。
===编辑===
因此,在进行了一些额外的挖掘之后,我发现了这个用于 AES 的 Javascript 代码,作为使用加密模块的替代方法。作者取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。-叹-
再次感谢。