Cómo leer el archivo .pem para obtener una clave privada y pública

Estoy escribiendo un pequeño fragmento de código que lee la clave pública y privada almacenada en el archivo .pem. Estoy usando los siguientes comandos para generar las claves.

Abajo comando para generar par de clave.

   $openssl genrsa -out mykey.pem 2048

Este comando para generar la clave privada.

$openssl pkcs8 -topk8 -inform PEM -outform PEM -in mykey.pem \
    -out private_key.pem -nocrypt

y este comando para obtener la clave pública.

$ openssl rsa -in mykey.pem -pubout -outform DER -out public_key.der

He escrito dos métodos que leen la clave privada y la clave pública respectivamente.

   public  PrivateKey getPemPrivateKey(String filename, String algorithm) throws Exception {
      File f = new File(filename);
      FileInputStream fis = new FileInputStream(f);
      DataInputStream dis = new DataInputStream(fis);
      byte[] keyBytes = new byte[(int) f.length()];
      dis.readFully(keyBytes);
      dis.close();

      String temp = new String(keyBytes);
      String privKeyPEM = temp.replace("-----BEGIN PRIVATE KEY-----\n", "");
      privKeyPEM = privKeyPEM.replace("-----END PRIVATE KEY-----", "");
      //System.out.println("Private key\n"+privKeyPEM);

      Base64 b64 = new Base64();
      byte [] decoded = b64.decode(privKeyPEM);

      PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded);
      KeyFactory kf = KeyFactory.getInstance(algorithm);
      return kf.generatePrivate(spec);
      }

   public  PublicKey getPemPublicKey(String filename, String algorithm) throws Exception {
      File f = new File(filename);
      FileInputStream fis = new FileInputStream(f);
      DataInputStream dis = new DataInputStream(fis);
      byte[] keyBytes = new byte[(int) f.length()];
      dis.readFully(keyBytes);
      dis.close();

      String temp = new String(keyBytes);
      String publicKeyPEM = temp.replace("-----BEGIN PUBLIC KEY-----\n", "");
      publicKeyPEM = publicKeyPEM.replace("-----END PUBLIC KEY-----", "");


      Base64 b64 = new Base64();
      byte [] decoded = b64.decode(publicKeyPEM);

      X509EncodedKeySpec spec =
            new X509EncodedKeySpec(decoded);
      KeyFactory kf = KeyFactory.getInstance(algorithm);
      return kf.generatePublic(spec);
      }

Siento que esta es una manera ingenua de hacerlo. No podría haber una mejor manera de hacerlo a través de internet. ¿Puede alguien sugerirme cuál es la mejor manera de escribir el mismo código para manejar los casos genéricos? No quiero usar ningún tipo de biblioteca de terceros.
Tengo un conocimiento muy básico de canto / cifrado y casi no uso ninguna API de seguridad de Java. Entonces, si no tengo sentido en alguna parte, por favor señálelo.

Respuestas a la pregunta(7)

Su respuesta a la pregunta