2012-05-23 64 views
1

我想解密使用C#中的Bouncy Castle庫進行加密的數據。在Java中(與充氣城堡庫再次)被加密的數據可以與Java進行解密。我使用的是相同的密鑰和參數,但是當我到達DoFinal我得到的錯誤「損壞的焊盤塊」。Bouncy Castle不解密Java中的DoFinal C#

這裏是Java:

KeyParameter keyParam = new KeyParameter(key); 
CipherParameters param = new ParametersWithIV(keyParam, initVector); 

BlockCipherPadding padding = new PKCS7Padding(); 
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()), padding); 
cipher.reset(); 
cipher.init(true, param); 

byte[] fileBytes = Base64.decodeBase64(decryptedStringData); 
byte[] encrypted = new byte[cipher.getOutputSize(fileBytes.length)]; 
int l = cipher.processBytes(fileBytes, 0, fileBytes.length, encrypted, 0); 
l += cipher.doFinal(encrypted, l); 

return (Base64.encodeBase64String(encrypted)); 

這裏是C#:

KeyParameter keyParam = new KeyParameter(key); 
ICipherParameters param = new ParametersWithIV(keyParam, initVector); 

IBlockCipherPadding padding = new Pkcs7Padding(); 
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(new AesEngine()), padding); 
cipher.Reset(); 
cipher.Init(false, param); 

byte[] fileBytes = Convert.FromBase64String(encryptedDataString); 
byte[] decrypted = new byte[cipher.GetOutputSize(fileBytes.Length)]; 
int l = cipher.ProcessBytes(fileBytes, 0, fileBytes.Length, decrypted, 0); 
l += cipher.DoFinal(decrypted, l); 

return(Convert.ToBase64String(decrypted)); 

我生成基於​​已緩存的哈希鍵一個32字節的PBK ...但是,我們檢查了Java和C#之間生成的密鑰,它們是相同的。

+0

您是否確認兩種情況下加密數據的長度是相同的? –

+0

是加密的數據是相同的長度時帶入C#或Java –

+0

對我的作品的罰款。我猜想你的鑰匙或你的IV是錯誤的。 –

回答

1

事實證明,用於加密和解密的數據以不同的格式編碼。我使用UTF-8編碼的字符串進行解密,並且首先需要將它們編譯爲Base64字符串。感謝您提供的所有幫助。

相關問題