2015-10-04 7 views
13

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

}

+2

versuchen Sie 'Base64.NO_WRAP' anstelle von' DEFAULT' in Android –

+0

Android ist derjenige, der richtig funktioniert. –

+1

Sie codieren es auf Android richtig? Wenn ja, dann versuche 'Base64.NO_WRAP' in deiner encode-Methode auf Android –

Antwort

26

auf Android, Verwenden Base64.NO_WRAP statt Base64.DEFAULT

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

Danke für 'NO_WRAP'. –

+0

@Mohammad Adil Ich habe eine Zeichenfolge vom Server von der Klasse java.util.Base64 codiert und ich entziffere diese Zeichenfolge mit android.util.base64, die nicht das gewünschte Ergebnis geben. Bitte helfen Sie mir –

+0

Danke für 'Base64.NO_WRAP' es funktioniert in meinem Java-Backend (mit java.util.Base64). – shimatai

3

Statt Base64.getDecoder() Verwendung Base64.getMimeDecoder().

Verwandte Themen