El problema de cargar las claves privadas RSA pkcs8 y pkcs1 en Java

Descripción del problema:

Al usar la API nativa de Java para cargar la clave privada de RSA, el error es el siguiente:

java.security.InvalidKeyException: IOException: error de análisis álgido, no una secuencia

Análisis de causa:

Por lo general, el formato de clave privada RSA utilizado en JAVA debe estar en formato PKCS8, pero la clave privada que uso está en formato PKCS1.

Solución 1, conversión de formato:

1. Use openssl para la conversión de formato, no lo usé porque era demasiado problemático.

2. Use la API provista por BouncyCastle para convertir, vea el blog de este hermano para más detalles, dirección

3. Use herramientas en línea para convertir (recomendado), haga clic para ingresar

Solución dos, use BouncyCastle

1. Si está construido con Gladle, agregue la dependencia de BouncyCastle.

implementation group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.65'

Tenga en cuenta que la versión no debe ser demasiado alta, y la versión alta requiere el soporte de jdk11 o una versión superior de jdk.

2. Descargue el paquete jar para usar la biblioteca de terceros, página de descarga

3. Puede usar la API proporcionada por BouncyCastle para cargar la clave privada en formato PKCS1

    //私钥解密
    public static byte[] privateDecryptByBouncyCastle(byte[] content, byte[] privateKeyBytes){
    
    
        try {
    
    
            RSAPrivateKeyStructure asn1PrivKey = new RSAPrivateKeyStructure((ASN1Sequence) ASN1Sequence.fromByteArray(privateKeyBytes));
            RSAPrivateKeySpec rsaPrivKeySpec = new RSAPrivateKeySpec(asn1PrivKey.getModulus(), asn1PrivKey.getPrivateExponent());
            KeyFactory keyFactory= KeyFactory.getInstance("RSA");
            PrivateKey priKey= keyFactory.generatePrivate(rsaPrivKeySpec);
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, priKey);
            return cipher.doFinal(content);
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
        return null;

    }

4. Todavía puede usar la API nativa de JDK, solo configure el proveedor por adelantado antes de cargar

  Security.addProvider(BouncyCastleProvider())

Adjunte el código de descifrado de clave privada del JDK nativo, que es el método para informar el error al principio de este artículo.

    //私钥解密
    public static byte[] privateDecrypt(byte[] content, byte[] privateKeyBytes){
    
    
        try {
    
    
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            return cipher.doFinal(content);
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
        return null;

    }

gracias

1. Problemas encontrados al usar el cifrado y descifrado RSA con lenguajes que no son Java: error de análisis álgido, no una secuencia

2. Excepción de cifrado RSA: java.security.InvalidKeyException: IOException: error de análisis álgido, no una secuencia, método de procesamiento

3. Conversión de claves de BouncyCastle - Java

4. Cifrado y descifrado RSA, cadena a clave pública, clave privada, Base64.JAR adjunto

おすすめ

転載: blog.csdn.net/lucky_tom/article/details/118970565