2015-10-04 16 views
13

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

}

+2

provare a utilizzare 'Base64.NO_WRAP' invece di' DEFAULT' in android –

+0

Android è quello che funziona correttamente. –

+1

lo stai codificando su Android giusto? se sì, prova 'Base64.NO_WRAP' nel tuo metodo di codifica su android –

risposta

26

su Android, Uso Base64.NO_WRAP invece di Base64.DEFAULT

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

Grazie per "NO_WRAP". –

+0

@Mohammad Adil ho ottenuto una stringa dal server codificato dalla classe java.util.Base64 e sto decodificando quella stringa con android.util.base64 che non fornisce il risultato desiderato. pls help me –

+0

Grazie per 'Base64.NO_WRAP' funziona nel mio back-end Java (usando java.util.Base64). – shimatai

3

Invece di Base64.getDecoder() uso Base64.getMimeDecoder().

Problemi correlati