2016-02-07 6 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); 

Но если сравнить вывод кода с открытым ключом, EC2 магазины в .ssh/авторизованных ключей это не то же самое. Что я делаю не так?

Я хочу добиться 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 Извините, но это неправильно. Это _trivial_, общий и вовсе не подрывает безопасность для вычисления открытого ключа из закрытого ключа - настолько распространено, что открытый ключ часто не сохраняется владельцем ключа. Что сложно, и обязательно так, вычисляет ключ _private_ на основе открытого ключа. – Calrion