RSA加密OpenSSLX509CertificateFactory$ParsingException: Error parsing public key报错解决
一、代码
private static final String RSA = "RSA";// 非对称加密密钥算法
private static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";//加密填充方式
private final static String KEY ="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl7CuoFFgrxkQGi/LWV2yIUlLyOT7BaDjT8cJks/tfEUkpSNibvPZ2t0iflBl/i76LmdPwG8Zq23ySmODmgzx8g/Z51Onv6CSQ88jCXdL60UXvFqgcEO34POlyoCyrb1tNXV3ikjFbJVYdpnZ+yNzwCobp8217b6/xAULZgcWu2xlQ6jF1yNV/8YmZvCNfNz6SwOgEaengJzSk1rdfwXrmqzsceZrazSdgdvr69iRPQc69vvlge3tlNOnKo8cmESOnZ4jle5+Xy5/+n7IjEvJlKhOEgpWIF1FfjNDDgHXjl4jng1UoNkgwtxBvarG9YVKMZLdODdfMcwutbB9ayZ+fwIDAQAB"; //公钥
/**
* 用公钥对字符串进行加密
*
* @param data 原文
* @return
*/
@RequiresApi(api = Build.VERSION_CODES.O)
public static String encryptByPublicKey(byte[] data) throws Exception {
// 得到公钥
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(KEY.getBytes());
KeyFactory kf = KeyFactory.getInstance(RSA);
PublicKey keyPublic = kf.generatePublic(keySpec);
// 加密数据
Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
cp.init(Cipher.ENCRYPT_MODE, keyPublic);
return String.valueOf(cp.doFinal(data));
}
报错如下:
java.security.spec.InvalidKeySpecException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: Error parsing public key
问题解决
将公钥使用base64加密,改为:
@RequiresApi(api = Build.VERSION_CODES.O)
public static String encryptByPublicKey(byte[] data) throws Exception {
//获取公钥
byte[] bytes = Base64.getDecoder().decode(KEY.getBytes());
KeyFactory kf = KeyFactory.getInstance(RSA);
PublicKey keyPublic = kf.generatePublic(new X509EncodedKeySpec(bytes));
// 加密数据
Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
cp.init(Cipher.ENCRYPT_MODE, keyPublic);
return Base64.getEncoder().encodeToString(cp.doFinal(data));
}