Если вы используете одну из «именованных кривых», тогда размер открытого ключа будет фиксированным и зависит от «размера поля» вашей базовой кривой.
Сжатое или несжатое представление
Размеры открытого ключа также зависят от того, используется ли «несжатое» представление или «сжатое» представление. В несжатой форме размер открытого ключа равен удвоенному размеру поля (в байтах) + 1, в сжатой форме - размеру поля + 1. Так что если ваша кривая определена на secp256r1
(также называется NIST P-256
или X9.62 prime256v1
) , тогда размер поля составляет 256 бит или 32 байта. И поэтому открытый ключ будет ровно 65 байтов (32 * 2 +1) в несжатом виде и 33 байта (32 +1) в сжатом виде.
Несжатая форма состоит из 0x04 (по аналогии с тегом DER OCTET STRING ) плюс конкатенация двоичного представления координаты X плюс двоичное представление координаты y публичной точки.
GF (2 ^ p) case
Если основным полем является GF (2 ^ p), то x и y можно рассматривать как элементы из [0, n-1]. Они кодируются обычным образом, так как целые числа кодируются, а оставшееся пространство для точного заполнения log2 (p) / 8 байтов дополняется нулями.
GF (2 ^ m) кейс
Для GF (2 ^ m) x и y можно рассматривать как полиномы a_0x_0 + ... + a_m-1 с коэффициентами a_i 0 или 1. Их двоичное представление - это просто конкатенация коэффициентов.
Дальнейшее чтение
Точные детали можно найти в SEC1v2 . (Особенно раздел 2.3.3 Преобразование эллиптической кривой в точку-октет-строку на страницах 10 и 11.)