Una curva elíptica se define sobre un campo finito de tamaño q para algún entero q . Cada elemento de curva es un punto y tiene dos coordenadas X y Y , que son elementos de curva.
El "tamaño" de la curva, que es el parámetro importante por su fuerza criptográfica, está cerca de q . Se puede mostrar que el tamaño total de la curva n es tal que | n - (q + 1) | ≤ 2 * sqrt (q) (eso es teorema de Hasse ). Por lo tanto, si desea una "curva de 256 bits" necesitará un campo de 256 bits.
Sin embargo, una clave pública es un punto de curva, representado por dos coordenadas. Así que terminas con dos valores de 256 bits, de ahí el tamaño de la clave pública. Además, los formatos de clave pública estándar también incluyen algunos parámetros que especifican que la clave pública es del tipo "curva elíptica" y hacen referencia a la curva real de la que forma parte el punto. Todavía lo llamamos "clave pública de 256 bits" porque ese número se relaciona con la fuerza criptográfica de la clave, no con el tamaño codificado real.
Si cavamos un poco más, podemos observar que todos los puntos de la curva deben, por definición, cumplir la ecuación de la curva, generalmente Y 2 = X 3 + aX + b para dos constantes a y b (estas constantes definen la curva). De ello se deduce que, si conoce X , puede calcular Y2 utilizando la ecuación de curva. Ya que estamos trabajando en un campo, un elemento tiene como máximo dos raíces cuadradas en ese campo, por lo que desde Y2 puede obtener Y y -Y . Esto permite compresión de puntos : una representación de un punto (X, Y) como solo X , más un bit de Y (que es suficiente para distinguir entre Y y -Y ). Con la compresión de puntos, una clave pública EC de 256 bits encaja en 257 bits (asumiendo que la información sobre la curva utilizada se transmite de alguna otra manera).
Desafortunadamente, la compresión de puntos, aunque ingeniosa, parece haberse patentado en algún momento, por lo que muchas implementaciones existentes no lo admiten, aunque sería "estándar" (se describe en ANS X9.62- 2005). Desde el punto de vista "RFC", el soporte de la compresión de puntos es opcional . Por lo tanto, su uso conlleva un riesgo de pérdida de interoperabilidad.
(No sé si OpenSSL admite la compresión de puntos. Debería probarse)