Android系统上AES解密的字符集错误

时间:2016-09-24 18:41:13

标签: java android encryption encoding 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;
}

代码完美无缺 - 只有变音符号显示不正确,例如(应该是“ö-ä-ü”):

umlauts bug

如何设置解密字符串的编码?在我的iOS应用程序中,我使用ASCII来编码已解码的下载字符串。这很完美! Android和iOS以相同的方式从同一个服务器获取字符串 - 所以我认为问题是上面的本地代码。

我希望你能帮我解决我的问题......谢谢!

1 个答案:

答案 0 :(得分:0)

没有文字,只有编码文字。

好像你在猜字符集和编码 - 这是无法沟通的。

要恢复文本,您需要使用与每个步骤关联的参数反转应用于该文本的原始过程。

为了便于说明,假设服务器正在从Java String中获取文本并将其安全地发送给您。

  1. String使用Unicode字符集(特别是Unicode< UTF-16编码)。
  2. 使用某些特定编码(例如ISO8859-1)获取String的字节数。 (UTF-8可能更好,因为它也是Unicode字符集的编码,而ISO8859-1的字符很少。)正如@Andy指出的那样,例外是你的朋友。
  3. 使用特定密钥加密字节。键是一个字节序列,因此,如果从字符串生成它,则必须使用特定的编码。
  4. 使用Base64对加密字节进行编码,生成带有字符子集的Java字符串(同样,UTF-16),使其可以在几乎任何字符编码中重新编码,并放置在任何上下文中,例如: SMTP,XML或HTML,不会被误解或使其无效。
  5. 使用特定编码传输字符串。 HTTP标头和/或HTML字符集值通常用于传达哪种编码。
  6. 要接收文字,你必须得到:

    • 字节,
    • 来自步骤5的编码,
    • 第3步中的密钥
    • 来自步骤3和
    • 的编码
    • 步骤2中的编码。

    然后您可以撤消所有步骤。根据您的评论,您发现自己没有使用第2步中的编码。您还需要使用第3步中的编码。