gpt4 book ai didi

php - AES 在 PHP 中使用 OpenSSL 加密/在 Node.js 中解密

转载 作者:搜寻专家 更新时间:2023-10-31 20:47:00 24 4
gpt4 key购买 nike

我正在使用 PHP 和 Nodejs 使用 OpenSSL 进行对称加密。 PHP 使用 OpenSSL 库,Node.js 解密基于已实现的加密。问题是 Node.js 中的解密文本只是部分正确

PHP 加密函数

function encrypt($text, $pw, $base64 = true) {

$method = 'aes-256-cbc';
$iv_len = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($iv_len);

$pw = substr(md5($pw),0,32);

$cipher = openssl_encrypt ($text ,$method ,$pw ,!$base64 ,$iv );

if($base64) {
$pw = base64_encode($pw);
$iv = base64_encode($iv);
}

return array(
'iv' => $iv,
'pw' => $pw,
'text' => $text,
'cipher' => $cipher
);
}

nodejs中的解密

var cipher = new Buffer(data.cipher, 'base64');
var iv = new Buffer(data.iv, 'base64');
// the password is the same returned by the php function, so 100% correct
var key = new Buffer(data.pw, 'base64');

var dec = crypto.createDecipheriv('aes-256-cbc',key,iv);
var dec_data = dec.update(cipher,'binary','utf8');

// the script is based on socket.io
socket.emit('debug',{decrypted : dec_data});

结果

# Encrypting in php...
>> encrypt('1. Lorem ipsum dolor sit amet! 2. Lorem ipsum dolor sit amet!', 'password');

# ...makes nodejs giving me something like
>> 1, 6+r@o ipsum /olor sit amet! 2. Lorem ipsum do

我猜这个问题可能与填充有关 - 但老实说:我不知道。

感谢阅读帮助!

最佳答案

在您的 Node 代码中,您遗漏了消息的最后部分:

var dec = crypto.createDecipheriv('aes-256-cbc',key,iv);
var dec_data = dec.update(cipher,'base64','utf8') + dec.final('utf8');

此外,使用 base64 进行解码,而不是二进制(因为您可能会陷入此处提到的场景 https://stackoverflow.com/a/8770975/3739618)

我在另一篇文章中有这个示例代码,请查看: https://stackoverflow.com/a/28181444/3739618

问候,伊格纳西奥

关于php - AES 在 PHP 中使用 OpenSSL 加密/在 Node.js 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12027847/

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