【发布时间】:2014-09-05 13:02:30
【问题描述】:
如何从RSA密码系统中的私钥对象java.security.PrivateKey中获取相关的公钥对象java.security.PublicKey。
【问题讨论】:
标签: java cryptography rsa private-key public-key
如何从RSA密码系统中的私钥对象java.security.PrivateKey中获取相关的公钥对象java.security.PublicKey。
【问题讨论】:
标签: java cryptography rsa private-key public-key
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);
【讨论】:
RSAPrivateKey 有什么问题(在确认它是当然是RSAPrivateKey 之后)?
您需要将私钥转换为 RsaPrivateCrtKey。如果转换成功,您可以提取公钥。如果演员阵容失败,严格来说你没有足够的信息。
public static RSAPublicKeySpec getPublicKeySpec(PrivateKey priv) {
RSAPrivateCrtKey rsaCrtKey = (RSAPrivateCrtKey) priv; // May throw a ClassCastException
return new RSAPublicKeySpec(rsaCrtKey.getModulus(), rsaCrtKey.getPublicExponent());
}
如果转换失败,您可以尝试猜测公共指数,并使用标准 RSA 关系 (xe)d = x mod N 检查您的猜测对于所有 x。对于您对 e 的猜测,请尝试等式中的随机 x 值,看看该关系是否始终成立。然而,这种技术只能产生概率性的答案。
【讨论】: