2015-10-04 19 views
13

私はクライアント/サーバーシステム上で作業しています。私は基本的な暗号化をやろうとしています。サーバーに接続すると、ソケットを介してエスケープされた文字列として公開キーを送信します。私は文字列がと同じであることを確認しました。両端と改行とすべて。Java:java.util.Base64 vs android.util.Base64でbase64の文字列をデコードすると、結果が異なる

クライアント(Android)では、公開鍵/秘密鍵を使用して、テスト目的で秘密鍵の暗号化と復号化を成功させることができます。で、バイト[]に文字列から公開鍵を解読しようとしたときただし、サーバーは、右の門の外に失敗した:「」絶対にbase64で文字があれば、あるとして、非常識と思われる

java.lang.IllegalArgumentException: Illegal base64 character a 

私は正しく理解する。クライアントとサーバーは共有ライブラリを使用してすべての暗号化を処理するため、コードはほぼ同じです。 の違いは、Androidでjava.util.Base64を使用できないため、base64文字列をエンコード/デコードすることです。

共有クラス

public abstract class EasyCrypt { 

... 

    public PublicKey loadPublicKey(String key64) throws GeneralSecurityException { 

     byte[] data = decode(key64); //Calls abstract methods, shown below 

     X509EncodedKeySpec spec = new X509EncodedKeySpec(data); 
     KeyFactory fact = KeyFactory.getInstance("RSA"); 
     return fact.generatePublic(spec); 
    } 

... 

} 

クライアント(アンドロイド)メソッド

import android.util.Base64; 

public class ClientCrypt extends EasyCrypt { 
    @Override 
    protected byte[] decode(String s) { 
     return Base64.decode(s.getBytes(), Base64.DEFAULT); //Works perfectly 
    } 

    @Override 
    protected String encode(byte[] bytes) { 
     return Base64.encodeToString(bytes, Base64.DEFAULT); 
    } 

}

サーバー(Linux)の方法

import java.util.Base64; 

public class ServerCrypt extends EasyCrypt{ 
    @Override 
    public byte[] decode(String str){ 
     return Base64.getDecoder().decode(str); //Throws IllegalArgumentException 
    } 

    @Override 
    public String encode(byte[] bytes){ 
     return Base64.getEncoder().encodeToString(bytes); 
    } 

} Androidの

+2

アンドロイドで 'DEFAULT'の代わりに' Base64.NO_WRAP'を使ってみてください。 –

+0

正しく動作しているのはアンドロイドです。 –

+1

あなたはそれをアンドロイドでエンコードしていますか?もしあれば、Base64.NO_WRAPをAndroidのencodeメソッドで試してください –

答えて

26

、使用Base64.NO_WRAP代わりに

@Override 
protected String encode(byte[] bytes) { 
    return Base64.encodeToString(bytes, Base64.NO_WRAP); 
} 
+1

'NO_WRAP'に感謝します。 –

+0

@Mohammad Adil私はjava.util.Base64クラスでエンコードされたサーバーから文字列を取得しました。そして、希望の結果を得られないandroid.util.base64でその文字列をデコードしています。 plsは私を助けます –

+0

'Base64.NO_WRAP'のおかげで、Javaバックエンドで動作しています(java.util.Base64を使用しています)。 – shimatai

3

の代わりに使用Base64.getMimeDecoder()Base64.getDecoder()Base64.DEFAULT

関連する問題