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()
.