2016-02-07 90 views
0

我只有一个私钥,我需要在java中计算它的公钥。继这个答案Get public key from private in Java我想出了下面的代码: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); 

但如果我比较代码的输出与公共密钥在的.ssh /授权密钥EC2店是不一样的。我究竟做错了什么?

我想实现ssh-keygen -y

回答

2

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

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

接受你的答案,因为它指出了实际的问题。管理直接在java中进行格式转换http://stackoverflow.com/questions/3706177/how-to-generate-ssh-compatible-id-rsa-pub-from-java – cen

-3

你真的想离开的RSA加密私钥的公钥呢?

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

+0

-1对不起,但这是错误的。它是普遍的,并且完全不会危害从私钥计算公钥的安全性 - 这很常见,公钥通常不被密钥所有者存储。基于公钥来计算_private_键是困难的,而且必然如此。 – Calrion