[英]AES-256-CBC encryption in PHP and decryption in Node.js
我的问题是我在aes-256-cbc中的m_crypt模块中使用base64在PHP中编码字符串,如下所示:
function encrypt($data) {
if(32 !== strlen($this->secret)) $this->secret = hash('SHA256', $this->secret, true);
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
$encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->secret, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16));
return base64_encode($encrypt);
}
其中$ this-> secret是32位AES密钥,而$ data是我要加密的字符串。
这可以正常工作,对文本进行加密并毫无问题地发送到服务器(我检查了两次!),现在我想用Node.JS解码整个内容,如下所示:
var decipher = Core.crypto.createDecipher('aes-256-cbc', rows[0]['sessionkey']);
decipher.update(body.user, 'base64', 'utf8');
var user = decipher.final('utf8');
其中Core.crypto是Node.JS中普通加密模块的require调用,rows [0] ['sessionkey']是用于通过mysql请求获取的加密密钥,而body.user是通过post请求发送的PHP加密字符串。
正如我提到的,除了这行小片段之外,其他所有东西都工作正常……我搜索了google,并尝试了所有示例代码,但似乎我的代码不正确。
好吧,我自己弄清楚了。 我在解密Node.js中的消息时忘记设置iv,工作代码如下所示:
var key = new Buffer(rows[0]['sessionkey'], 'binary');
function decipher(key, data) {
var decipher = Core.crypto.createDecipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16));
decipher.update(data, 'base64', 'utf8');
return decipher.final('utf8');
}
希望这对以后的任何人都有帮助!
最好的祝福
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.