Il formato chiave utilizzato da ssh è definito nello RFC#4253. Il formato per la chiave pubblica RSA è il seguente:
string "ssh-rsa"
mpint e /* key public exponent */
mpint n /* key modulus */
Tutti codifica tipo di dati è definito nella sezione # 5 di RFC#4251. stringa e mpint (precisione multipla interi) tipi sono codificati in questo modo:
4-bytes word: data length (unsigned big-endian 32 bits integer)
n bytes : binary representation of the data
per esempio, la codifica della stringa "ssh-rsa" è:
byte[] data = new byte[] {0, 0, 0, 7, 's', 's', 'h', '-', 'r', 's', 'a'};
per codificare il pubblico:
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);
}
Per avere una riprésentation della stringa della chiave, è sufficiente codificare la matrice di byte restituita in Base64.
Per la codifica chiave privata ci sono due casi:
- la chiave privata non è protetta da una password. In tal caso, la chiave privata viene codificata in base allo standard PKCS # 8 e quindi codificata con Base64. È possibile ottenere la codifica PKCS8 della chiave privata chiamando
getEncoded
su RSAPrivateKey
.
- la chiave privata è protetta da una password. In tal caso la codifica della chiave è un formato dedicato OpenSSH. Non so se c'è qualche documentazione su questo formato (eccetto il codice sorgente OpenSSH ovviamente)
possibile duplicato di [Dato un Java ssh-rsa PublicKey, come posso creare una chiave pubblica SSH2?] (Http: // stackoverflow.it/questions/3588120/given-a-java-ssh-rsa-publickey-how-can-i-build-an-ssh2-public-key) – erickson