2015-06-29 50 views
0

我試圖使用NodeJS解密一些數據。在.NET中使用零填充進行AES加密並使用Node.js解密

此數據是用C#和AES-CBC-256算法創建的。 keySize和blockSize是256,填充是ZeroPadding

我不能」與Node.js的解密,錯誤的是:

Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length 

這裏是我的javascript代碼:

decipher = crypto.createDecipheriv('aes-256-cbc', key, iv.slice(0, 16)); 
decrypted = decipher.update(encryptedPayloadBuffer, 'base64', 'ascii'); 
decrypted += decipher.final('ascii'); 
decipher = null; 

return decrypted; 

我使用庫 「加密」。我在某處讀到node.js解密只適用於PKSC7填充。這是真的嗎?我不能在C#項目中改變任何東西,我必須在節點端找到解決方案。

你能幫助我嗎?

編輯:我試圖用這個來禁用autoPadding:

decipher.setAutoPadding(false); 
//next line of code: 
//decrypted = decipher.update(encryptedPayloadBuffer, 'base64', 'ascii'); 

但我收到此錯誤:

Error: error:0606508A:digital envelope routines:EVP_DecryptFinal_ex:data not multiple of block length 
+1

如果您的塊大小爲256位,則不是AES。請明確你正在使用什麼。 –

+0

@ ArtjomB。很可能您可以強制執行C#AES實現來執行Rijndael-256,但我不確定。 –

+0

@ArtjomB我相信這是AES。這是實施:https://gist.github.com/VivienAdnot/e9a96fea04bccfa613ec –

回答

0

AES和Rijndael之間有區別。兩者都指定了128位,192位和256位的密鑰大小,但只有Rijndael提供了所有三種塊大小:128,192和256位。 AES實際上是固定塊大小爲128位的Rijndael。

Node.js使用OpenSSL提供所有可用的密碼(crypto.getCiphers())。如果你的版本沒有可用的rijndael實現,那麼你不能使用node.js的Crypto模塊。您需要找到一個實現Rijndael的節點模塊,或者只需在您的C#代碼中將塊大小設置爲128位。

+0

謝謝,我現在明白了這個問題。我搜索了另一個節點模塊,而不是加密,但目前我找不到一個模塊。我希望有人知道它,並會寫在這裏。 –

0

一看Crypto Node.js doc發現這一點:

decipher.setAutoPadding(auto_padding=true)

You can disable auto padding if the data has been encrypted without standard block padding to prevent decipher.final from checking and removing it. Can only work if the input data's length is a multiple of the ciphers block size. You must call this before streaming data to decipher.update.

嘗試decipher.setAutoPadding(false)之前decipher.update.

+0

不要忘記解密後刪除零填充。 –

+2

@Jim洪水。感謝您的回答。我已經試過了,但是我遇到了這個錯誤:數據不是塊長度的多倍 –

相關問題