Как прочитать файл.pem, чтобы получить закрытый и открытый ключи

Я пишу небольшой фрагмент кода, который считывает открытый и закрытый ключи, хранящиеся в файле.pem. Я использую следующие команды для генерации ключей.

Ниже приведена команда для генерации пары ключей.

   $openssl genrsa -out mykey.pem 2048

Эта команда для генерации закрытого ключа

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

и эта команда для получения открытого ключа.

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

Я написал два метода, которые считывают закрытый ключ и открытый ключ соответственно.

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

Я чувствую, что это наивный способ сделать это. Я не мог найти лучшего способа сделать это через Интернет. Может ли кто-нибудь предложить мне, как лучше всего написать один и тот же код для обработки общих случаев. Я не хочу использовать какие-либо сторонние библиотеки.
У меня есть очень базовые знания о пении/шифровании и я почти не использую API-интерфейсы безопасности Java. Так что, если я где-то не понимаю, пожалуйста, укажите.

63
задан Alastair McCormack 6 June 2017 в 13:35
поделиться