web-dev-qa-db-ja.com

Java:Java.util.Base64とAndroid.util.Base64でbase64文字列をデコードした場合の結果が異なる

私はクライアント/サーバーシステムで作業しており、いくつかの基本的な暗号化を試みています。サーバーに接続するとき、公開キーをエスケープ文字列としてソケットを介して送信します。文字列がidenticalであること、両端、改行、すべてであることを確認しました。

クライアント(Android)では、公開キー/秘密キーを使用して、秘密キーを正常に暗号化および復号化できます(テスト目的)。ただし、公開キーをStringからbyte []に​​デコードしようとすると、サーバーはゲートからすぐに失敗します。

 Java.lang.IllegalArgumentException: Illegal base64 character a

私が正しく理解すれば、 'a'は絶対にbase64文字なので、これはばかげているようです。クライアントとサーバーは共有ライブラリを使用してすべての暗号化を処理するため、コードはほぼ同じです。 Java.util.Base64はAndroidでは使用できないため、onlyの違いは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);
    }

...

}

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

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);
    }

}

25
Parker Kemp

Androidでは、Base64.NO_WRAP の代わりに Base64.DEFAULT

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

Base64.getDecoder()の代わりにBase64.getMimeDecoder()を使用します。

9
S Shepard