HSM возвращает 67-байтовый открытый ключ ECDSA-secp256k1, что это значит?

#cryptography #ethereum #hsm

#криптография #ethereum #hsm

Вопрос:

Я генерирую ключ в HSM через библиотеку Graphene, за исключением случаев, когда я пытаюсь получить исходное значение открытого ключа, получая его атрибут ‘pointEC’ (эквивалентный CKA_EC_POINT ), я получаю строку из 134 символов:

044104c9d5b656518b5b7e0d747b86328c37a0d507de9b3863a43e77b559ab60c0f9b15985f83a8c20588164c0634f98eb4a4cf8ce70020e94ae21a247904fac8b1010

Теперь я понимаю, что для этого стандарта есть целые числа X и Y, но я читал, что требуется некоторая математика, чтобы сделать их действительными для генерации адреса Ethereum. Я также понимаю, что ’04’ означает, что это несжатый открытый ключ, но я не знаю, почему продолжает появляться ‘4104’ или что это значит. Это просто разные способы представления одних и тех же данных? Могу ли я просто взять последние 128 символов и хэшировать их для действительного адреса Ethereum?

Комментарии:

1. Вы пробовали это?

2. Адрес Ethereum — это просто хэш Keccak последних 20 байтов открытого ключа. Итак, последние 40 символов. Вам нужно убедиться, что открытый ключ отформатирован аналогичным образом, поскольку вы получаете его из некоторого HSM, и это необработанное значение (порядок байтов, порядок координат x / y в точке, возможно заполнение выше 32 бит и т. Д.).

3. Есть ли способ проверить, будет ли он действительным, не совершая фактической транзакции? Я бы просто хэшировал последние 128 символов, правильно?

Ответ №1:

То, что вы видите, — это несжатая точка, закодированная в BER / DER. Значение первого байта 04 не является индикатором несжатой точки. Это 3-й байт. Значение первого байта 04 кодирует байт тега для СТРОКИ ОКТЕТА ASN.1 (также известной большинству разработчиков как массив байтов). Вы можете просмотреть структуру здесь.

Байт с шестнадцатеричным значением 41 — это размер следующих байтов: 1 байт для индикатора 04 несжатой точки, 32 байта для X-координаты статического размера и 32 байта для Y-координаты.

Так что да, вы можете взять последние 64 байта и разделить его на две части, если вам нужны координаты X и Y. 128 символов — это всего лишь шестнадцатеричное представление этих байтов, но вам следует беспокоиться только о байтах.

Конечно, что вам нужно сделать, это проанализировать ASN.1, определить и проверить длину, взять несжатую точку, декодировать ее и проверить, что она находится на кривой, чтобы подтвердить ваш ввод. Ключ EC действителен, если он включает правильные параметры. Для Ethereum / BitCoin кривая, однако, неявно известна (secp256k1).

Комментарии:

1. Итак, чтобы получить адрес, должен ли я или я НЕ хэширую открытый ключ с 04? С 0x?

2. Нет, то, что вы хэшируете, — это байты открытого ключа. Так что это без 04 кодирования байтов и длин. Т.Е. Это только последние 64 байта. После небольшого поиска я нашел эту информацию здесь . Затем вы берете самые правые 20 байт результирующего хэш-хэша. НЕ хэшируйте шестнадцатеричную кодировку или 0x байты. Опять же, это просто удобочитаемое представление ключа.