gpt4 book ai didi

php - Node.js aes128 加密/解密到 PHP 的端口

转载 作者:太空宇宙 更新时间:2023-11-03 22:48:12 25 4
gpt4 key购买 nike

所以在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 与所有可能的选项一起使用,但两者都不匹配(它们甚至不是相同的 block 大小)。在 PHP 中运行时,我尝试过对键进行散列/不散列、使用填充、在输入上使用计算的填充,其中填充的字符是所需的填充字符的数量(在网上看到一些内容说这是 Nodejs 使用的)。我尝试将 IV 设置为密码和空字节,但仍然无法匹配。

这里有什么建议/想法吗?

编辑:

所以我刚刚在 php 中发现了 openssl_encrypt 函数,并尝试了相同的测试,并再次得到了完全不同的输出(这个输出现在采用与 node.js 完全相同的参数,并且据说它们都使用 openssl):

 openssl_encrypt ( "test" , 'aes128' , "password")

输出(已经是base64)JleA91MvYHdEdnj3KYHmog==,它至少现在在 block 计数上匹配,但仍然不是相同的密文。

我还应该提到,是的,将 IV 传递给 Nodejs 是一种选择,并且可能会解决差异,但是 php 中的此方案将替换 NodeJS 中已经存在的旧方案,因此它必须能够解密已创建的密文

最佳答案

所以我找到了解决方案。查看node.js的c++源代码后,我发现key和iv是使用openssl函数EVP_BytesToKey生成的。在搜索该函数的实现后,我发现了这个堆栈溢出帖子 Encrypting data in Cocoa, decoding in PHP (and vice versa)其中包含此函数的一个版本。修改它并添加 openssl 版本用等于填充所需字节数的 ascii 字符填充数据的事实,我想出了以下完全匹配 nodejs 加密方案的函数:

function aes128Encrypt($key, $data) {
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);

$keySize = 16;
$ivSize = 16;

$rawKey = $key;
$genKeyData = '';
do
{
$genKeyData = $genKeyData.md5( $genKeyData.$rawKey, true );
} while( strlen( $genKeyData ) < ($keySize + $ivSize) );

$generatedKey = substr( $genKeyData, 0, $keySize );
$generatedIV = substr( $genKeyData, $keySize, $ivSize );

print($generatedIV);
print($generatedKey);

return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $generatedKey, $data, MCRYPT_MODE_CBC, $generatedIV);
}

与node.js函数完全匹配:

 function aes128Encrypt(key,data) {
var cipher = require('crypto').createCipher('aes128',key);
return cipher.update(data,'utf8','binary')+cipher.final('binary');
}

关于php - Node.js aes128 加密/解密到 PHP 的端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13393339/

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