LockBox / Node Crypto compatibility

时间:2016-02-12 20:35:02

标签: node.js delphi cryptography lockbox-3 node-crypto

I'm trying (and failing) to decipher in Delphi usung LockBox 3 a message that was encrypted using Node.js' crypto library.

node.js code:

$previous = $_SERVER['HTTP_REFERER'];

The result from that is

var crypto = require('crypto');
var cipher = crypto.createCipher('aes-256-ctr', 'my password');
var crypted = cipher.update('hello world', 'utf8', 'base64');
crypted += cipher.final(output_encoding);
console.log(crypted);

Delphi code:

oyC1KRVx3JZBLlI=

What am I missing?

1 个答案:

答案 0 :(得分:2)

有什么问题?

问题是两个库在内部使用不同的密钥和初始化向量(IV)。

请记住,AES密码不适用于密码,但密钥和IV。

当您为加密库提供密码时,它使用一些内部机制来自动导出密钥和IV。

这种机制并不明显,但通常在加密库文档中有所描述。

cryptonode.js模块的文档说它正在使用OpenSSL的EVP_BytesToKey函数来获取密钥和IV:

  

crypto.createCipher(算法,密码) - 创建并返回密码   使用给定算法和密码的对象。

     

...

     

密码用于派生密钥和初始化   矢量(四)。该值必须是'二进制'编码的字符串或   [缓冲[]。

     

crypto.createCipher()的实现使用。来派生密钥   OpenSSL函数EVP_BytesToKey,摘要算法设置为 MD5,   一次迭代,没有盐。缺少盐允许字典攻击   因为相同的密码始终创建相同的密钥。低迭代   计数和非加密安全散列算法允许密码   快速测试

引自Node.js v5.6.0 Documentation

如何解决问题?

正确的解决方案是使用加密安全散列算法从密码中导出密钥,然后手动将密钥和IV提供给加密库,无论哪个。

快速而肮脏(且高度不安全)的解决方案是找到一个等同于EVP_BytesToKey的Delphi例程,并使用它来使其工作。

请记住还要检查您是否使用相同的填充方案。 TCodec应该允许您选择PaddingScheme padPKCSnode.js应该与node.js中加密模块使用的{{1}}兼容。如果它不起作用也尝试其他选项。

另一个选择是在Delphi中使用OpenSSL,它应该已经与{{1}}中使用的内容兼容。

此外,请查看此问题与您的问题类似: