es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cadena para generar una clave privada

Tengo una cadena de texto que contiene la clave en el formato:

"-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----"

Estoy tratando de obtener una PrivateKey a partir de esto, pero actualmente estoy obteniendo una java.security.InvalidKeyException: Missing key encoding. Mi código es el siguiente:

java.security.Security.addProvider(new BouncyCastleProvider());

String clavePrivada = this.privateKey
            .replace("-----BEGIN RSA PRIVATE KEY-----", "")
            .replaceAll("\\n", "")
            .replace("-----END RSA PRIVATE KEY-----", "");

byte[] clavePrivadaDER = Base64.decode(clavePrivada);
PKCS8EncodedKeySpec especificacion = new PKCS8EncodedKeySpec(clavePrivadaDER);
KeyFactory fabricaClaves = KeyFactory.getInstance("RSA");
return fabricaClaves.generatePrivate(especificacion);

De lo que acabo de leer, veo que esta clave está en la codificación PKCS1 en lugar de PKCS8. No estoy seguro de qué hacer a partir de aquí, si alguien puede orientarme en la dirección correcta, se lo agradecería mucho. Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el código actual está intentando decodificar la clave privada utilizando la codificación PKCS8, pero la clave está en realidad codificada en PKCS1. Para solucionar esto, puedes intentar utilizar la clase org.bouncycastle.openssl.PEMParser de la biblioteca BouncyCastle para analizar el archivo de clave privada y extraer la clave como un objeto RSAPrivateCrtKey. Aquí tienes un ejemplo de cómo puedes modificar el código para hacer esto:

    import org.bouncycastle.openssl.PEMParser;
    import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
    
    // ...
    
    java.security.Security.addProvider(new BouncyCastleProvider());
    
    String pemPrivateKey = this.privateKey
            .replace("-----BEGIN RSA PRIVATE KEY-----", "")
            .replaceAll("\n", "")
            .replace("-----END RSA PRIVATE KEY-----", "");
    
    PEMParser pemParser = new PEMParser(new StringReader(pemPrivateKey));
    Object parsedObject = pemParser.readObject();
    
    JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
    RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey) converter.getPrivateKey((PrivateKeyInfo) parsedObject);
    return privateKey;
    

    Primero, creamos un objeto PEMParser que puede analizar el archivo de clave privada. Luego, leemos el objeto analizado y lo convertimos a un objeto PrivateKeyInfo, que contiene los datos de la clave en formato PKCS1. Finalmente, utilizamos un JcaPEMKeyConverter para convertir el objeto PrivateKeyInfo en un objeto RSAPrivateCrtKey, que se puede utilizar como un objeto PrivateKey (ya que implementa la interfaz RSAPrivateKey).

Comments are closed.