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

时间:2014-03-26 16:54:55

标签: php node.js cryptography aes

我的问题是我在PHP中编码一个字符串,使用aes-256-cbc中的m_crypt模块和base64这样编码:

    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是PHP加密的字符串发送通过邮寄请求。

正如我所提到的,一切正常,除了这个小小的decypt事情......我搜索谷歌和一切并尝试了示例代码,但似乎我的代码不对。

1 个答案:

答案 0 :(得分:0)

好的我自己弄清楚了。我在解密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');
}

我希望这将有助于将来的任何人!

最好的问候