【发布时间】:2012-11-15 07:49:14
【问题描述】:
所以在 node.js 中,我有一个使用 aes128 且不通过 IV 的加密方案。一个例子如下
var cipher = require('crypto').createCipher('aes128','password');
cipher.update('test','utf8','base64')+cipher.final('base64');
输出CjZ3R/tW8jiyLvg+/TE6bA==。问题是即使我尝试了一堆实现和变体,我也无法在 PHP 中重现这一点。
当我尝试通过 openssl 运行它时,我运行以下命令:
echo "test" | openssl enc -e -aes128 -a -k password
输出 U2FsdGVkX19Ccfv3SWvuzuZWeov9GDuwx1RMK2HWa/s= 也不匹配。我也尝试过将-md 与所有可能的选项一起使用,但两者都不匹配(它们甚至不是相同的块大小)。在 PHP 中运行时,我尝试过对键/非散列进行散列,使用填充,在输入上使用计算的填充,其中填充字符是所需的填充字符数(在网上看到一些东西说这是 nodejs 使用的)。我已经尝试将 IV 设置为密码和空字节,但仍然无法匹配。
这里有什么建议/想法吗?
编辑:
所以我刚刚在 php 中发现了函数 openssl_encrypt 并通过它尝试了相同的测试,并再次得到了完全不同的输出(这个现在与 node.js 采用完全相同的 args 并且据说它们都使用 openssl):
openssl_encrypt ( "test" , 'aes128' , "password")
哪个输出(已经在 base64 中)JleA91MvYHdEdnj3KYHmog== 至少现在在块数上匹配但仍然不是相同的密文。
我还应该提到,是的,将 IV 传递给 nodejs 是一种选择,并且可能会解决差异,但是 php 中的这个方案将替换 nodejs 中已经存在的旧方案,因此它必须能够解密已经创建的密文
【问题讨论】:
-
您是否检查过 OpenSSL 和 PHP 是否都生成了 IV?
-
我认为他们都这样做了,不管我刚刚发现 openssl_encrypt ,我都希望这个可以按预期工作,因为它现在使用实际的 aes128 而不是 MCRYPT_RIJNDAEL_128 但仍然不匹配
标签: php node.js encryption openssl aes