2016-09-24 20 views
0

晚上好!Android系統上的AES解密中的字符集錯誤

在我的android應用程序中,智能手機從我的服務器加載AES加密的字符串並將其存儲在一個變量中。在那個過程之後,變量和一個密鑰被傳遞給一個解密字符串的方法。我的錯誤是,德語變音符號(ä,ü,ö)未被正確解碼。所有的變音符號顯示爲黑色背景的問號......

我的代碼:

public static String decrypt(String input, String key) { 

    byte[] output = null; 
    String newString = ""; 

    try { 

     SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, skey); 
     output = cipher.doFinal(Base64.decode(input, Base64.DEFAULT)); 
     newString = new String(output); 

    } catch(Exception e) {} 

    return newString; 
} 

代碼工作完美 - 只有變音符號顯示不正常,一個例子是,(應該是「O型A-U 「):

umlauts bug

如何設置解密的字符串的編碼?在我的iOS應用程序中,我使用ASCII編碼解碼下載的字符串。這很好用! Android和iOS以相同的方式從相同的服務器獲取字符串 - 所以我認爲問題在於上面的本地代碼。

我希望你能幫我解決我的問題......謝謝!

+2

當您調用'String.getBytes()'和'new String(byte [])'。可能不是這裏的直接問題,但它會避免出現問題。 –

+0

(以及不吞嚥異常;並且首先不捕獲「異常」,而是捕獲拋出的特定異常) –

+0

謝謝!你的意思是String.getBytes(「UTF-8」)和'new String(byte [],「UTF-8」)'?我已經添加了兩個測試 - 沒有更改...感謝您的第二條評論中的提示! – Waldi

回答

0

沒有文本,但沒有編碼文本。

這似乎是你在猜測字符集和編碼 - 這是沒有辦法溝通。

要恢復文本,您需要使用與每個步驟關聯的參數來反轉應用於該文本的原始過程。

爲了說明,假定服務器正在從Java字符串中取文本並將其安全地發送給您。

  1. 字符串使用Unicode字符集(特別是Unicode的UTF-16編碼)。
  2. 獲取字符串的字節,使用一些特定的編碼,如ISO8859-1。 (UTF-8可能更好,因爲它也是Unicode字符集的編碼,而ISO8859-1的字符少得多。)@Andy指出,例外是你的朋友。
  3. 使用特定密鑰加密字節。關鍵是一個字節序列,所以,如果你從一個字符串產生這個字符,你必須使用特定的編碼。
  4. 使用Base64對加密字節進行編碼,生成一個Java字符串(同樣是UTF-16),其字符的子集減少到可以重新編碼爲幾乎任何字符編碼,並放置在任何上下文中,例如SMTP,XML或HTML,而不會被誤解或使其無效。
  5. 使用特定的編碼傳輸字符串。 HTTP頭和/或HTML charset值通常用於傳達哪種編碼。

要接收文本,你必須得到:

  • 字節,
  • 步驟5中的編碼,
  • 步驟3中的關鍵,
  • 從步驟中的編碼3和
  • 來自步驟2的編碼。

然後您可以撤消所有步驟。根據您的意見,您發現您沒有使用第2步中的編碼。您還需要使用第3步中的編碼。