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


Ich aktualisierte die authorized_keys-Datei auf meinem Server mit dem öffentlichen Schlüssel für den neuen Laptop, den ich bekam, und ich war überrascht zu entdecken, dass die beiden öffentlichen Schlüssel gleich anfingen:

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

Worauf ist die Geschichte? AAAAB3... usw? Bei einigen Online-Suchen sehe ich, dass auch andere Tasten gleich starten. Erklärt es den Algorithmus oder die Version oder etwas?


23
2017-07-26 00:49


Ursprung


Für das, was es wert ist, habe ich über mehrere Jahre hinweg auf verschiedenen Computern 7 Schlüssel generiert, und alle beginnen damit AAAAB3NzaC1yc2EAAAA also vermute ich, dass es sich um eine Art Algo-Typ / Versionskennung handelt ... - fukawi2


Antworten:


Dies ist eigentlich ein Header, der definiert, um welche Art von Schlüssel es sich handelt. Wenn Sie den Abschnitt Public Key Algorithm von RFC 4253 Wir können das für RSA-Schlüssel sehen

Das Schlüsselformat "ssh-rsa" hat die folgende spezifische Kodierung:

 string    "ssh-rsa"
 mpint     e
 mpint     n

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

Wenn Sie Base64 die Zeichenfolge "B3NzaC1yc2E" decodieren, werden Sie sehen, dass es in ASCII als "ssh-rsa" übersetzt. Vermutlich stellt die "AAAA" eine Art Header dar, so dass die Anwendung wissen kann, wo genau im Datenstrom die Verarbeitung des Schlüssels beginnt.


22
2017-07-26 01:19



Dies scheint bemerkenswert ähnlich zu dem, was ich gesagt habe, einschließlich der Verbindung zum RFC. - larsks
@larsks: Anscheinend hast du dich gedrängt, während ich noch meins geschrieben habe. - Scott Pack


Das SSH Public Key Format ist in dokumentiert RFC 4253und etwas zusammengefasst Hier. Die PEM-codierten Daten bestehen aus einer Anzahl von Paaren (Länge, Daten), und das erste Paar kodiert den Namen des Algorithmus, der ungefähr so ​​aussehen wird ssh-rsa oder ssh-dsa.

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


14
2017-07-26 01:16





Ich habe einen Overkill gemacht, um in das Format einzutauchen, nachdem ich den Links von Scott nach Spaß gefolgt bin. TLDR:

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

RFC4231 gibt die zwei verwendeten Datentypen an:

  • string:   Binäre Zeichenfolge mit beliebiger Länge. Strings dürfen enthalten   beliebige Binärdaten, einschließlich Null-Zeichen und 8-Bit   Zeichen. Sie werden als gespeichert uint32 enthält seine Länge

  • mpint:   Repräsentiert mehrere Genauigkeitszahlen im Zweierkomplementformat   gespeichert als eine Zeichenfolge, 8 Bits pro Byte, MSB zuerst. [...]

RFC4253 sec 6.6 sagt der Schlüssel ist codiert als:

Das Schlüsselformat "ssh-rsa" hat die folgende spezifische Kodierung:

string    "ssh-rsa"
mpint     e
mpint     n

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

Die resultierende Signatur wird wie folgt codiert:

string    "ssh-rsa"
string    rsa_signature_blob

Der Wert für 'rsa_signature_blob' ist als eine Zeichenfolge codiert, die folgendes enthält:   s [Ed: Ich weiß nicht, was es ist.] (Dies ist eine Ganzzahl, ohne Längen oder Auffüllung, unsigniert und in   Netzwerk-Byte-Reihenfolge).

"ssh-rsa"

Die Saite ssh-rsa wird konvertiert in \x00\x00\x00\x07ssh-rsa, die dann codiert AAAAB3NzaC1yc2E=, also sollten alle ssh-rsa-Schlüssel damit beginnen.

e, der öffentliche Exponent

Normalerweise so etwas wie 3, 17, 257, 65537. Diese Zahlen werden wie folgt kodiert (mit dem nachgestellten Offset 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 Modulus (Produkt deiner zwei geheimen Primzahlen, faktor das!)

AAABAQ nach dem oben genannten bedeutet, dass Ihre Schlüssellänge 2048 Bits ist (und dass Ihr Exponent wie DAQAB wegen base64-Auffüllung war). Der gesamte Rest des base64-Zeugs ist der Exponent, nichts dahinter.

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

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

0
2018-03-12 22:12