2016-09-24 10 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; 
} 

はコードが完璧に動作します - だけウムラウトが正しくない表示され、例は、(「O-A-üでなければならないことです「):

私は復号化された文字列のエンコーディングを設定するにはどうすればよい

umlauts bug

?私のiOSアプリケーションでは、デコードされたダウンロードされたStringをエンコードするためにASCIIを使用します。それは完璧に動作します! AndroidとiOSは同じ方法で同じサーバーからStringを取得します。そのため、問題は上記のローカルコードです。

私の問題で私を助けてくれることを祈っています...ありがとう!

+2

'String.getBytes()'と 'new String(byte []) '。ここで直面する問題ではないかもしれませんが、それは道に沿って問題を避けるでしょう。 –

+0

(例外を飲み込むのではなく、最初に「例外」をキャッチせず、むしろ投げられる特定の例外をキャッチします) –

+0

ありがとう! 'String.getBytes(" UTF-8 ")'と '新しい文字列(byte []、" UTF-8 ")を意味しますか?私は両方のテストを追加しました - 変更はありません...あなたの2番目のコメントにあなたのヒントをありがとう! – Waldi

答えて

0

テキストはありませんが、エンコードされたテキストです。

あなたは文字セットとエンコーディングを推測しているようですが、これは通信する方法ではありません。

テキストをリカバリするには、各ステップに関連付けられたパラメータを使用して、元のプロセスを元に戻す必要があります。

説明のために、サーバーがJava Stringからテキストを取り出して安全に送信しているとします。

  1. 文字列は、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のcharset値は、通常、どのエンコーディングを伝えるのに使用されます。

テキストを受信するには、あなたが取得する必要があります:

  • バイト、
  • をエンコードステップ5から、
  • ステップ3からキー、
  • エンコーディング段階から3および
  • 手順2からのエンコーディング。

次に、すべての手順を逆にすることができます。あなたのコメントでは、ステップ2のエンコーディングを使用していないことがわかりました。また、ステップ3のエンコーディングを使用する必要があります。

関連する問題