繁体   English   中英

PHP中的AES-256-CBC加密和Node.js中的解密

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM