How to get the RSA public-key from private-key Object in Java

cryptography, java, private-key, public-key, rsa

Solution

Java is able to create a public key by using the modulus and exponent:

RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
kf.generatePublic(keySpec);

So we need to extract these values out of the private key:

KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPrivateKeySpec priv = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class);

The `RSAPrivateKeySpec`-Object now contains the modulus we need, but the exponent is not the one we need for the public key.

For the public key the exponent is commonly at 65537: http://en.wikipedia.org/wiki/65537_(number)

Therefore we can now create the public key:

KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPrivateKeySpec priv = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class);

RSAPublicKeySpec keySpec = new RSAPublicKeySpec(priv.getModulus(), BigInteger.valueOf(65537));

PublicKey publicKey = kf.generatePublic(keySpec);

Problem

How to get the related public-key object `java.security.PublicKey` out of a private-key Object `java.security.PrivateKey` in the RSA cryptosystem.

Original source