我正在處理客戶端/服務器系統,我正在嘗試做一些基本的加密。當我連接到服務器時,我通過套接字發送一個公鑰作爲轉義字符串。我已驗證字符串是兩端相同的,換行符和全部。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);
}
}
嘗試在Android中使用'Base64.NO_WRAP'而不是'DEFAULT' –
Android是正常工作的那個。 –
你在android上編碼吧?如果是的話,請嘗試Android –