3

我有一个使用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。-叹-

再次感谢。

4

2 回答 2

1

我敢肯定这不是全部答案,但它是其中的一部分。

在比较各种 Javascript AES 实现时,包括 heinob 提交给这个问题的那些,我发现它们与 Delphi 版本之间存在一些差异。特别是在一些预先计算的值中。

所以,我有两个选择:在 Delphi 库中重新开发代码或从 Delphi 库构建一个 DLL,然后从 dot net 应用程序中调用它。我决定走点网路线:在 Delphi 库中构建一个调用解密路线的 dll。

如果其他人走这条路,我将传递几个花絮:

我的函数签名是:

function decrypt(encryptedData, key, iv: PAnsiChar): PAnsiChar; StdCall; Export;

在 C# 中,函数签名是:

public static extern IntPtr decrypt(string encryptedData, string key, string iv);

调用后,您将 IntPtr 编组为 ansi 字符串。

于 2013-02-28T00:30:55.883 回答
0

您可以将算法与这两个 javascript 库进行比较:

两者都肯定会产生正确的 crpyted 输出。

顺便说一句:MEGA(KimDotCom)使用第一个加密文件。

于 2013-02-27T16:40:40.197 回答