Perché le mie due chiavi pubbliche ssh hanno lo stesso inizio?


25

Stavo aggiornando il file authorized_keys sul mio server con la chiave pubblica per il nuovo laptop che ho ricevuto e sono stato sorpreso di scoprire che le due chiavi pubbliche hanno iniziato allo stesso modo:

# key 1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....
#
# key 2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....

Qual è la storia, AAAAB3...ecc.? Con alcune ricerche online, vedo che anche altre chiavi iniziano allo stesso modo. Spiega l'algoritmo o la versione o qualcosa del genere?


1
Per quello che vale, ho 7 chiavi generate nell'arco di pochi anni, su vari computer, e iniziano tutte con AAAAB3NzaC1yc2EAAAAquindi immagino che sia una specie di identificatore di tipo / versione algo comune ...
fukawi2

Risposte:


24

Questa è in realtà un'intestazione che definisce che tipo di chiave è. Se dai un'occhiata alla sezione Algoritmo a chiave pubblica di RFC 4253 , possiamo vederlo per le chiavi RSA

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.

Infatti, se Base64 decodifica la stringa "B3NzaC1yc2E" vedrai che si traduce in ASCII come "ssh-rsa". Presumibilmente, "AAAA" rappresenta un tipo di intestazione in modo che l'applicazione possa sapere esattamente dove nel flusso di dati avviare l'elaborazione della chiave.


Questo sembra notevolmente simile a quello che ho detto, incluso il collegamento alla RFC.
Larsks,

@larsks: A quanto pare hai premuto Invia mentre stavo ancora scrivendo il mio.
Scott Pack,

15

Il formato della chiave pubblica SSH è documentato in RFC 4253 e qui riassunto in qualche modo . I dati codificati PEM sono costituiti da un numero di coppie (lunghezza, dati) e la prima coppia codifica il nome dell'algoritmo, che sarà simile a ssh-rsao ssh-dsa.

Ciò significa che la parte iniziale dei dati della chiave pubblica per tutte le chiavi ssh sarà simile.


2

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.