Este código genera un par de claves pública/privada:Java cifrado asimétrico: mejor forma de almacenar claves públicas/privadas
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair keypair = keyGen.genKeyPair();
PrivateKey privateKey = keypair.getPrivate();
PublicKey publicKey = keypair.getPublic();
Lo que me gustaría saber es ¿cómo se suele almacenar la clave pública:
Opción 1: almacenar los bytes
byte[] privateKeyBytes = privateKey.getEncoded();
byte[] publicKeyBytes = publicKey.getEncoded();
// ... write to file
// convert bytes back to public/private keys
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
lo que no me gusta es atar el código para implementaciones concretas tales como PKCS8EncodedKeySpec
y X509EncodedKeySpec
.
Opción 2: almacenar el módulo y exponente
KeyFactory fact = KeyFactory.getInstance("RSA");
RSAPublicKeySpec pub = fact.getKeySpec(publicKey, RSAPublicKeySpec.class);
RSAPrivateKeySpec priv = fact.getKeySpec(privateKey,RSAPrivateKeySpec.class);
// store modulus and exponent as BigIntegers
BigInteger modulus = pub.getModulus());
BigInteger exponent = pub.getPublicExponent());
// ... write to file
// recreate public key (the same applies to the private key)
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(keySpec);
La segunda opción es más fácil de implementar, pero no sé si podría ser menos eficiente.
¿Algún consejo?
DER no es realmente un formato per se, solo la forma de codificar objetos ASN.1 –
Para aquellos que buscan obtener 'public. der' directamente de 'id_rsa.pub' (clave pública) en lugar de' id_rsa' (clave privada) [esta respuesta proporciona una forma de hacerlo] (http://stackoverflow.com/a/18290786/813810). – Diego