Nodejs中的AES加密不能像在PHP中一样工作

时间:2013-11-22 11:00:54

标签: node.js aes

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

2 个答案:

答案 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支持的所有可能的编码(即utf8asciiutf16leucs2)。它们都没有产生你按预期给出的字符串。

所以,虽然这不是一个真正的答案,但我希望这无论如何都能帮助你,至少迈向正确的方向。