Como ler o arquivo .pem para obter chave privada e pública

Eu estou escrevendo um pequeno pedaço de código que lê chave pública e privada armazenada no arquivo .pem. Eu estou usando os seguintes comandos para gerar as chaves.

Abaixo o comando para gerar um par de chaves.

   $openssl genrsa -out mykey.pem 2048

Este comando para gerar a chave privada

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

e este comando para obter a chave pública.

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

Eu escrevi dois métodos que lê a chave privada e a chave 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);
      }

Eu sinto que esta é uma maneira ingênua de fazer isso. Eu não conseguia melhor maneira de fazer isso pela internet. Alguém pode me sugerir qual é a melhor maneira de escrever o mesmo código para lidar com os casos genéricos. Eu não quero usar qualquer tipo de biblioteca de terceiros.
Eu tenho um conhecimento muito básico de cantar / criptografar e dificilmente uso qualquer API de segurança java. Então, se eu não estou fazendo sentido em algum lugar, por favor, indique.

questionAnswers(7)

yourAnswerToTheQuestion