Dlaczego moje dwa klucze publiczne ssh mają ten sam początek?

25

Aktualizowałem plik Author_keys na moim serwerze za pomocą klucza publicznego dla nowego laptopa, który dostałem i byłem zaskoczony, gdy odkryłem, że dwa klucze publiczne rozpoczęły się tak samo:

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

Jaka jest historia na AAAAB3...etc? Podczas wyszukiwania w Internecie widzę, że inne klawisze również zaczynają to samo. Czy to wyjaśnia algorytm, wersję czy coś takiego?

Gabe Durazo
źródło
1
Co warte jest, wygenerowałem 7 kluczy na przestrzeni kilku lat na różnych komputerach, a wszystkie zaczynają się od tego, AAAAB3NzaC1yc2EAAAAwięc domyślam się, że to jakiś typowy identyfikator typu / wersji algo ...
fukawi2

Odpowiedzi:

24

Jest to tak naprawdę nagłówek, który określa, jaki to jest klucz. Jeśli przejrzysz sekcję Algorytm klucza publicznego w RFC 4253 , zobaczymy, że dla kluczy RSA

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.

W rzeczywistości, jeśli Base64 dekodujesz ciąg „B3NzaC1yc2E”, zobaczysz, że tłumaczy się on na ASCII jako „ssh-rsa”. Przypuszczalnie „AAAA” reprezentuje pewien rodzaj nagłówka, dzięki czemu aplikacja może wiedzieć, gdzie dokładnie w strumieniu danych, aby rozpocząć przetwarzanie klucza.

Scott Pack
źródło
Wydaje się to niezwykle podobne do tego, co powiedziałem, w tym link do RFC.
larsks
@larsks: Najwyraźniej trafiłeś poddać, kiedy jeszcze pisałem mój.
Scott Pack
15

Format klucza publicznego SSH jest udokumentowany w RFC 4253 i streszczony nieco tutaj . Dane zakodowane w PEM składają się z kilku par (długość, dane), a pierwsza para koduje nazwę algorytmu, która będzie podobna do ssh-rsalub ssh-dsa.

Oznacza to, że początkowa część danych klucza publicznego dla wszystkich kluczy ssh będzie podobna.

Larsks
źródło
2

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
Nick T.
źródło