Warum haben meine beiden öffentlichen ssh-Schlüssel den gleichen Anfang?

25

Ich habe die Datei "authorized_keys" auf meinem Server mit dem öffentlichen Schlüssel für den neuen Laptop aktualisiert und war überrascht, dass die beiden öffentlichen Schlüssel identisch waren:

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

Was ist die Geschichte auf AAAAB3...etc? Bei einigen Online-Suchvorgängen sehe ich, dass andere Schlüssel ebenfalls gleich beginnen. Erklärt es den Algorithmus oder die Version oder so?

Gabe Durazo
quelle
1
Für das, was es wert ist, habe ich 7 Schlüssel in ein paar Jahren auf verschiedenen Computern generiert, und alle beginnen damit, AAAAB3NzaC1yc2EAAAAalso
denke

Antworten:

24

Dies ist eigentlich eine Kopfzeile, die definiert, um welche Art von Schlüssel es sich handelt. Wenn Sie sich den Abschnitt Public Key Algorithm von RFC 4253 ansehen, sehen wir das für RSA-Schlüssel

Das Schlüsselformat "ssh-rsa" weist die folgende spezifische Codierung auf:

 string    "ssh-rsa"
 mpint     e
 mpint     n

Hier bilden die Parameter 'e' und 'n' den Signaturschlüssel-Blob.

Wenn Sie die Zeichenfolge "B3NzaC1yc2E" in Base64 dekodieren, sehen Sie, dass sie als "ssh-rsa" in ASCII übersetzt wird. Vermutlich stellt "AAAA" eine Art Header dar, sodass die Anwendung genau wissen kann, wo sich der Datenstrom befindet, um mit der Verarbeitung des Schlüssels zu beginnen.

Scott Pack
quelle
Dies scheint bemerkenswert ähnlich zu dem zu sein, was ich gesagt habe, einschließlich des Links zum RFC.
Larsks
@ larsks: Anscheinend hast du Submit gedrückt, als ich noch an meinem geschrieben habe.
Scott Pack
15

Das öffentliche SSH-Schlüsselformat ist in RFC 4253 dokumentiert und hier etwas zusammengefasst . Die PEM-codierten Daten bestehen aus einer Anzahl von (Längen-, Daten-) Paaren, und das erste Paar codiert den Algorithmusnamen, der so etwas wie ssh-rsaoder sein wirdssh-dsa .

Dies bedeutet, dass der erste Teil der öffentlichen Schlüsseldaten für alle SSH-Schlüssel ähnlich sein wird.

larsks
quelle
2

Nachdem ich Scotts Links zum Spaß gefolgt war, habe ich mich intensiv mit dem Format befasst. TLDR:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
       |  "ssh-rsa"   |exponent|   modulus

RFC4231 gibt die beiden verwendeten Datentypen an:

  • string: Binäre Zeichenfolge beliebiger Länge. Zeichenfolgen dürfen beliebige Binärdaten enthalten, einschließlich Nullzeichen und 8-Bit-Zeichen. Sie werden als uint32Container ihrer Länge gespeichert

  • mpint: Stellt Ganzzahlen mit mehreren Genauigkeiten im Zweierkomplementformat dar, als Zeichenfolge gespeichert, 8 Bits pro Byte, MSB zuerst. [...]

RFC4253 Sek. 6.6 besagt, dass der Schlüssel wie folgt codiert ist:

Das Schlüsselformat "ssh-rsa" weist die folgende spezifische Codierung auf:

string    "ssh-rsa"
mpint     e
mpint     n

Hier bilden die Parameter 'e' und 'n' den Signaturschlüssel-Blob. [Ed: aber der Blob scheint auch den String zu enthalten "ssh-rsa"...]

Die resultierende Signatur wird wie folgt codiert:

string    "ssh-rsa"
string    rsa_signature_blob

Der Wert für 'rsa_signature_blob' ist eine Zeichenfolge mit s [Ed: Ich weiß nicht, was s ist.] ( Dies ist eine Ganzzahl ohne Längen und ohne Auffüllung, ohne Vorzeichen und in der Reihenfolge der Netzwerkbytes).

"ssh-rsa"

Die Zeichenfolge ssh-rsawird in konvertiert \x00\x00\x00\x07ssh-rsaund anschließend in codiert AAAAB3NzaC1yc2E=, sodass alle ssh-rsa-Schlüssel damit beginnen sollten.

e, der öffentliche Exponent

Normalerweise etwa 3, 17, 257, 65537. Diese Zahlen werden wie folgt codiert (mit dem nachgestellten Versatz von oben)

  • 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

Wenn Sie also "BAw" sehen, war Ihr Exponent 3 oder "DAQAB" = 65537

n, der Modul (Produkt Ihrer beiden geheimen Primzahlen, faktorieren Sie dies!)

AAABAQnach oben bedeutet, dass Ihre Schlüssellänge 2048 Bit beträgt (und Ihr Exponent aufgrund der base64-Auffüllung wie DAQAB war). Der gesamte Rest des base64-Zeugs ist der Exponent, es folgt nichts.

Andere Modul-Präfixe, die häufig vorkommen können:

  • AAAAg 1024 Bits, e = 0x10001
  • AAAQI: 2048 Bits, e = 3
Nick T
quelle