studio how example encodetostring array java android base64

how - Java: resultados diferentes al descodificar la cadena base64 con java.util.Base64 vs android.util.Base64



how to decode base64 in java (2)

Estoy trabajando en un sistema cliente / servidor y estoy tratando de hacer un cifrado básico. Cuando me conecto al servidor, envío una clave pública como una cadena de escape a través del socket. He verificado que la cadena es idéntica en ambos extremos, líneas nuevas y todo.

En el cliente (Android), puedo usar las claves públicas / privadas para cifrar y descifrar con éxito una clave secreta (para propósitos de prueba). Sin embargo, el servidor falla al salir de la puerta al intentar decodificar la clave pública de una cadena a un byte [], con:

java.lang.IllegalArgumentException: Illegal base64 character a

lo que parece absurdo, ya que ''a'' es absolutamente un personaje base64, si lo entiendo correctamente. El cliente y el servidor utilizan una biblioteca compartida para manejar todo el cifrado, por lo que el código es casi idéntico. La única diferencia es la codificación / decodificación de cadenas base64, ya que java.util.Base64 no está disponible en Android.

Clase compartida

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

Métodos de cliente (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); }

}

Métodos de servidor (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); }

}


En Android, use Base64.NO_WRAP lugar de Base64.DEFAULT

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


En lugar de Base64.getDecoder() utiliza Base64.getMimeDecoder() .