2014-03-26 49 views
1

我的问题是,我编码字符串在PHP与AES-256-CBC的m_crypt模块使用Base64这样的:AES-256-CBC加密PHP和解密的Node.js

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加密字符串。

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

回答

0

好吧我自己想清楚了。我忘了设定的IV解密在Node.js的消息时,工作代码如下所示:

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'); 
} 

我希望这将帮助任何人在未来!

最好问候