2017-08-30 53 views
0

在PHP中,我使用的mcrypt到我的字符串密鑰來加密和LV ...現在我即時通訊移植我的PHP代碼項目節點js和需要得到在同一加密字符串像在PHP的JavaScript ...我的數據是這樣的:的Rijndael-128 CBC JavaScript不喜歡PHP的mcrypt返回正確

lv:  968kjnv0myizvjio 
key:  9qdx524o5rzytekr 
string: androidtest 
encoding: rijndael-128 
mode:  cbc 

在PHP中我得到這個正確的加密字符串: 9620825aa10ce13d9e886b6dec146074

在javascript中(節點庫)我得到這個: 6c6943435771454d34543265694774743742526764413d3d

我的代碼是這樣的:

var MCrypt = require('mcrypt').MCrypt; 

var desEcb = new MCrypt('rijndael-128', 'cbc'); 
desEcb.open('9qdx524o5rzytekr', '968kjnv0myizvjio'); // we are set the key and lv 

var ciphertext = desEcb.encrypt('androidtest'); 
console.log(bin2hex(ciphertext.toString('base64'))); 

function bin2hex(s) { 
    var i 
    var l 
    var o = '' 
    var n 
    s += '' 
    for (i = 0, l = s.length; i < l; i++) { 
     n = s.charCodeAt(i).toString(16) 
     o += n.length < 2 ? '0' + n : n 
    } 
    return o 
} 

我即時通訊使用這個庫:

https://github.com/tugrul/node-mcrypt 

我怎樣才能像PHP上面貼同樣的結果在節點JS(JavaScript)的? 或者你知道另一個在節點js中工作以獲得與PHP相同結果的庫嗎? 或者,也許編寫自定義函數來獲取上述存檔?

+0

你有沒有注意到javascript的結果,每個十六進制數字對都在可打印的ascii範圍內,最後兩個對是ascii'=='...看起來像一個base64字符串轉換爲十六進制... if你解碼base64 ...猜你會得到:p –

+0

所以,這應該告訴你爲什麼'ciphertext.toString('base64')'不是正確的做 –

+0

我即時通訊新的解碼的東西...在PHP我得到正確的值,所以我的Android設備解碼成功...所以我需要刪除base64? – John

回答

1

首先,密文不轉換爲base64 - 你不這樣做在PHP中,所以這是不同的

一個點,你不需要你bin2hex功能,因爲節點可以爲您

var ciphertext = desEcb.encrypt('androidtest'); 
console.log(ciphertext.toString('hex')); //9620825aa10ce13d9e886b6dec146074