2016-09-24 2 views
0

안녕하세요!Android 시스템의 AES 암호 해독에서 문자 세트 버그

내 안드로이드 앱에서 스마트 폰은 내 서버에서 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; 
} 

이 코드는 완벽하게 작동합니다 - 단지 움라우트가 제대로되지 표시 예는 ("오-A-ü해야한다는 것입니다 ") :

내가 해독 된 문자열의 인코딩을 설정하는 방법

umlauts bug

? 내 IOS 응용 프로그램에서 나는 ASCII를 사용하여 디코딩 된 다운로드 문자열을 인코딩합니다. 그건 완벽하게 작동합니다! Android와 iOS는 같은 방식으로 동일한 서버에서 문자열을 얻습니다. 그래서 문제는 위의 지역 코드입니다.

내 문제를 해결할 수 있기를 바랍니다 ... 감사합니다.

+2

'String.getBytes()'및'new String (byte [])'. 당장의 문제는 아니 겠지만, 문제가 발생하지는 않을 것입니다. –

+0

(예외를 삼키지 않고 처음에는 예외를 잡는 것이 아니라 특정 예외를 잡는 것) –

+0

감사합니다! 'String.getBytes ("UTF-8")'과'새로운 String (byte [], "UTF-8")'을 의미합니까? 두 가지를 추가하여 테스트 해 보았습니다. 변경 사항 없음 ... 두 번째 주석에 대한 힌트를 주셔서 감사합니다! – Waldi

답변

0

텍스트가 아니라 인코딩 된 텍스트가 있습니다.

문자 집합과 인코딩을 추측하고있는 것 같습니다. 의사 소통 할 방법이 없습니다.

텍스트를 복구하려면 각 단계와 관련된 매개 변수를 사용하여 텍스트를 적용한 원래 프로세스를 되돌려 야합니다.

설명을 위해 서버가 Java String에서 텍스트를 가져 와서 안전하게 보내고 있다고 가정합니다.

  1. 문자열은 유니 코드 문자 집합 (특히 유니 코드의 UTF-16 인코딩)을 사용합니다.
  2. 특정 인코딩 (예 : ISO8859-1)을 사용하여 문자열의 바이트를 가져옵니다. (ISO8859-1은 문자 수가 적지 만 유니 코드 문자 집합의 인코딩이기 때문에 UTF-8이 더 좋을 수 있습니다.) @Andy가 지적했듯이 예외는 여기에있는 친구입니다.
  3. 바이트를 특정 키로 암호화하십시오. 키는 일련의 바이트이므로 문자열에서이 키를 생성하는 경우 특정 인코딩을 사용해야합니다.
  4. 암호화 된 바이트를 Base64로 인코딩하여 문자의 하위 집합으로 Java 문자열 (다시 UTF-16)을 생성하면 거의 모든 문자 인코딩에서 다시 인코딩 할 수 있으며 다음과 같은 모든 컨텍스트에 배치 할 수 있습니다. SMTP, XML 또는 HTML을 잘못 해석하거나 무효화하지 않아야합니다.
  5. 특정 인코딩을 사용하여 문자열을 전송하십시오. HTTP 헤더 및/또는 HTML charset 값은 일반적으로 어떤 인코딩을 전달하는 데 사용됩니다.

    • 바이트,
    • 5 단계에서 인코딩,
    • 3 단계에서 키,
    • 단계에서 인코딩을 :

텍스트를 받으려면 가야 3 및

  • 2 단계의 인코딩.
  • 그런 다음 모든 단계를 되돌릴 수 있습니다. 귀하의 의견에 따라 2 단계의 인코딩을 사용하지 않는다는 것을 알게되었습니다. 또한 3 단계의 인코딩을 사용해야합니다.