Zanurzyłem się głęboko w tym formacie po tym, jak podążałem za linkami Scotta dla fanów. TLDR:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
| "ssh-rsa" |exponent| modulus
RFC4231 określa dwa używane typy danych:
string: Ciąg binarny o dowolnej długości. Ciągi mogą zawierać dowolne dane binarne, w tym znaki puste i znaki 8-bitowe. Są one przechowywane jako uint32zawierające jego długość
mpint: Reprezentuje wiele liczb całkowitych dokładności w formacie uzupełnienia do dwóch, przechowywanych jako ciąg, 8 bitów na bajt, najpierw MSB. [...]
RFC4253 sec 6.6 mówi, że klucz jest zakodowany jako:
Format klucza „ssh-rsa” ma następujące specyficzne kodowanie:
string "ssh-rsa"
mpint e
mpint n
Tutaj parametry „e” i „n” tworzą obiekt blob klucza podpisu. [Ed: ale obiekt blob również wydaje się zawierać ciąg znaków "ssh-rsa"...]
Otrzymany podpis jest kodowany w następujący sposób:
string "ssh-rsa"
string rsa_signature_blob
Wartość „rsa_signature_blob” jest zakodowana jako ciąg znaków zawierający s [Ed: nie wiem, co to jest s.] (Która jest liczbą całkowitą, bez długości i wypełnienia, bez znaku oraz w sieciowej kolejności bajtów).
"ssh-rsa"
Ciąg ssh-rsajest konwertowany na \x00\x00\x00\x07ssh-rsa, który następnie koduje AAAAB3NzaC1yc2E=, więc wszystkie klucze ssh-rsa powinny zaczynać się od tego.
e, wykładnik publiczny
Zwykle coś takiego jak 3, 17, 257, 65537. Liczby te są kodowane jak poniżej (z końcowym przesunięciem od góry)
- 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
Jeśli więc widzisz „BAw”, wykładnik wynosił 3 lub „DAQAB” = 65537
n, moduł (iloczyn dwóch tajnych liczb pierwszych, uwzględnij to!)
AAABAQpo powyższym oznacza, że twoja długość klucza wynosi 2048 bitów (i że wykładnik był podobny do DAQAB z powodu wypełnienia base64). Cała reszta rzeczy z base64 jest wykładnikiem, nic po tym nie ma.
Inne przedrostki modułu, które mogą być wspólne:
AAAAg 1024 bity, e = 0x10001
AAAQI: 2048 bitów, e = 3
AAAAB3NzaC1yc2EAAAAwięc domyślam się, że to jakiś typowy identyfikator typu / wersji algo ...