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 uint32
contenenti 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-rsa
viene 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!)
AAABAQ
dopo 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
AAAAB3NzaC1yc2EAAAA
quindi immagino che sia una specie di identificatore di tipo / versione algo comune ...