2013-11-01 58 views
0

嗨想使用模塊隱窩從的NodeJS隱窩一些數據的NodeJS加密密碼AES256最大數據大小

這裏我的代碼

toCrypt = "message"; 

var cipher = crypto.createCipher('aes256', key); 
cipher.update(toCrypt, 'utf-8', 'base64'); 

var nowItisCrypted = cipher.final('base64'); 


var deCipher = crypto.createDecipher('aes256', key); 
deCipher.update(nowItisCrypted,'base64','utf-8'); 

var unCrypted = deCipher.final('utf-8'); 

,可以是包含在消息變量caracters的大小取決於關鍵的尺寸。 如果我發送一個過長的代碼,我得到了以下錯誤:

TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length 
at Decipher.Cipher.final (crypto.js:287:27 

有誰可以告訴我關鍵尺寸和郵件大小之間的關係。

回答

5

密鑰大小和消息大小之間沒有直接關係。密鑰大小與塊大小不同,不管密鑰大小如何,AES的大小都是128。即使在這種情況下,如果使用塊操作模式,塊大小也是很重要的。當您使用CBC時,塊大小爲的是正在使用。

但是,上述代碼的問題不在於塊大小或密鑰大小。檢查Cipher.update()方法的文檔:

返回加密的內容,並且可以在流式傳輸時使用新數據多次調用。

的問題是,你是假定該可以Cipher.update()方法要返回的數據可以被丟棄。只有當所有數據正在通過致電Cipher.final()的呼叫返回時纔是如此。

現在通常你不會得到這個異常,如果你輸出原始字節的數據;返回的數據總是x方向的塊大小的Cipher.update()Cipher.final()方法。任何理智的實現只是在塊被加密後才返回數據。所以你只需要解密最後一塊沒有錯誤。

這裏的另一個問題是base 64編碼不適用於塊大小或2的冪。它將3個字節編碼爲4個字符。換句話說,Cipher.final()可能會比整個塊返回多個字符。現在解密程序被要求比整個數據塊多解密幾個字節,所以它會失敗。

所以最後的解決方案;您應該將連續調用返回的密文連接到Cipher.update()Cipher.final()

+0

感謝您的幫助,它完美的工作 – goten

+0

只是另一個小問題。它是一種很好的做隱窩數據發送和api與以前的方法接收或它是沒有必要的。 – goten

+1

這取決於*用例*,在99%的*用例中*最好選擇TLS。如果在接收端存在填充oracle,上面的代碼對於發送密文是不安全的;接收方應在解密之前驗證(H)MAC。這些問題不在TLS中,因此請不要創建自己的安全傳輸層安全性。 –