2013-11-22 46 views
2

Node.js的代碼工作(不起作用如預期)的NodeJS AES加密不起作用,因爲它在PHP

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 CODE(按預期方式工作)

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

如何獲取CryptAES.php? – user568109

+1

請注意,您使用AES錯誤,您必須**使用初始化向量。 –

回答

4

使用PHP的內置mcrypt庫存在一個已知問題。它以與node.js不同的方式填充密鑰。這個問題在幾個月前困擾了我很多,並且有一個workaround here。我所做的是使用一個小型的php命令行腳本和我的node.js應用程序來處理加密和解密。

+0

我們正在與支付網關進行整合,編碼後的字符串由此提供。他們使用與多個客戶端(JAVA,PHP等)相同的代碼,所以它絕對不是PHP唯一的問題。 – Rajiv

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的功能來自哪裏。由於您沒有指定任何參數,因此只能猜測它是128位的AES。它的默認值是什麼?使用什麼樣的填充? CBC模式還是EBC模式? ...?

問題現在還不能回答。

爲了測試,我寫了一個小的Node.js腳本,需要雙方你輸入的字符串,並在Node.js的嘗試提供所有密碼結合所有可能的編碼(您可以將它們使用crypto.getCiphers()得到)的Node.js支持(即,utf8asciiutf16leucs2)。他們中沒有一個導致你按預期給出的字符串。

所以,雖然這不是一個真正的答案,但我希望這無論如何可以幫助你,至少向正確的方向邁出一小步。

+0

感謝Golo。在放棄之前,我們也嘗試了所有的密碼。沒有密碼給出了我們期待的結果。 – Rajiv