2015-10-04 12 views
13

İstemci/sunucu sistemi üzerinde çalışıyorum ve bazı temel şifrelemeyi yapmaya çalışıyorum. Sunucuya bağlandığımda, genel bir anahtarı soket boyunca kaçan bir dize olarak gönderirim. Dizenin her iki ucunda, satırbaşında ve tümünde özdeş olduğunu doğruladım.Java: base64 dizesini java.util.Base64 ile çözerken farklı sonuçlar android.util.Base64

İstemcide (Android), bir gizli anahtarı (sınama amacıyla) başarıyla şifrelemek ve şifresini çözmek için genel/özel anahtarlarını kullanabiliyorum. ile, bir byte [] bir dize gelen ortak anahtarının kodu çalışırken Ancak, sunucu sağ kapıdan başarısız: 'a' kesinlikle base64 karakter ise, olduğu gibi, mantıksız görünüyor

java.lang.IllegalArgumentException: Illegal base64 character a 

Doğru şekilde anladım. İstemci ve sunucu, tüm şifrelemeyi işlemek için paylaşılan bir kütüphane kullanır, bu yüzden kod hemen hemen aynıdır. Java.util.Base64 Android'de bulunmadığından sadece arasındaki fark kodlama/kod çözme base64 Dizeleridir.

Paylaşılan sınıf

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

... 

} 

İstemci (Android) yöntemleri

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

}

Sunucu (Linux) yöntemleri

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

} android üzerinde

+2

android 'DEFAULT' yerine 'Base64.NO_WRAP' kullanmayı deneyin –

+0

Android doğru çalışan bir tanesidir. –

+1

android üzerinde kodlama yapıyorsunuz? eğer evet ise o zaman androidde kodlama yönteminizdeki Base64.NO_WRAP'ı deneyin –

cevap

26

, Kullanım Base64.NO_WRAP yerine

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

'NO_WRAP' için teşekkürler. –

+0

@Mohammad Adil java.util.Base64 sınıfı tarafından kodlanmış sunucudan bir dizim var ve bu dizeyi android.util.base64 ile istenilen sonucu vermeyerek çözüyorum. pls bana yardım –

+0

'Base64.NO_WRAP' için teşekkürler benim Java arka ucunda çalışıyor (java.util.Base64 kullanarak). – shimatai

3

yerine kullanılması Base64.getMimeDecoder()Base64.getDecoder()Base64.DEFAULT.