用Node.JS解密Rijndael(用Delphi和Delphi加密纲要加密后)

时间:2013-02-26 17:35:41

标签: javascript delphi node.js encryption

我有一个delphi应用程序,它使用Delphi Encryption Compendium(DEC)来加密某些数据。它工作得很好,我可以毫无困难地加密和解密。我正在使用Rijndael加密。

我的挑战是使用Node.JS解密加密的Delphi数据(使用加密功能)。我查看了StackOverflow问题Delphi DEC library (Rijndael) encryptionAES 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值作为加密文本的前八个字节,所以我只是:

var encryptedData='B6F03982E2F6303ACA7313';  // plain text is 'Hello There'
var key='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('decrypted data: '+decryptedData);

但毕竟这个,我想知道这个库中的密钥派生是否与DEC中的密钥派生相同。

===编辑===

在回答评论时,不会,在给定相同的密钥和文明值的情况下,两个实现似乎不会计算相同的加密数据。调用

var reEncryptedData=Aes.Ctr.encrypt('hello there', charKey, 128, charCiv);

产生一个完全不同的加密字符串,即使考虑到CIV在加密文本中的前置,仍然比delphi端的输出长8个字节。

===编辑===

Aes.Ctr代码库(如上所述)正在使用CTR模式,我在delphi端做CBC。 -sigh -

再次感谢。

2 个答案:

答案 0 :(得分:1)

我确定这不是完整的答案,但它是其中的一部分。

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

所以,我有两个选择:在Delphi库中重新开发代码或从Delphi库构建DLL,并从dot net app调用它。我决定采用点网路径:在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字符串..

答案 1 :(得分:0)

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

两者都明确地产生正确的crpyted输出。

BTW:MEGA(KimDotCom)使用第一个进行文件加密。