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
InvalidKeyException
cuando probé con archivos que generé conssh-keygen -t rsa -b 2048
command. Con los archivos generados con los comandos en la solución funcionó..pem
formato 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