我的问题是我在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事情......我搜索谷歌和一切并尝试了示例代码,但似乎我的代码不对。
答案 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');
}
我希望这将有助于将来的任何人!
最好的问候