Я обновлял файл author_keys на моем сервере с открытым ключом для нового ноутбука, и я был удивлен, обнаружив, что два открытых ключа начали одинаково:
# key 1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....
#
# key 2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ....
Что за история и AAAAB3...
т. Д.? С некоторыми поисками в Интернете, я вижу, что другие ключи запускаются так же. Это объясняет алгоритм или версию или что-то?
ssh
encryption
Гейб Дуразо
источник
источник
AAAAB3NzaC1yc2EAAAA
так что я предполагаю, что это какой-то общий идентификатор типа / версииОтветы:
На самом деле это заголовок, который определяет, что это за ключ. Если вы посмотрите раздел «Алгоритм открытого ключа» в RFC 4253, мы увидим, что для ключей RSA
Фактически, если вы Base64 декодируете строку «B3NzaC1yc2E», вы увидите, что она переводится в ASCII как «ssh-rsa». Предположительно, «AAAA» представляет некоторый заголовок, поэтому приложение может знать, где именно в потоке данных начинать обработку ключа.
источник
Формат открытого ключа SSH задокументирован в RFC 4253 и кратко изложен здесь . Данные, закодированные PEM, состоят из нескольких пар (длина, данные), а первая пара кодирует имя алгоритма, которое будет примерно таким
ssh-rsa
илиssh-dsa
.Это означает, что начальная часть данных открытого ключа для всех ключей ssh будет одинаковой.
источник
Я сделал излишнее глубокое погружение в формат после перехода по ссылкам Скотта для забавы. TLDR:
RFC4231 определяет два используемых типа данных:
string
: Двоичная строка произвольной длины. Строки могут содержать произвольные двоичные данные, включая нулевые и 8-битные символы. Они хранятся какuint32
содержащие его длинуmpint
: Представляет многократные целочисленные значения точности в формате дополнения до двух, сохраняются в виде строки, 8 бит на байт, сначала MSB. [...]RFC4253 sec 6.6 говорит, что ключ закодирован как:
"ssh-rsa"
Строка
ssh-rsa
преобразуется в\x00\x00\x00\x07ssh-rsa
, который затем кодируется вAAAAB3NzaC1yc2E=
, поэтому все ключи ssh-rsa должны начинаться с этого.e
Публичный экспонентОбычно что-то вроде 3, 17, 257, 65537. Эти числа кодируются как показано ниже (со смещением сверху)
'\x00\x00\x00\x01\x03'
→AAAABAw
'\x00\x00\x00\x01\x11'
→AAAABEQ
'\x00\x00\x00\x02\x01\x01'
→AAAACAQE
'\x00\x00\x00\x03\x01\x00\x01'
→AAAADAQAB
Итак, если вы видите «BAw», ваш показатель был 3, или «DAQAB» = 65537
n
, модуль (произведение ваших двух секретных простых чисел, фактор это!)AAABAQ
после вышесказанного означает, что длина вашего ключа составляет 2048 бит (и что ваш показатель степени был похож на DAQAB из-за заполнения base64). Весь остальной материал base64 - показатель степени, после него ничего нет.Другие префиксы модуля, которые могут быть общими:
AAAAg
1024 бита, e = 0x10001AAAQI
: 2048 бит, e = 3источник