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?
答案 0 :(得分:2)
问题是两个库在内部使用不同的密钥和初始化向量(IV)。
请记住,AES密码不适用于密码,但密钥和IV。
当您为加密库提供密码时,它使用一些内部机制来自动导出密钥和IV。
这种机制并不明显,但通常在加密库文档中有所描述。
crypto
中node.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
padPKCS
,node.js
应该与node.js
中加密模块使用的{{1}}兼容。如果它不起作用也尝试其他选项。
另一个选择是在Delphi中使用OpenSSL,它应该已经与{{1}}中使用的内容兼容。
此外,请查看此问题与您的问题类似: