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 uint32
Container 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-rsa
wird in konvertiert \x00\x00\x00\x07ssh-rsa
und 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!)
AAABAQ
nach 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
AAAAB3NzaC1yc2EAAAA
also