La longitud de la clave pública ECC difiere de la representación de bits

1

Un par de claves ECC de 256 bits (se supone que 256 bits es la longitud de la clave pública) generado con OpenSSL usando este comando del manual:

openssl ecparam -name secp256k1 -genkey -noout -out key.pem

y la clave pública correspondiente con:

openssl ec -in key.pem -out public.pem -pubout

El archivo public.pem contiene una cadena codificada en base64, por ejemplo:

-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdPzYnkmkF8oy+R+FcByIbyPBE2l6HHOJ
mfZWtAaFZyIx9WPSzZTdyjmWlFqLvwaFlHu9OX9e7Snslfw7nneDIw==
-----END PUBLIC KEY-----

La clave pública consiste en un punto (coordenadas x e y) y la curva utilizada.

Cuando se decodifica, cada coordenada es un número de 256 bit de longitud y la clave en sí no es de 256 Bit. ¿Esto es correcto?

Busco la longitud de la clave pública más corta posible al tiempo que preservo la seguridad en mi aplicación y no entiendo por qué una "clave pública de 256 bits" sugerida es más que el doble del tamaño en realidad.

    
pregunta Youleean 12.06.2014 - 23:00
fuente

1 respuesta

9

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)

    
respondido por el Thomas Pornin 12.06.2014 - 23:14
fuente

Lea otras preguntas en las etiquetas