Lesen der PEM-Datei zum Abrufen des privaten und öffentlichen Schlüssels

Ich schreibe ein kleines Stück Code, das den öffentlichen und privaten Schlüssel liest, der in der .pem-Datei gespeichert ist. Ich benutze die folgenden Befehle, um die Schlüssel zu generieren.

Unter Befehl zum Erzeugen eines Schlüsselpaares.

   $openssl genrsa -out mykey.pem 2048

Dieser Befehl zum Generieren des privaten Schlüssels

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

und dieser Befehl, um den öffentlichen Schlüssel zu erhalten.

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

Ich habe zwei Methoden geschrieben, die den privaten Schlüssel bzw. den öffentlichen Schlüssel lesen.

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

Ich halte das für eine naive Methode. Ich könnte keinen besseren Weg finden, dies über das Internet zu tun. Kann mir jemand vorschlagen, wie derselbe Code am besten geschrieben werden kann, um die generischen Fälle zu behandeln. Ich möchte keine Bibliothek von Drittanbietern verwenden.
Ich habe Grundkenntnisse im Singen / Verschlüsseln und verwende kaum Java-Sicherheits-APIs. Also, wenn ich irgendwo keinen Sinn mache, dann weisen Sie bitte darauf hin.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage