添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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));
                                    packageio.xjar.util;importorg.apache.commons.codec.binary.Base64;importsun.misc.BASE64Decoder;importjavax.crypto.BadPaddingException;importjavax.crypto.Cipher;importjavax.crypto.IllegalBlockSizeExcept...
        /// PEM格式公钥转换成XML格式公钥
        /// </summary>
        /// <param name="publicKey">PEM格式公钥,(纯文字字符,注意不带-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----)</param>
                                    产生这一错误的原因是:~/.ssh/id_rsa.pub文件可能不是通过ssh-keygen生成的原始文件,而是通过别的工具导出的,最可能的情况就是通过。所以会出现解析错误。解决方法是: 使用ssh-keygen从私钥生成的公钥文件。
                                    $privateKey = openssl_pkey_new();
while($message = openssl_error_string()){
    echo $message.''.PHP_EOL;
调用后会有如下输出:
error:02001003:system library:fopen:No such process
error:2006D080:BIO rout
                                    支付宝踩坑:java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0000b9:ASN.1 encoding routines:OPENSSL_internal:WRONG_TAG
这个问题是:Android4.1的问题,4.1之后就是加KeyFactory keyf = KeyFactor...
                                    [code="java"]
	private static final String KEY_ALGORITHM = "RSA";  
	private static final String PUBLIC_KEY ="publicKey";
	private static final String PRIVATE_KEY ="privateKey"; 
        public st...
                                    1、生成 myplatform.pem
openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out myplatform.pem
2、生成platform.p12。
alias别名是mystore,密码是123456
openssl pkcs12 -export -in platform.x509.pem -inkey myplatform.pem -out platform.p12 -password pass:123456 -name myst..