Jak odczytać plik .pem, aby uzyskać prywatny i publiczny klucz

Piszę mały fragment kodu, który odczytuje klucz publiczny i prywatny przechowywany w pliku .pem. Używam następujących poleceń do generowania kluczy.

Poniżej polecenie wygenerowania pary kluczy.

   $openssl genrsa -out mykey.pem 2048

To polecenie do wygenerowania klucza prywatnego

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

i to polecenie, aby uzyskać klucz publiczny.

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

Napisałem dwie metody, które odczytują odpowiednio klucz prywatny i klucz publiczny.

   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);
      }

Czuję, że jest to naiwny sposób robienia tego. Nie mogłem znaleźć lepszego sposobu na zrobienie tego przez Internet. Czy ktoś może mi zasugerować, jaki jest najlepszy sposób napisania tego samego kodu do obsługi ogólnych spraw. Nie chcę używać żadnej innej biblioteki.
Mam bardzo podstawową wiedzę na temat śpiewania / szyfrowania i prawie nie używam żadnych API bezpieczeństwa java. Więc jeśli gdzieś nie mam sensu, proszę o wskazanie.

questionAnswers(7)

yourAnswerToTheQuestion