2016-09-24 3 views
0

Добрый вечер!Ошибка Charset в AES Decryption на Android-системе

В моем приложении 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

Как я могу установить кодировку расшифрованного String? В моем приложении 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-кодировки обычно используется для связи с этой кодировкой.

Чтобы получить текст, вы должны получить:

  • байт,
  • кодирования с шагом 5,
  • ключа с шага 3,
  • при кодировании с шага 3 и
  • кодировка с шага 2.

Затем вы можете отменить все этапы. По вашим комментариям вы обнаружили, что вы не использовали кодировку с шага 2. Вам также необходимо использовать кодировку с шага 3.