1

是否可以从 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);
4

1 回答 1

2

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

这是您的 base64 解码字符串的输出(您可能需要后缀 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在无符号表示的左侧有一个有价值的填充字节。

快乐的编码,一些信息取自这里

于 2013-05-23T23:36:40.430 回答