2014-05-13 55 views
0

下面的代碼給中差解密錯誤Node.js的加密拋出錯誤

vaultEngine.AESDecrypt = function (encKey, data) { 
    var cipherObject = crypto.createDecipheriv('aes-256-cbc', encKey, "a2xhcgAAAAAAAAAA"); 
    var Fcontent = cipherObject.update(data, vaultEngine.outputEncoding, vaultEngine.inputEncoding); 
    Fcontent += cipherObject.final(vaultEngine.inputEncoding); 
    //console.log("Decryption data is:"+Fcontent); 
    return Fcontent; 
} 

具體這個錯誤:

TypeError: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decr 
ypt 

回答

1

所有

我很擔心:第一,你的IV是硬編碼直接進入你的方法,這表明你使用相同的IV進行每種加密,這是壞壞的。 IV應該是密碼隨機的(不可預知的),並且對於每種加密都是不同的。您可以將它與您的加密文本一起存儲,然後將它拉出來用於解密,但不應該使用相同的IV。如果你犯這樣的錯誤,這表明你需要做更多的研究,如何適當地使用加密,以便它實際上保護你打算保護的數據。 Start here

現在來嘗試解決直接解決你的問題:


According to the docs看起來你已經轉變了input encodingoutput encoding變量,它應該是:

var Fcontent = cipherObject.update(data, vaultEngine.inputEncoding, vaultEngine.outputEncoding); 
Fcontent += cipherObject.final(vaultEngine.outputEncoding); 

...如果這不起作用,我會推薦以下更改:

  1. 在您的cipherObject上使用流處理write()end()方法,而不是傳統的update()final()方法。由於使用節點流更新(see here),crypto模塊被視爲「不穩定」,因此傳統方法可能會保留,但如果引入突變更改,它們將是斬波塊中的第一個。
  2. 在發送數據進行解密之前,根據您的數據創建緩衝區。這將確保你正確創建了緩衝區,將最大限度地減少在解密階段所需的工作:

var dataBuffer = new Buffer(data, vaultEngine.inputEncoding); 
cipherObject.write(dataBuffer); 
cipherObject.end(); 
return cipherObject.read().toString(vaultEngine.outputEncoding);