来自java中私钥的公钥不正确

时间:2016-02-07 22:38:29

标签: java cryptography private-key public-key ssh-keygen

我只有一个私钥,我需要在java中从中计算公钥。在回答Get public key from private in Java之后,我提出了以下代码:

String pemString = "full private key string here";
pemString = pemString.replace("-----BEGIN RSA PRIVATE KEY-----\n", "");
pemString = pemString.replace("-----END RSA PRIVATE KEY-----", "");
pemString = pemString.replace("\n", ""); //without this exception: Illegal base64 character a
logger.info(pemString);

byte[] decoded = Base64.getDecoder().decode(pemString);
KeyFactory kf = KeyFactory.getInstance("RSA");

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decoded);
PrivateKey privatekey = kf.generatePrivate(keySpec);
RSAPrivateCrtKey privk = (RSAPrivateCrtKey)privatekey;

RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(privk.getModulus(), privk.getPublicExponent());
PublicKey pubKey = kf.generatePublic(publicKeySpec);
String pubString = Base64.getEncoder().encodeToString(pubKey.getEncoded());

logger.info(pubString);

但是如果我将代码的输出与EC2存储在.ssh /授权密钥中的公钥进行比较,那就不一样了。我做错了什么?

我想实现ssh-keygen -y

2 个答案:

答案 0 :(得分:2)

您生成的密钥位于X.509 format。而.ssh / authorized_keys2中的密钥位于SSH format。您可以使用ssh-keygen实用程序进行转换:

ssh-keygen -i -m PEM -f key.pem > ssh.pub

答案 1 :(得分:-3)

你真的想从rsa加密的私钥中获取公钥吗?

如果没有人知道你的私钥,RSA是安全的。 Normaly RSA属于单向函数。换句话说:如果密钥是由大素数生成的,那么您将无法从私钥中获取公钥,反之亦然。因为你需要通过因子分解得到两个数字,这对于大数字来说不是一件容易的事。

相关问题