2011-09-29 52 views
0

我想解碼從web服務得到的AES加密數據。 加密長度:4256個字節 解密的長度:4247個字節Android - AES解密失敗,奇怪的內容長度

Baiscally我想這是因爲一些填充或東西... 但確定。數據實際上可以很好地解密爲純文本。除了最後一些字符丟失。

什麼可能導致最後缺少的字符?

這纔是我的解密代碼:

public static byte[] decrypt(byte[] input) throws Exception { 
    byte[] rawKey = getKey("bla".getBytes()); 
    SecretKeySpec secretKeySpec = new SecretKeySpec(rawKey, "AES"); 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
    AlgorithmParameterSpec iv = new IvParameterSpec(new byte[] { 0, 0, 0, 
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }); 
    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, iv); 
    return cipher.doFinal(input); 
} 
+0

你(或者webservice,實際上)是否使用相同的模式(專門填充)進行加密? –

+1

另請注意:具有常數初始化向量的CBC不是安全模式。您希望爲每個消息使用一個新的隨機生成的初始化向量(並將其與消息一起傳輸)。 –

+0

我知道,但不幸的是我無法訪問服務器端代碼,這是在服務器端(.NET)使用的配置來執行加密。它似乎工作,因爲90%的文本解密相關... – Goddchen

回答

0

正如保羅說,問題是幾乎可以肯定的填充。建立一個沒有填充的測試方法decrypt():「AES/CBC/NoPadding」IIRC。解密相同的密文,並查看已添加到消息末尾的填充字節。這應該告訴你什麼填充(如果有的話)實際上被添加到消息中。

2

張貼這作爲一個答案,因爲它是一個評論:(

問題解決了太長時間,它從來就不是一個會導致錯誤。解密解密的罰款。

實際的問題是我,試圖將字符串轉換成JSON對象,而這是一個JSON陣列。

,在與掩蓋實際的JSON的錯誤消息4K字符logcat的限制相結合,並切斷我的調試消息(所以從來沒有人失蹤的任何字符)...