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

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

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

Какова история на AAAAB3... и т. д.? С некоторыми поисками в Интернете я вижу, что другие ключи тоже начинают работать. Объясняет ли он алгоритм или версию или что-то еще?

22 голоса | спросил Gabe Durazo 26 J000000Friday13 2013, 04:49:14

3 ответа


22

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

  

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

 string    "ssh-rsa"
 mpint     e
 mpint     n
     

Здесь параметры «e» и «n» формируют ключевое слово blob.

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

ответил Scott Pack 26 J000000Friday13 2013, 05:19:56
14

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

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

ответил larsks 26 J000000Friday13 2013, 05:16:57
0

Я сделал глубокий погружение в формат после того, как после ссылок Скотта на смешные темы. 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» формируют ключевое слово blob. [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 из-за заполнения базы64). Весь остальной материал base64 является экспонентом, после этого ничего не происходит.

Другие префиксы модуля, которые могут быть общими:

  • AAAAg 1024 бит, e = 0x10001
  • AAAQI: 2048 бит, e = 3
ответил Nick T 13 MaramTue, 13 Mar 2018 01:12:30 +03002018-03-13T01:12:30+03:0001 2018, 01:12:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132