He generado una clave privada con:
openssl genrsa [-out file] –des3
Después de esto, he generado una clave pública con:
openssl rsa –pubout -in private.key [-out file]
Quiero firmar algunos mensajes con mi clave privada y verificar algunos otros mensajes con mi clave pública, usando un código como este:
public String sign(String message) throws SignatureException{
try {
Signature sign = Signature.getInstance("SHA1withRSA");
sign.initSign(privateKey);
sign.update(message.getBytes("UTF-8"));
return new String(Base64.encodeBase64(sign.sign()),"UTF-8");
} catch (Exception ex) {
throw new SignatureException(ex);
}
}
public boolean verify(String message, String signature) throws SignatureException{
try {
Signature sign = Signature.getInstance("SHA1withRSA");
sign.initVerify(publicKey);
sign.update(message.getBytes("UTF-8"));
return sign.verify(Base64.decodeBase64(signature.getBytes("UTF-8")));
} catch (Exception ex) {
throw new SignatureException(ex);
}
}
Encontré una solución para convertir mi clave privada al formato PKCS8 y cargarla. Funciona con un código como este:
public PrivateKey getPrivateKey(String filename) 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();
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf =
KeyFactory.getInstance("RSA");
return kf.generatePrivate(spec);
}
Y finalmente mi pregunta es: ¿Cómo cargo mi clave pública RSA desde un archivo?
Creo que tal vez necesito convertir mi archivo de clave pública al formato x509 y usar X509EncodedKeySpec. ¿Pero cómo puedo hacer esto?

Respuestas:
A continuación se muestra la información relevante del enlace que proporcionó Zaki .
Llave privada
Llave pública
fuente
InvalidKeyExceptioncuando probé con archivos que generé conssh-keygen -t rsa -b 2048command. Con los archivos generados con los comandos en la solución funcionó..pemformato en lugar de.der, puede usar la clase PemReader de BouncyCastle para analizarla antes de pasarla aX509EncodedKeySpec. Recuerde también especificar el proveedor BouncyCastle cuando cree la instancia de KeyFactory.Este programa hace casi todo con claves públicas y privadas. El formato der se puede obtener pero guardando los datos brutos (sin codificar base64). Espero que esto ayude a los programadores.
fuente
Una vez que tenga su clave almacenada en un archivo PEM, puede leerla fácilmente usando las clases PemObject y PemReader proporcionadas por BouncyCastle, como se muestra en este tutorial .
Cree una clase PemFile que encapsule el manejo de archivos:
Luego, cree una instancia de las claves públicas y privadas como de costumbre:
Espero que esto ayude.
fuente
El siguiente código funciona absolutamente bien para mí y funciona. Este código leerá la clave pública y privada RSA a través del código Java. Puede consultar http://snipplr.com/view/18368/
fuente