【问题标题】:Decrypting Rijndael with Node.JS (after encrypting with Delphi & the Delphi Encryption Compendium)使用 Node.JS 解密 Rijndael(使用 Delphi 和 Delphi Encryption Compendium 加密后)
【发布时间】:2013-02-12 06:51:21
【问题描述】:

我有一个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值作为密文的前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。 -叹气-

再次感谢。

【问题讨论】:

  • 确定这两种实现是否兼容不只是使用相同的密钥/iv 对加密并查看输出是否相同吗?
  • 问题已被编辑以解决此评论。简短的回答是 - 不,它们不一样!
  • 听起来这些库之一不符合 AES 规范。所以现在你需要找到第三个来确定哪个有效,哪个无效:)
  • 然后可能是第四个来验证 1 和 3 的操作!

标签: javascript delphi node.js encryption


【解决方案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 字符串..

【讨论】:

    【解决方案2】:

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

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

    顺便说一句:第一个被 MEGA (KimDotCom) 用于他的文件加密。

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 1970-01-01
      • 2012-07-27
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多