Par*_*emp 27 java base64 android
我正在研究客户端/服务器系统,我正在尝试进行一些基本的加密.当我连接到服务器时,我将一个公钥作为转义字符串发送到套接字.我已经验证字符串在两端,换行符和所有字符串都是相同的.
在客户端(Android)上,我能够使用公钥/私钥成功加密和解密密钥(用于测试目的).但是,当尝试将公钥从String解码为byte []时,服务器立即失败,其中:
java.lang.IllegalArgumentException: Illegal base64 character a
Run Code Online (Sandbox Code Playgroud)
这似乎是荒谬的,因为'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);
}
...
}
Run Code Online (Sandbox Code Playgroud)
客户端(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);
}
Run Code Online (Sandbox Code Playgroud)
}
服务器(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);
}
Run Code Online (Sandbox Code Playgroud)
}
Moh*_*dil 45
在android上,使用Base64.NO_WRAP而不是Base64.DEFAULT
@Override
protected String encode(byte[] bytes) {
return Base64.encodeToString(bytes, Base64.NO_WRAP);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24538 次 |
| 最近记录: |