Java:使用 java.util.Base64 与 android.util.Base64 解码 base64 字符串时的不同结果
我正在开发客户端/服务器系统,并且正在尝试进行一些基本的加密.当我连接到服务器时,我通过套接字发送一个公钥作为转义字符串.我已经验证了字符串在两端、换行符和所有方面都是 相同 的.
I'm working on a client/server system and I'm trying to do some basic encryption. When I connect to the server, I send a public key as an escaped string across the socket. I've verified that the string is identical on both ends, newlines and all.
在客户端 (Android) 上,我可以使用公钥/私钥成功加密和解密密钥(用于测试目的).但是,当尝试将公钥从 String 解码为 byte[] 时,服务器直接失败了:
On the client (Android), I'm able to use the public/private keys to successfully encrypt and decrypt a secret key (for testing purposes). However, the server fails right out of the gate when trying to decode the public key from a String to a byte[], with:
java.lang.IllegalArgumentException: Illegal base64 character a
这似乎很荒谬,因为a"绝对是一个 base64 字符,如果我理解正确的话.客户端和服务器使用共享库来处理所有加密,因此代码几乎相同.唯一的区别在于编码/解码 base64 字符串,因为 java.util.Base64 在 Android 上不可用.
which seems preposterous, as 'a' is absolutely a base64 character, if I understand correctly. The client and server use a shared library to handle all encryption, so the code is nearly identical. The only difference is encoding/decoding base64 Strings, since java.util.Base64 is unavailable on 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
而不是 Base64.DEFAULT
On android, Use Base64.NO_WRAP
instead of Base64.DEFAULT
@Override
protected String encode(byte[] bytes) {
return Base64.encodeToString(bytes, Base64.NO_WRAP);
}
相关文章