用ssh-keygen生成的公钥和私钥如何在java中转为RSAPublicKey和RSAPriva

2019-05-15 16:04发布

问题:

公钥和私钥是用"ssh-keygen -t rsa"生成的,我把生成的公钥以字符串的形式传入下面的函数(从网上找的)就会报错。
public static PublicKey string2PublicKey(String pubStr) throws Exception{
ByteBuffer byteBuffer =
ByteBuffer.wrap(Base64.getDecoder().decode(pubStr));
byte[] keyBytes = byteBuffer.array();
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}
上面函数原本在提供的程序中传入的是“MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVRiDkEKXy/KBTe+UmkA+feq1zGWIgBxkgbz7aBJGb5+eMKKoiDRoEHzlGndwFKm4mQWNftuMOfNcogzYpGKSEfC7sqfBPDHsGPZixMWzL3J10zkMTWo6MDIXKKqMG1Pgeq1wENfJjcYSU/enYSZkg3rFTOaBSFId+rrPjPo7Y4wIDAQAB”是没有问题的。
而我传入的是“AAAAB3NzaC1yc2EAAAADAQABAAABAQDVDZ+IhrOQo0ditlTlLTq7k2g1hFvw5o7TiUnkT4tKHIi2EtNloMknZgs3aBPdSb6a21ZaD0QPCRAnZ9/2Pcs4OvrRcwNzZBxLdjNGPrfitH0n62Y6HSp3LSvhRKa25AcBsgmQrAKoOveSunlZNKVCSuaBk4BayHb7QPRB8G8m9fKl3Dev9IY207kqUu6j8/iZB5hocK6rBkYlobyQcPVmBU9Y/ZcI7cnP4TiHnX7wi2KNRbm6yNYbRQzKKl6QSLpIPuRsqDmZvM0yoDJDj7Sio7f21oijosrlMvapjmGvFOn1Gcl6Sh0YYTGUXANkZqwWqkEpUs1l03s+OAEOBUQH”。请问问题在哪里,该如何将由ssh-keygen生成的密钥在java中用于加密和解密?

回答1:

看了这个链接基本可以理解 https://blog.csdn.net/jiftlixu/article/details/19836405
大约是这样。
先用base64解码。
前十一字节固定为‘0007ssh-rsa’
指数长度从第十一字节开始,取4字节读出,转成数字,你这里是3
然后取出对应(3)字节的指数,这里是‘\x01\x00\x01’,转成十进制是65537
接下来4个字节是模数的长度,这里是‘\x00\x00\x01\x01’, 10进制是257
然后取出257个字节,转成16进制是这样

00d50d9f8886b390a34762b654e52d3abb936835845bf0e68ed38949e44f8b4a1c88b612d365a0c927660b376813dd49be9adb565a0f440f09102767dff63dcb383afad1730373641c4b7633463eb7e2b47d27eb663a1d2a772d2be144a6b6e40701b20990ac02a83af792ba795934a5424ae68193805ac876fb40f441f06f26f5f2a5dc37aff48636d3b92a52eea3f3f89907986870aeab064625a1bc9070f566054f58fd9708edc9cfe138879d7ef08b628d45b9bac8d61b450cca2a5e9048ba483ee46ca83999bccd32a032438fb4a2a3b7f6d688a3a2cae532f6a98e61af14e9f519c97a4a1d186131945c036466ac16aa412952cd65d37b3e38010e054407

也可以转十进制看,太长了不贴了,这个就是模数。
然后把模数和指数放在RSAPublicKeySpec这个里面生成公钥。

不是很会java,这个代码我也没跑过,可以研究一下,有问题再讨论。