Java:使用 java.util.Base64 与 android.util.Base64 解码 base64 字符串时的不同结果

Java: Different results when decoding base64 string with java.util.Base64 vs android.util.Base64

我正在开发一个 client/server 系统,我正在尝试进行一些基本的加密。当我连接到服务器时,我通过套接字发送一个 public 键作为转义字符串。我已验证该字符串在两端、换行符和所有字符串上都是 相同的

在客户端 (Android) 上,我能够使用 public/private 密钥成功加密和解密密钥(用于测试目的)。但是,当尝试将 public 密钥从字符串解码为字节 [] 时,服务器立即失败,其中:

 java.lang.IllegalArgumentException: Illegal base64 character a

这看起来很荒谬,因为 'a' 绝对是一个 base64 字符,如果我理解正确的话。客户端和服务器使用共享库来处理所有加密,因此代码几乎相同。 区别是 encoding/decoding base64 字符串,因为 java.util.Base64 在 Android 上不可用。

共享class

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 而不是 Base64.DEFAULT

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

而不是 Base64.getDecoder() 使用 Base64.getMimeDecoder().