问题原因
问题的原因其实很简单,就是因为在进行mcrypt_encrypt()时,php会在加密后的明文后面增加\0字符,因为不同语言对于\0可能是有不同的处理方式,结果导致无法解密的问题:
问题代码
$data = array('key'=>'val');
$privKey = 'xxxxxxxxxxxxxxxx';
$iv = 'yyyyyyyyyyyyyyyy';
$jsonData = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$enc = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privKey, $jsonData, MCRYPT_MODE_CBC, $iv)); // 输出结果: 'zzzzzzz\0\0\0\0\0'
修复方案
$padding = 16 - (strlen($jsonData) % 16);
$jsonData .= str_repeat(chr($padding), $padding);
$enc = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privKey, $jsonData, MCRYPT_MODE_CBC, $iv));
最后NodeJS使用标准的crypto库便可以解密了,其他语言我没有试,但是如果出问题也应该差不多都是因为zeropadding的原因导致。