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 uint32
zawierają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-rsa
jest 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!)
AAABAQ
po 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
AAAAB3NzaC1yc2EAAAA
więc domyślam się, że to jakiś typowy identyfikator typu / wersji algo ...