El formato de clave utilizado por ssh se define en el RFC#4253. El formato de clave pública RSA es la siguiente:
string "ssh-rsa"
mpint e /* key public exponent */
mpint n /* key modulus */
Todo el tipo de codificación de datos se define en la sección # 5 de RFC#4251. cadena y Mpint (precisión múltiple entero) tipos están codificados de esta manera:
4-bytes word: data length (unsigned big-endian 32 bits integer)
n bytes : binary representation of the data
por ejemplo, la codificación de la cadena "ssh-rsa" es:
byte[] data = new byte[] {0, 0, 0, 7, 's', 's', 'h', '-', 'r', 's', 'a'};
para codificar el público:
public byte[] encodePublicKey(RSAPublicKey key) throws IOException
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
/* encode the "ssh-rsa" string */
byte[] sshrsa = new byte[] {0, 0, 0, 7, 's', 's', 'h', '-', 'r', 's', 'a'};
out.write(sshrsa);
/* Encode the public exponent */
BigInteger e = key.getPublicExponent();
byte[] data = e.toByteArray();
encodeUInt32(data.length, out);
out.write(data);
/* Encode the modulus */
BigInteger m = key.getModulus();
data = m.toByteArray();
encodeUInt32(data.length, out);
out.write(data);
return out.toByteArray();
}
public void encodeUInt32(int value, OutputStream out) throws IOException
{
byte[] tmp = new byte[4];
tmp[0] = (byte)((value >>> 24) & 0xff);
tmp[1] = (byte)((value >>> 16) & 0xff);
tmp[2] = (byte)((value >>> 8) & 0xff);
tmp[3] = (byte)(value & 0xff);
out.write(tmp);
}
Para tener una representación de cadena de la clave solo codifica la matriz de bytes devuelta en Base64.
Para la codificación de clave privada no es dos casos:
- la clave privada no está protegido por una contraseña. En ese caso, la clave privada se codifica de acuerdo con el estándar PKCS # 8 y luego se codifica con Base64. Es posible obtener la codificación PKCS8 de la clave privada llamando al
getEncoded
en RSAPrivateKey
.
- la clave privada está protegida por una contraseña. En ese caso, la clave de codificación es un formato dedicado OpenSSH. No sé si hay alguna documentación sobre este formato (excepto el código fuente de OpenSSH, por supuesto)
posible duplicado de [Dada Java ssh-rsa PublicKey, ¿cómo puedo construir una clave pública SSH2?] (Http: // stackoverflow.com/questions/3588120/given-a-java-ssh-rsa-publickey-how-can-i-build-an-ssh2-public-key) – erickson