Чому два мої відкриті ключі ssh мають однаковий початок?


25

Я оновлював файл дозволеного_кейса на своєму сервері відкритим ключем для нового ноутбука, який я отримав, і я з подивом виявив, що два відкриті ключі почали однаково:

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

Яка історія про AAAAB3...тощо? Коли я шукаю в Інтернеті, я бачу, що інші клавіші теж починаються. Це пояснює алгоритм чи версію чи щось таке?


1
Що для цього варто, у мене на різних комп’ютерах генерується 7 клавіш протягом кількох років, і всі вони починаються, AAAAB3NzaC1yc2EAAAAтому я здогадуюсь, що це якийсь загальний ідентифікатор типу / версії algo ...
fukawi2

Відповіді:


24

Це насправді заголовок, який визначає, що це за ключ. Якщо ви переглянете розділ Алгоритм відкритого ключа RFC 4253, ми можемо побачити це для ключів RSA

Формат ключа "ssh-rsa" має таке специфічне кодування:

 string    "ssh-rsa"
 mpint     e
 mpint     n

Тут параметри 'e' і 'n' утворюють підпис ключа підпису.

Насправді, якщо ви Base64 розшифруєте рядок "B3NzaC1yc2E", ви побачите, що він перекладається на ASCII як "ssh-rsa". Імовірно, "AAAA" являє собою якийсь заголовок, тому програма може знати, де саме в потоці даних почати обробку ключа.


Це здається надзвичайно схожим на те, що я сказав, включаючи посилання на RFC.
larsks

@larsks: Мабуть, ви потрапили, поки я ще писав свою.
Скотт Пак

15

Формат відкритого ключа SSH задокументований у RFC 4253 та тут дещо узагальнений . Дані, кодовані PEM, складаються з декількох пар (довжина, дані), і перша пара кодує ім'я алгоритму, яке буде чимось на зразок ssh-rsaабо ssh-dsa.

Це означає, що початкова частина даних відкритого ключа для всіх ssh-ключів буде однаковою.


2

Я зробив глибокий занурення у формат, перейшовши за посиланнями Скотта на потіхи. TLDR:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...
       |  "ssh-rsa"   |exponent|   modulus

RFC4231 визначає два використовувані типи даних:

  • string: Двійковий рядок довільної довжини. Рядки дозволяють містити довільні двійкові дані, включаючи нульові символи та 8-бітні символи. Вони зберігаються як такі, що uint32містять його довжину

  • mpint: Представляє декілька точних цілих чисел у форматі доповнення двох, що зберігаються у вигляді рядка, 8 біт на байт, спочатку MSB. [...]

RFC4253 sec 6.6 говорить, що ключ закодований як:

Формат ключа "ssh-rsa" має таке специфічне кодування:

string    "ssh-rsa"
mpint     e
mpint     n

Тут параметри 'e' і 'n' утворюють підпис ключа підпису. [Ed: але blob також містить, що також містить рядок "ssh-rsa"...]

Отриманий підпис кодується наступним чином:

string    "ssh-rsa"
string    rsa_signature_blob

Значення 'rsa_signature_blob' кодується у вигляді рядка, що містить s [Ed: не знаю, що таке s.] (Що є цілим числом, без довжини чи прокладки, без підпису та в порядку байтів мережі).

"ssh-rsa"

Рядок ssh-rsaперетворений у \x00\x00\x00\x07ssh-rsa, який потім кодується AAAAB3NzaC1yc2E=, тому всі ключі ssh-rsa повинні починатися з цього.

e, громадський показник

Зазвичай щось на зразок 3, 17, 257, 65537. Ці цифри кодуються як нижче (із зворотним зміщенням зверху)

  • 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

Отже, якщо ви бачите "BAw", ваш показник становив 3, або "DAQAB" = 65537

n, модуль (добуток двох ваших таємних прайме, враховуйте це!)

AAABAQпісля вищезазначеного означає, що ваша довжина ключа - 2048 біт (а ваш показник був схожий на DAQAB через pad64 padding). Весь решта базових речей - це показник, після чого нічого немає.

Інші модульні префікси, які можуть бути загальними:

  • AAAAg 1024 біт, e = 0x10001
  • AAAQI: 2048 біт, e = 3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.