2014-03-26 78 views
1

我的問題是,我編碼字符串在PHP與AES-256-CBC的m_crypt模塊使用Base64這樣的:AES-256-CBC加密PHP和解密的Node.js

function encrypt($data) { 
     if(32 !== strlen($this->secret)) $this->secret = hash('SHA256', $this->secret, true); 
     $padding = 16 - (strlen($data) % 16); 
     $data .= str_repeat(chr($padding), $padding); 

     $encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->secret, $data, MCRYPT_MODE_CBC, str_repeat("\0", 16)); 

     return base64_encode($encrypt); 
    } 

在哪裏$ this-> secret是一個32位的aes鍵,$ data是我想要加密的字符串。

這工作得很好,文本被加密併發送至服務器沒有任何問題(我檢查了兩次!),現在我想這件事與Node.js的這樣的解碼:

var decipher = Core.crypto.createDecipher('aes-256-cbc', rows[0]['sessionkey']); 
    decipher.update(body.user, 'base64', 'utf8'); 
    var user = decipher.final('utf8'); 

Core.crypto是Node.JS中普通加密模塊的require調用,rows [0] ['sessionkey']是用於通過mysql請求接收加密的密鑰,body.user是通過post請求發送的PHP加密字符串。

正如我所說的,一切正常,除了這個小小的decypt事...我搜索谷歌和一切,並嘗試過示例代碼,但似乎與我的代碼是不對的。

回答

0

好吧我自己想清楚了。我忘了設定的IV解密在Node.js的消息時,工作代碼如下所示:

var key = new Buffer(rows[0]['sessionkey'], 'binary'); 

function decipher(key, data) { 
    var decipher = Core.crypto.createDecipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16)); 
    decipher.update(data, 'base64', 'utf8'); 
    return decipher.final('utf8'); 
} 

我希望這將幫助任何人在未來!

最好問候