Учитывая Java ssh-rsa PublicKey, как я могу создать открытый ключ SSH2?

Я делаю publicKey.getEncoded(), затем добавляю «ssh-rsa» впереди, а затем кодирую его в base64. Затем я добавляю заголовок/нижний колонтитул SSH2. Но не расшифровывается...


person pizzathehut    schedule 27.08.2010    source источник


Ответы (1)


Открытые ключи Java кодируются как стандартная структура X.509 SubjectPublicKeyInfo.

SSH2 использует свой собственный простой формат. Base-64 кодирует результат метода encode, показанного ниже, и добавляет необходимые верхний и нижний колонтитулы 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.

person erickson    schedule 27.08.2010
comment
Нужно ли мне делать что-то подобное, если мне нужно PEM кодировать закрытый ключ? - person pizzathehut; 28.08.2010
comment
Это зависит от приложения, с которым вы хотите взаимодействовать. Если вам нужен только ключ (не встроенный в сертификат) в формате OpenSSL, да, вам нужно выяснить, что это за формат (возможно, модуль и общедоступная экспонента в аналогичном формате, возможно, как последовательность ASN.1) и закодировать это сами. - person erickson; 28.08.2010
comment
Искал часы для этого примера кода. СПАСИБО! Хотел бы я подарить тебе еще кучу очков репутации. :) - person James Ward; 01.11.2011
comment
Это можно сделать одной или двумя строками и более общими (поддержка DSA и других типов) с помощью SSHJ: byte[] b = new Buffer.PlainBuffer().putPublicKey(key).getCompactData(), а затем закодировать его в base64, используя Base64.getEncoder().encodeToString(b). - person Raul Santelices; 08.04.2017
comment
@RaulSantelices работал. Мне просто нужно было добавить заголовок ssh-rsa к моему. return "ssh-rsa " + Base64.getEncoder().encodeToString(b); - person Aaron Tobias; 10.04.2021