如何在java中获得模数和pubExp?

时间:2013-05-21 10:44:48

标签: java ssh cryptography rsa ssh-keys

是否可以从ssh公钥中检索模数和pubExp,如下所示:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9t1iUplXCsaamE3QPxiB4G1BTZHH4oK4Ti2pHgfOEDLsVWrhycX+f8GbNnRATONkGjoDH9WWku1Eibbd2qpSfRrYowVmE85tEqXrT1mjPMSXrdKrLa4a9NLgHtaROZPNTxkuBHjdQkfgMnId/ryUw3maj+kHW1lUEx+wpALyLNTNJP0RFgO72x47wNELvolcZttaSTqrncH1ClcY2WQ4kmfOvzAgo1sRtRolc/6k17Oeo7eQRWgT4IwjLS9hYnXNicCn5Hg313iryJJ6Zq/eR/ormM7t8LMH8479qzdxinSk3GNCCw3xRDzYD/zcLsAGKwUnA+0g0JUdxEzQpGMHr user@mc-s08347cdc1.local

我需要从上面的键以某种方式获取这些参数,以便我可以执行下面的代码来生成并获取java中的公钥

RSAPublicKeySpec ks = new RSAPublicKeySpec(modulus, pubExp);
RSAPublicKey pubKey = (RSAPublicKey)keyFactory.generatePublic(KeySpec);

1 个答案:

答案 0 :(得分:2)

显然,SSH密钥使用RFC 4253中定义的格式。因此,您可以简单地对数据进行base64解码(例如,使用Apache Commons Codec库),然后自己解析二进制结果。

这是你的base64解码字符串的输出(你可能需要postfix 2,3或4'='字符才能使解码器工作,你需要4个base64编码字符的倍数):

000000077373682D727361000000030100010000010100BDB75894A655C2B1A6A613740FC620781B50536471F8A0AE138B6A4781F3840CBB155AB87271

现在让我们剖析一下(第一部分是Big Endian格式的四个字节长度):

00000007 7373682D727361 // "ssh-rsa" string in ASCII
00000003 010001 // public exponent, the fourth number of Fermat or 65537 in decimals
00000101 00BDB75894A655C2B1A6A613740FC620781B50536471F8A0AE138B6A4781F3840CBB155AB87271

那么最后一部分是模数。它是129个字节而不是128个,因为库似乎使用有符号整数。由于1024位模数始终以第一位设置为1开始,因此可以确保在无符号表示的左侧有一个00值的填充字节。

快乐编码,从here获取的一些信息。