Назад | Перейти на главную страницу

Почему у моих двух открытых ключей ssh ​​одинаковое начало?

Я обновлял файл authorized_keys на своем сервере с помощью открытого ключа для нового ноутбука, который получил, и был удивлен, обнаружив, что два открытых ключа начинаются одинаково:

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

Что за история AAAAB3... и т.д? Проведя поиск в Интернете, я вижу, что другие клавиши тоже запускаются. Это объясняет алгоритм или версию или что-то в этом роде?

На самом деле это заголовок, который определяет, что это за ключ. Если вы посмотрите раздел Алгоритм открытого ключа RFC 4253 мы видим, что для ключей RSA

Формат ключа "ssh-rsa" имеет следующую кодировку:

 string    "ssh-rsa"
 mpint     e
 mpint     n

Здесь параметры 'e' и 'n' образуют большой двоичный объект ключа подписи.

Фактически, если вы декодируете Base64 строку «B3NzaC1yc2E», вы увидите, что она переводится в ASCII как «ssh-rsa». Предположительно, «AAAA» представляет собой какой-то заголовок, чтобы приложение могло знать, где именно в потоке данных начать обработку ключа.

Формат открытого ключа SSH задокументирован в RFC 4253, и несколько резюмировал Вот. Данные, закодированные в PEM, состоят из ряда пар (длина, данные), и первая пара кодирует имя алгоритма, которое будет примерно таким: ssh-rsa или ssh-dsa.

Это означает, что начальная часть данных открытого ключа для всех ключей ssh ​​будет аналогичной.

Я очень глубоко погрузился в формат после того, как перешел по ссылкам Скотта для забавы. TL; DR:

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

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFKy...
           |   "ssh-ed25519"   |   32 byte public key

RFC4231 определяет два используемых типа данных:

  • string: Двоичная строка произвольной длины. Строки могут содержать произвольные двоичные данные, включая нулевые символы и 8-битные символы.

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

Оба типа данных начинаются с символа uint32 определение длины будущих данных. Потому что обычно это перебор, и вы получаете много нулей (например, "abc" сохраняется как \x00\x00\x00\x03abc...), они заканчиваются как пробеги As в полезной нагрузке в кодировке base64 (...AAAAA2FiYwo)

RFC4253 сек. 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 [Эд: не знаю, что это такое.] (которое является целым числом, без длины и заполнения, без знака и в сетевом порядке байтов).

Более современные ключи Ed25519 и Ed448 определены в RFC-8709 и имеет два поля:

  • постоянная строка "ssh-ed25519" (или "ssh-ed448")
  • 32-байтовый (или 57-байтовый) открытый ключ в виде строки

"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