如何从Java中的私钥对象获取RSA公钥

如何从RSA密码系统中的私钥Object java.security.PrivateKey中获取相关的公钥对象java.security.PublicKey

Java能够通过使用模数和指数来创建公钥:

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

所以我们需要从私钥中提取这些值:

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

RSAPrivateKeySpec -Object现在包含我们需要的模数,但指数不是我们公钥所需的模数。

对于公钥,指数通常为65537: http : //en.wikipedia.org/wiki/65537_ (number )

因此我们现在可以创建公钥:

 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); 

您需要将私钥转换为RsaPrivateCrtKey。 如果转换成功,您可以提取公钥。 如果演员表失败,严格来说你没有足够的信息。

 public static RSAPublicKeySpec getPublicKeySpec(PrivateKey priv) { RSAPrivateCrtKey rsaCrtKey = (RSAPrivateCrtKey) priv; // May throw a ClassCastException return new RSAPublicKeySpec(rsaCrtKey.getModulus(), rsaCrtKey.getPublicExponent()); } 

如果演员表失败,您可以尝试猜测公共指数,并使用所有x的标准RSA关系(x ed = x mod N来检查您的猜测。 对于你的猜测,尝试在等式中随机x值,看看关系是否总是成立。 然而,这种技术只能产生概率性答案。