如何通过给专用密钥获得RSA公钥?(How to get a RSA PublicKey by gi

2019-07-30 06:23发布

我要寻找一个Java功能,将得到一个RSA专用密钥,将返回正确的RSA公钥?

另外,有一个功能,如果RSA专用密钥/公钥是有效的,这将告诉我们什么?

Answer 1:

如果你有你的私钥作为RSAPrivateCrtKey对象,你可以得到公共指数以及模二。

然后,你可以创建像这样的公共密钥:

RSAPublicKeySpec publicKeySpec = new java.security.spec.RSAPublicKeySpec(modulus, exponent);   
try {   
     KeyFactory keyFactory = KeyFactory.getInstance("RSA");   

     PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);   
} catch (Exception e) {   
     e.printStackTrace();   
} 


Answer 2:

我想不出你需要这个任何好的理由。 但在这里,它是:

static boolean isValidRSAPair(KeyPair pair)
{
  Key key = pair.getPrivate();
  if (key instanceof RSAPrivateCrtKey) {
    RSAPrivateCrtKey pvt = (RSAPrivateCrtKey) key;
    BigInteger e = pvt.getPublicExponent();
    RSAPublicKey pub = (RSAPublicKey) pair.getPublic();
    return e.equals(pub.getPublicExponent()) && 
      pvt.getModulus().equals(pub.getModulus());
  }
  else {
    throw new IllegalArgumentException("Not a CRT RSA key.");
  }
}


Answer 3:

正如其他人所指出的,如果你有一个RSA CRT KEY ,那么你就可以提取公共密钥。 但是它实际上是不可能取得从单纯的私有密钥的公共密钥。

其原因很简单:当生成RSA密钥,实际上是私人和公共密钥之间没有什么区别。 一种是选择去是私有的,剩下的一个是公开的即可。

所以,如果你能计算从一个纯粹的私有密钥的公共密钥,你可以通过定义计算从公钥私钥...

如果您同时,你可以很容易地实际上,如果他们匹配测试:

RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKey;
return rsaPublicKey.getModulus().equals( rsaPrivateKey.getModulus() )
  && BigInteger.valueOf( 2 ).modPow(
  rsaPublicKey.getPublicExponent().multiply( rsaPrivateKey.getPrivateExponent() )
    .subtract( BigInteger.ONE ), 
  rsaPublicKey.getModulus() ).equals( BigInteger.ONE );


Answer 4:

如果您有类型的对象RSAPrivateKey那么你需要做两件事情:

  1. 获取模量。 易: privateKey.getModulus()
  2. 计算公共指数。 这是一个有点棘手,但并非不可能。 见公开指数的定义 。 通常情况下,公用指数为65537

越来越模量和公共指数后,就可以按照PeteyB的答案。



Answer 5:

这是绝对错误的! 你总是可以得到从私有密钥的公共密钥,但你永远无法得到公众的私钥。 这就是为什么RSA非对称算法!



Answer 6:

据我所知,你不能导出RSA密钥对的给定一个键的其他关键。 这将相当于打破RSA。

为了测试一对,只是用一个密钥来加密的东西,用对方看看你原来的结果返回解密。



文章来源: How to get a RSA PublicKey by giving a PrivateKey?