Рейтинг:1

Как общий секрет ECDH представлен в SoftHSM

флаг ve

Я работаю над внедрением ECDH с некоторыми HSM. Согласно теории ECDH, сгенерированный общий секрет представляет собой точку на эллиптической кривой (x, y), которая и возвращается HSM.

Но когда я тестирую с SoftHSM через библиотеку PKCS#11, функция ECDH возвращает симметричный ключ напрямую, даже если для параметра KDF установлено значение null. Я провел небольшое исследование и обнаружил, что некоторые байты общего секрета возвращаются как значение симметричного ключа: https://github.com/google/boringssl/blob/master/include/openssl/ecdh.h#L82

Однако меня смущает, как такая операция может быть выполнена с общим секретом, если он представлен в виде точки EC (x, y).

Кто-нибудь знает, как SoftHSM обрабатывает ECDH с параметром KDF как нулевым? В частности, в какой форме находится общий секрет после создания в SoftHSM, но до обработки и помещения в ключевой объект?

Спасибо

Maarten Bodewes avatar
флаг in
Обычно координаты X, Y кодируются как большие целочисленные значения без знака, статического размера, а затем объединяются. Затем байты берутся с левой стороны. Если бы мне пришлось угадывать, что делает библиотека, но чтобы быть уверенным, вам нужно было бы изучить исходный код *или* протестировать его с другой парой библиотека/ключ.
флаг cn
Многие реализации ECDH вычисляют только одну координату общего секрета.
kelalaka avatar
флаг in
https://github.com/opendnssec/SoftHSMv2
Maarten Bodewes avatar
флаг in
@CodesInChaos Привет, рад, что ты все еще здесь! Да, я подумал, стоило ли упоминать, что это еще один вариант, когда используется только координата X. Но эй, если исходить с левой стороны, надеюсь, это не имеет большого значения (конечно, одна сторона может использовать только X для вывода ключа, а другая X и Y).
Fan Zhang avatar
флаг ve
Спасибо @MaartenBodewes за ответ.Я просмотрел код SoftHSM, и он делает то, что вы сказали, беря определенную длину из сгенерированного секрета. Но меня смущает, как сгенерированный секрет преобразуется из точки EC в байты. Преобразованы ли x и y в байты и объединены ли они, или есть определенный метод? Например, ECPublicKey формируется как tag + x + y. Спасибо!
Fan Zhang avatar
флаг ve
Спасибо @CodesInChaos за ответ. If I have a generated secret as (64830192060261760049283727294808668110354933976341491567578109548061246609139, 59423428101938593951845145007294894818095890801518227616691263742277914054172) and want an AES128 key, you mean most implementations take the x coordinate and convert it into a byte array and then extract the first 128 bits of it? Спасибо
Maarten Bodewes avatar
флаг in
Как указано в первом комментарии, обычно они не преобразуются в кодировку DER, а сохраняются в виде целых чисел со статическим знаком. Было бы странно кодировать точку ложными байтами данных, поскольку вы не хотите иметь кодировку тега и длины как часть симметричного ключа, вам нужны в основном рандомизированные данные. KDF, безусловно, поможет. Обратите внимание, что координата Y может быть вычислена из координаты X, поэтому нет особого смысла включать ее в ключ или во входной ключевой материал KDF. Вот почему многие реализации принимают только X, а не X и Y.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.