2011-06-07 86 views
3

我遇到以下問題。我使用this代碼來加密C#中的示例文本,並且想要用java解密它。我使用下面的java代碼。使用java解密C#中的AES加密文件

byte[] IV = { 65, 1, 2, 23, 4, 5, 6, 7, 32, 21, 10, 11, 12, 13, 84, 45 }; 
byte[] KEY = { 0, 42, 2, 54, 4, 45, 6, 7, 65, 9, 54, 11, 12, 13, 60, 15 }; 
byte baData[] = new byte[1024]; 
int iRead = 0; 

SecretKeySpec key = new SecretKeySpec(KEY, "AES/CBC/PKCS5Padding"); 
Cipher cipher = Cipher.getInstance ("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(IV)); 

File file = new File("/sdcard", "SAMPLE.txt"); 

FileInputStream in = new FileInputStream(file); 
iRead = in.read(baData, 0, baData.length); 

String strResult = new String(cipher.doFinal(baData, 0, baData.length)); 

我明顯使用與C#示例中相同的IV和KEY值。上面的java代碼運行在android設備上,加密的二進制文件是sdcard上的SAMPLE.txt。 問題是解密後我沒有得到正確的數據。誰能告訴我我做錯了什麼?

謝謝。

回答

6

這裏有幾個問題:

您正在使用什麼編碼加密前的文本數據轉換成二進制
  • ?您當前使用的字符串構造函數將使用平臺默認的編碼 - 幾乎從來沒有一個好主意
  • 假設,爲read()單一的通話將讀到的一切 - 你不實際使用的iRead值後
  • 假設所有的數據將適合在一個1024字節的緩衝區

很難知道其中哪些是造成問題。

我強烈建議您使用CipherInputStream來包裝您的FileInputStream,然後使用適當的編碼將InputStreamReader包裝在內。然後,您可以使用諸如番石榴的CharStreams.toString()方法之類的東西來讀取從InputStreamReader到字符串的所有內容。

編輯:如前所述的意見,而所有這些潛在的問題,這裏還有目前正在製作的Cipher加密模式,而不是解密模式的代碼的問題。

+0

你對這些觀點是正確的,但我實際上正在測試一個我知道會很小的樣本數據。但真正的問題原來是我使用Cipher.ENCRYPT_MODE而不是Cipher.DECRYPT_MODE。一個愚蠢的錯誤,但我剛剛意識到這一點,因爲我正在修改你的觀點。謝謝你的幫助喬恩。 – black 2011-06-07 12:35:02

+0

@Sebouh:我已經編輯了我的答案,以指出未來的讀者。 – 2011-06-07 12:44:12