Sto lavorando su un sistema client/server e sto cercando di eseguire una crittografia di base. Quando mi collego al server, invio una chiave pubblica come stringa di escape sul socket. Ho verificato che la stringa è identica a su entrambe le estremità, a capo e tutto.Java: diversi risultati durante la decodifica della stringa base64 con java.util.Base64 vs android.util.Base64
Sul client (Android), sono in grado di utilizzare le chiavi pubbliche/private per crittografare e decodificare con successo una chiave segreta (a scopo di test). Tuttavia, il server non riesce a destra fuori dalla porta quando si cerca di decodificare la chiave pubblica da una stringa in un byte [], con:
java.lang.IllegalArgumentException: Illegal base64 character a
che sembra assurda, come 'a' è assolutamente un personaggio Base64, se Ho capito bene Il client e il server utilizzano una libreria condivisa per gestire tutta la crittografia, quindi il codice è quasi identico. La differenza solo è la codifica/decodifica delle stringhe base64, poiché java.util.Base64 non è disponibile su Android.
classe condivisa
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);
}
...
}
client (Android) metodi
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);
}
}
server (Linux) Metodi
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);
}
}
provare a utilizzare 'Base64.NO_WRAP' invece di' DEFAULT' in android –
Android è quello che funziona correttamente. –
lo stai codificando su Android giusto? se sì, prova 'Base64.NO_WRAP' nel tuo metodo di codifica su android –