私はクライアント/サーバーシステム上で作業しています。私は基本的な暗号化をやろうとしています。サーバーに接続すると、ソケットを介してエスケープされた文字列として公開キーを送信します。私は文字列がと同じであることを確認しました。両端と改行とすべて。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の
アンドロイドで 'DEFAULT'の代わりに' Base64.NO_WRAP'を使ってみてください。 –
正しく動作しているのはアンドロイドです。 –
あなたはそれをアンドロイドでエンコードしていますか?もしあれば、Base64.NO_WRAPをAndroidのencodeメソッドで試してください –