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

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

我正在使用客户端/服务器系统,并且正在尝试进行一些基本的加密。 当我连接到服务器时,我将公钥作为转义的字符串通过套接字发送。 我已经验证了字符串在两端,换行符和所有字符串上都是相同的。

在客户端(Android)上,我可以使用公钥/私钥成功加密和解密秘密密钥(出于测试目的)。 但是,当尝试将公共密钥从String解码为byte []时,服务器立即无法通过以下操作失败:

1
 java.lang.IllegalArgumentException: Illegal base64 character a

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

共享类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)方法

1
2
3
4
5
6
7
8
9
10
11
12
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)方法

1
2
3
4
5
6
7
8
9
10
11
12
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

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


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