Ich arbeite an einem Client/Server-System und ich versuche, einige grundlegende Verschlüsselung zu tun. Wenn ich eine Verbindung zum Server herstelle, sende ich einen öffentlichen Schlüssel als Escaped-String über den Socket. Ich habe überprüft, dass die Zeichenfolge identisch ist an beiden Enden, Zeilenumbrüche und alle.Java: Verschiedene Ergebnisse beim Decodieren von Base64-String mit java.util.Base64 vs android.util.Base64
Auf dem Client (Android) kann ich die öffentlichen/privaten Schlüssel verwenden, um einen geheimen Schlüssel (zu Testzwecken) erfolgreich zu verschlüsseln und zu entschlüsseln. Allerdings schlägt der Server direkt aus dem Tor, wenn sie versucht, den öffentlichen Schlüssel von einem String in einem byte [] zu entschlüsseln, mit:
java.lang.IllegalArgumentException: Illegal base64 character a
die grotesk scheint, als ‚a‘ ist absolut ein base64 Charakter, wenn Ich verstehe korrekt. Der Client und der Server verwenden eine gemeinsam genutzte Bibliothek, um alle Verschlüsselungen zu verarbeiten, sodass der Code nahezu identisch ist. Die nur Unterschied ist Codierung/Decodierung Base64 Strings, da java.util.Base64 ist nicht verfügbar auf Android.
Geteilt Klasse
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) Methoden
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) Methoden
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);
}
}
versuchen Sie 'Base64.NO_WRAP' anstelle von' DEFAULT' in Android –
Android ist derjenige, der richtig funktioniert. –
Sie codieren es auf Android richtig? Wenn ja, dann versuche 'Base64.NO_WRAP' in deiner encode-Methode auf Android –