Javascript 使用Node.JS解密Rijndael(在使用Delphi和Delphi加密概要进行加密之后)

Javascript 使用Node.JS解密Rijndael(在使用Delphi和Delphi加密概要进行加密之后),javascript,delphi,node.js,encryption,Javascript,Delphi,Node.js,Encryption,我有一个delphi应用程序,它使用(DEC)加密一些数据。它工作得很好,我可以毫不费力地加密和解密。我正在使用Rijndael加密 我的挑战是使用Node.JS(使用crypto中的功能)解密用Delphi加密的数据。我已经看了StackOverflow的问题,我想我对我的问题有了更好的理解 我学到的是,我需要模拟DEC在节点端使用的键派生。我不能以任何方式覆盖或更改加密端。。我必须和已经存在的东西一起工作 我的问题是:DEC(给定一个键和iv)标准使用的是键派生,还是DEC库专门使用的?如果

我有一个delphi应用程序,它使用(DEC)加密一些数据。它工作得很好,我可以毫不费力地加密和解密。我正在使用Rijndael加密

我的挑战是使用Node.JS(使用crypto中的功能)解密用Delphi加密的数据。我已经看了StackOverflow的问题,我想我对我的问题有了更好的理解

我学到的是,我需要模拟DEC在节点端使用的键派生。我不能以任何方式覆盖或更改加密端。。我必须和已经存在的东西一起工作

我的问题是:DEC(给定一个键和iv)标准使用的是键派生,还是DEC库专门使用的?如果它是标准的,有没有人见过任何javascript代码在给定相同输入的情况下产生与DEC中的函数相同的输出

我看到部分密钥派生序列涉及对密钥进行散列(在本例中,是一个32字节的密钥,使用RipeMD-256进行散列)。我进一步看到,作为密钥派生过程的一部分,密钥的大小从32字节减少到16字节。我在Delphi代码中被绊倒的地方是DEC如何使用键和iv来派生实际用于递减的键

我很乐意用任何必要的代码来编辑这个。我希望熟悉DEC库和javascript/node.js的人能为我指明正确的方向

==编辑===

因此,在进行了一些额外的挖掘之后,我发现这是使用加密模块的另一种选择。作者将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); 产生一个完全不同的加密字符串,即使考虑到CIV对加密文本的前置,它仍然比delphi端的输出长8字节

==编辑===

Ctr代码库(如上所述)使用Ctr模式,我在delphi端进行CBC-叹息-


再次感谢。

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

两者都能产生正确的输出


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

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

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

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

如果有其他人走这条路,我会给大家介绍一些小道消息:

我的函数签名是:

function decrypt(encryptedData, key, iv: PAnsiChar): PAnsiChar; StdCall; Export;
public static extern IntPtr decrypt(string encryptedData, string key, string iv);
在C#中,函数签名是:

function decrypt(encryptedData, key, iv: PAnsiChar): PAnsiChar; StdCall; Export;
public static extern IntPtr decrypt(string encryptedData, string key, string iv);

调用后,您将IntPtr封送到ansi字符串。

确定这两个实现是否兼容难道不只是使用相同的密钥/iv对对两者进行加密并查看输出是否相同吗?问题已编辑以解决此问题。简单的回答是——不,它们不一样!听起来这些库中有一个不符合AES规范。因此,现在您需要找到第三个来确定哪一个有效,哪一个无效:),然后可能找到第四个来验证1&3的操作!