gpt4 book ai didi

javascript - 使用 Node.JS 解密 Rijndael(使用 Delphi 和 Delphi Encryption Compendium 加密后)

转载 作者:搜寻专家 更新时间:2023-11-01 00:02:53 31 4
gpt4 key购买 nike

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

我的挑战是使用 Node.JS(使用加密中的功能)解密使用 Delphi 加密的数据。我查看了 StackOverflow 问题 Delphi DEC library (Rijndael) encryptionAES encrypt in Node.js Decrypt in PHP. Fail. ,我想我对我的问题的理解有所好转。

我学到的是,我需要在 Node 端模仿 DEC 使用的 key 派生。我无法以任何方式覆盖或更改加密方面。我必须使用已经存在的内容。

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

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

我很乐意使用任何必要的代码对其进行编辑。我希望熟悉 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);

But after all this, I'm left wondering if the key derivation in this library is the same as that in the DEC.

=== Edit ===

In answer to a comment, no, it appears the two implementations do NOT compute the same encrypted data given the same key and civ values. Calling

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

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

===编辑===

Aes.Ctr 代码库(上面提到)使用的是 CTR 模式,我在 delphi 端进行 CBC。 -叹息-

再次感谢。

最佳答案

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

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

因此,我有两个选择:在 Delphi 库中重新开发代码或从 Delphi 库构建一个 DLL,然后从 dot net 应用程序调用它。我决定走 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 字符串..

关于javascript - 使用 Node.JS 解密 Rijndael(使用 Delphi 和 Delphi Encryption Compendium 加密后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15095583/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com