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.