2015-10-04 58 views
13

我正在處理客戶端/服務器系統,我正在嘗試做一些基本的加密。當我連接到服務器時,我通過套接字發送一個公鑰作爲轉義字符串。我已驗證字符串是兩端相同的,換行符和全部。Java:使用java.util.Base64解碼base64字符串與android.util.Base64時不同的結果

在客戶端(Android)上,我可以使用公鑰/私鑰成功加密和解密密鑰(用於測試目的)。但是,服務器當試圖從一個字符串的公共密鑰解碼爲一個byte [],有失敗的權利走出大門:

java.lang.IllegalArgumentException: Illegal base64 character a 

這似乎是荒謬的,因爲「A」絕對是一個base64字符,如果我理解正確。客戶端和服務器使用共享庫來處理所有加密,因此代碼幾乎相同。 只有區別在於編碼/解碼base64字符串,因爲java.util.Base64在Android上不可用。

共享類

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

... 

} 

客戶端(Android的)方法

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

}

服務器(Linux)的方法

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

嘗試在Android中使用'Base64.NO_WRAP'而不是'DEFAULT' –

+0

Android是正常工作的那個。 –

+1

你在android上編碼吧?如果是的話,請嘗試Android –

回答

26

,在Android上使用Base64.NO_WRAP代替Base64.DEFAULT

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

感謝您提供'NO_WRAP'。 –

+0

@Mohammad Adil我從服務器得到了一個由java.util.Base64類編碼的字符串,我正在用android.util.base64解碼那個字符串,但沒有給出想要的結果。請幫助我 –

+0

感謝您使用'Base64.NO_WRAP',它在Java後端工作(使用java.util.Base64)。 – shimatai

3

代替Base64.getDecoder()使用Base64.getMimeDecoder()

相關問題