Ho fatto un tuffo eccessivo nel formato dopo aver seguito i link di Scott per i divertimenti. TLDR:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
| "ssh-rsa" |exponent| modulus
RFC4231 specifica i due tipi di dati utilizzati:
string: Stringa binaria di lunghezza arbitraria. Le stringhe possono contenere dati binari arbitrari, inclusi caratteri null e caratteri a 8 bit. Sono memorizzati come uint32contenenti la sua lunghezza
mpint: Rappresenta più numeri interi di precisione nel formato di complemento a due, memorizzati come stringa, 8 bit per byte, MSB per primo. [...]
RFC4253 sec 6.6 dice che la chiave è codificata come:
Il formato chiave "ssh-rsa" ha la seguente codifica specifica:
string "ssh-rsa"
mpint e
mpint n
Qui i parametri 'e' e 'n' formano il BLOB della chiave di firma. [Ed: ma anche il BLOB sembra contenere anche la stringa "ssh-rsa"...]
La firma risultante è codificata come segue:
string "ssh-rsa"
string rsa_signature_blob
Il valore di 'rsa_signature_blob' è codificato come una stringa contenente s [Ed: non so cosa sia.] (Che è un numero intero, senza lunghezze o riempimento, senza segno e in ordine di byte di rete).
"ssh-rsa"
La stringa ssh-rsaviene convertita in \x00\x00\x00\x07ssh-rsa, che quindi codifica in AAAAB3NzaC1yc2E=, quindi tutte le chiavi ssh-rsa dovrebbero iniziare con quella.
e, l'esponente pubblico
Di solito qualcosa come 3, 17, 257, 65537. Quei numeri vengono codificati come sotto (con l'offset finale dall'alto)
- 3 →
'\x00\x00\x00\x01\x03'→AAAABAw
- 17 →
'\x00\x00\x00\x01\x11'→AAAABEQ
- 257 →
'\x00\x00\x00\x02\x01\x01'→AAAACAQE
- 65537 / 0x10001 →
'\x00\x00\x00\x03\x01\x00\x01'→AAAADAQAB
Quindi, se vedi "BAw", il tuo esponente era 3 o "DAQAB" = 65537
n, il modulo (prodotto dei tuoi due numeri primi segreti, considera questo!)
AAABAQdopo quanto sopra significa che la lunghezza della chiave è di 2048 bit (e che l'esponente era come DAQAB a causa del riempimento base64). L'intero resto della roba base64 è l'esponente, non c'è niente dopo.
Altri prefissi di modulo che possono essere comuni:
AAAAg 1024 bit, e = 0x10001
AAAQI: 2048 bit, e = 3
AAAAB3NzaC1yc2EAAAAquindi immagino che sia una specie di identificatore di tipo / versione algo comune ...