Каковы части записи ECDSA в файле known_hosts?

Я пытаюсь извлечь открытый ключ ECDSA из моего файла known_hosts, который ssh использует для проверки хоста. У меня есть один ниже в качестве примера.

Это запись для 127.0.0.1 ecdsa-sha2-nistp256 в моем файле known_hosts:

AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBF3QCzKPRluwunLRHaFVEZNGCPD / rT13yFjKiCesA1qoU3rEp9syhnJgTjoc71

Я прогнал его через декодер Base64, чтобы получить следующее:

���ecdsa-sha2-nistp256���nistp256���A] 2F [rUF = wXʈ'ZSzħ2r`M :: WL0rp

Итак, я предполагаю, что эти вопросительные знаки являются своего рода разделителем (нет, это длина). Я подумал, что используется эллиптическая кривая nistp256, но что это за последнее значение?

Из того, что я читал, открытый ключ для ECDSA имеет пару значений x и y, которые представляют точку на кривой. Есть ли способ извлечь оттуда x и y?

Я пытаюсь преобразовать его в объект открытого ключа Java, но для этого мне нужны x и y.


person loosebazooka    schedule 08.02.2013    source источник


Ответы (2)


Показаны не все символы, так как они двоичные. Запишите в файл значение в формате Base64 и откройте его в шестнадцатеричном редакторе.

Открытый ключ для кривой P256 должен быть 65-байтовым массивом, начиная с байта со значением 4 (что означает несжатую точку). Следующие 32 байта будут значением x, а следующие 32 байта - значением y.

person Nickolay Olshevsky    schedule 08.02.2013
comment
Значит, ECDSA - это фиксированная длина? Я просматривал кое-что о ssh-rsa (и ssh-dsa), это не фиксированная длина? Похоже, что у каждой ключевой части есть префикс некоторой длины. Это правда? - person loosebazooka; 09.02.2013
comment
Компоненты ECDSA обычно представлены с использованием обозначения фиксированной длины, но не всегда. Да, для каждого значения указывается некоторая длина, это правильно, см. Мой ответ. - person Maarten Bodewes; 09.02.2013

Вот результат в шестнадцатеричном виде:


Алгоритм подписи:

00 00 00 13
65 63 64 73 61 2d 73 68 61 32 2d 6e 69 73 74 70 32 35 36
(ecdsa-sha2-nistp256)

Имя параметров домена:

00 00 00 08
6e 69 73 74 70 32 35 36
(nistp256)

Значение открытого ключа:

00 00 00 41
04
5d d0 0b 32 8f 46 5b b0 ba 72 d1 1d a1 55 11 93 46 08 f0 ff ad 3d 77 c8 58 ca 88 27 ac 03 5a a8
53 7a c4 a7 db 32 86 72 60 4d b6 89 80 ae f4 3a 3a 13 ef 57 c3 1a 4c 30 72 70 99 b8 94 0f 15 fa

Итак, сначала у вас есть имя используемого алгоритма цифровой подписи, затем имя кривой, а затем открытый компонент ключа, представленный несжатой точкой EC. Несжатые точки начинаются с 04, затем с координаты X (того же размера, что и размер ключа), а затем с координаты Y.

Как видите, всем значениям поля предшествуют четыре байта, указывающие размер поля. Все значения и поля используют запись с прямым порядком байтов.

person Maarten Bodewes    schedule 09.02.2013
comment
Да, я наконец понял, что разделители были всех длин, а ключевая часть имела префикс одной длины. - person loosebazooka; 09.02.2013
comment
@owlstead, есть идеи, как это работает с nistp521? Будучи 521 битом, то есть 65,125 байта, поэтому используют ли они заполненный 66-байтовый буфер и другой заполненный 66-байтовый буфер, или они используют объединенный 131-байтовый буфер и распаковывают биты в 521 и 521 (с оставшимися 6 битами)? - person Lucas; 13.10.2013
comment
Обычно все используют заполнение для целых чисел, а не для комбинированных значений. Эти функции обычно называются I2OS или аналогичными (целое число в строку октета). - person Maarten Bodewes; 13.10.2013