给定一个Java ssh-rsa公钥,如何构建一个SSH2公钥?

5

我正在执行publicKey.getEncoded(),然后在前面添加“ssh-rsa”,接着对其进行base64编码。然后我加上了SSH2的头/尾。但是它无法解码...

1个回答

19

Java公钥被编码为标准的X.509 SubjectPublicKeyInfo结构。

SSH2使用自己的简单格式。对下面所示的encode方法的结果进行Base-64编码,并添加必要的SSH2头和尾。

public static byte[] encode(RSAPublicKey key)
  throws IOException
{
  ByteArrayOutputStream buf = new ByteArrayOutputStream();
  byte[] name = "ssh-rsa".getBytes("US-ASCII");
  write(name, buf);
  write(key.getPublicExponent().toByteArray(), buf);
  write(key.getModulus().toByteArray(), buf);
  return buf.toByteArray();
}

private static void write(byte[] str, OutputStream os)
  throws IOException
{
  for (int shift = 24; shift >= 0; shift -= 8)
    os.write((str.length >>> shift) & 0xFF);
  os.write(str);
}

请查看此答案,以将另一个方向(从OpenSSH到Java)进行转换。


如果我需要对私钥进行PEM编码,我需要做类似的事情吗? - pizzathehut
这取决于您想要与之互操作的应用程序。如果您只需要 OpenSSL 格式中的密钥(而不是嵌入在证书中),那么是的,您需要找出格式是什么(可能是类似格式的模数和公共指数,也许作为 ASN.1 序列)并自己进行编码。 - erickson
2
找了好几个小时才找到这个代码示例。谢谢!真希望我能送你更多的声望点数。 :) - James Ward
使用SSHJ可以在一两行代码中完成,而且更加通用(支持DSA和其他类型):byte[] b = new Buffer.PlainBuffer().putPublicKey(key).getCompactData(),然后使用Base64.getEncoder().encodeToString(b)进行base64编码。 - Raul Santelices
@RaulSantelices 已经起作用了。我只需要在我的代码中添加 ssh-rsa 头即可。return "ssh-rsa " + Base64.getEncoder().encodeToString(b); - Aaron Tobias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接