我有一个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值作为加密文本的前八个字节,所以我只是:
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 -
再次感谢。
答案 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)使用第一个进行文件加密。