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?
ssh
encryption
Gabe Durazo
źródło
źródło
AAAAB3NzaC1yc2EAAAA
więc domyślam się, że to jakiś typowy identyfikator typu / wersji algo ...Odpowiedzi:
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
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.
źródło
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-rsa
lubssh-dsa
.Oznacza to, że początkowa część danych klucza publicznego dla wszystkich kluczy ssh będzie podobna.
źródło
Zanurzyłem się głęboko w tym formacie po tym, jak podążałem za linkami Scotta dla fanów. TLDR:
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 jakouint32
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:
"ssh-rsa"
Ciąg
ssh-rsa
jest konwertowany na\x00\x00\x00\x07ssh-rsa
, który następnie kodujeAAAAB3NzaC1yc2E=
, więc wszystkie klucze ssh-rsa powinny zaczynać się od tego.e
, wykładnik publicznyZwykle coś takiego jak 3, 17, 257, 65537. Liczby te są kodowane jak poniżej (z końcowym przesunięciem od góry)
'\x00\x00\x00\x01\x03'
→AAAABAw
'\x00\x00\x00\x01\x11'
→AAAABEQ
'\x00\x00\x00\x02\x01\x01'
→AAAACAQE
'\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 = 0x10001AAAQI
: 2048 bitów, e = 3źródło