Я зробив глибокий занурення у формат, перейшовши за посиланнями Скотта на потіхи. 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
AAAAB3NzaC1yc2EAAAA
тому я здогадуюсь, що це якийсь загальний ідентифікатор типу / версії algo ...