Я сделал излишнее глубокое погружение в формат после перехода по ссылкам Скотта для забавы. 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' образуют блок ключа подписи. [Эд: но блоб, кажется, также содержит строку "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 из-за заполнения base64). Весь остальной материал base64 - показатель степени, после него ничего нет.
Другие префиксы модуля, которые могут быть общими:
AAAAg
1024 бита, e = 0x10001
AAAQI
: 2048 бит, e = 3
AAAAB3NzaC1yc2EAAAA
так что я предполагаю, что это какой-то общий идентификатор типа / версии