NODE.JS代码(不按预期工作)
var crypto = require('crypto');
var input = '200904281000001|DOM|IND|INR|10|orderno_unique1|others|http://localhost/sample/Success.php|http://localhost/sample/failure.php|TOML';
var Key = "qcAHa6tt8s0l5NN7UWPVAQ==";
Key = new Buffer(Key || '', 'base64');
var cipher = crypto.createCipher('aes128', Key);
var actual = cipher.update(input, "utf8", "base64");
actual += cipher.final("base64");
console.log(actual);
实际输出
bIK4D0hv2jcKP3eikoaM7ddqRee + RrT2FDOZA + c2sldyrqP + NrmgYOEXklUrSBQiU7w7e90nzFl / mpidy / Q8FD692bFLnESiNqGEQ7er44BXxFtNo6AKvpuohz31zm9JupJXL3jhOC + 47mvDHokR4b9euDzPFitTJQW55JuSyvJphOKdiXjH + lGKxXKWsODq
预期输出
NCJ + HX6zIdrUfEedi7YC82QOUARkySblivzysFbMqaYEMPj7UfMlE4SEkDcjg + D9dE5StGJgebSOkL7UuR6fXwodcgL0CSRds0Y + hX27gKUZK45b7Tc0EjXhepwHJ / olSdWUCkwRcZcv + wxtYzOH7 + KKijJabJkU1 / SF1ugExzcnqfV2wOZ9q79a4y / g3cb5
PHP代码(按预计工作)
include('CryptAES.php');
//Testing key
$Key = "qcAHa6tt8s0l5NN7UWPVAQ==";
//requestparam Testing - TOML
$input ="200904281000001|DOM|IND|INR|10|unique_10005|others|http://www.yourdomain.com/paymentSuccess.php|http://www.yourdomain.com/paymentFailure.php|TOML";
$aes = new CryptAES();
$aes->set_key(base64_decode($key));
$aes->require_pkcs5();
echo $aes->encrypt($input);
答案 0 :(得分:4)
使用PHP内置的mcrypt库存在一个已知问题。它以与node.js不同的方式填充密钥。几个月前这个问题让我很烦恼,而且有一个workaround here。我所做的是使用一个小的php命令行脚本与我的node.js应用程序来处理加密和解密。
答案 1 :(得分:2)
首先,您的两个输入字符串是不同的。在Node.js上,您正在使用
200904281000001|DOM|IND|INR|10|orderno_unique1|others|
http://localhost/sample/Success.php|
http://localhost/sample/failure.php|TOML
而在PHP上则是:
200904281000001|DOM|IND|INR|10|unique_10005|others|
http://www.yourdomain.com/paymentSuccess.php|
http://www.yourdomain.com/paymentFailure.php|TOML
它们在域中以及第一行中的倒数第二个字符串不同。然后,您不解释PHP中CryptAES
函数的来源。由于您没有指定任何参数,因此只能猜测它是128位的AES。它的默认值是什么?使用什么样的填充? CBC模式还是EBC模式? ...?
对目前无法回答的问题的疑问。
为了进行测试,我编写了一个小的Node.js脚本,它接受了两个输入字符串,并尝试在Node.js中使用所有密码(您可以使用crypto.getCiphers()获取它们)结合Node.js支持的所有可能的编码(即utf8
,ascii
,utf16le
和ucs2
)。它们都没有产生你按预期给出的字符串。
所以,虽然这不是一个真正的答案,但我希望这无论如何都能帮助你,至少迈向正确的方向。