¿Se pueden usar curvas elípticas personalizadas en implementaciones TLS comunes?

13

Los desarrollos recientes han lanzado algunos duda sobre las curvas elípticas especificadas por el NIST y utilizadas en muchos estándares como TLS (para firmas con ECDSA y acuerdo clave con ECDHE).

Parece que el estándar permite las curvas ECDH personalizadas, generadas por el servidor, que son transmitido durante el protocolo de enlace (solo como con DH no elíptico ).

  • ¿Las implementaciones comunes realmente lo admiten o están restringidas a las curvas especificadas por el NIST? He rastreado handshakes TLS con Google Chrome y iOS; Parece que la extensión elliptic_curves solo especifica las curvas secp{256,384,521}r1 , y no arbitrary_explicit_{prime,char2}_curves .

  • ¿Cuál es la situación de los certificados de curva elíptica? Parece que TLS requiere certificados X.509 que cumplan con RFC3279 o cualquier RFC que lo reemplace (que sería RFC5480). Según RFC3279 , es posible; En RFC5480 , las curvas explícitas o implícitas son específicamente excluido .

En general, ¿en qué medida las curvas elípticas personalizadas están permitidas por los estándares actuales (TLS, S / MIME, etc.) y son compatibles con las diversas implementaciones (OpenSSL, NSS, propietarias)?

Si no son compatibles: ¿Por qué? ¿Es más difícil encontrar curvas "buenas" que encontrar parámetros DH adecuados? ¿Son las curvas comunes más fáciles de verificar y / o implementar? ¿Son más rápidos?

    
pregunta lxgr 09.09.2013 - 19:07
fuente

2 respuestas

12

El NIST tiene "definidas" 15 "curvas estándar", especificadas en FIPS 186- 4 . En realidad, ellos mismos no los definieron; los heredaron de SEC . Estas 15 curvas se agregan en 3 grupos:

  • Las curvas P- * funcionan en un "campo principal" (las coordenadas del punto son enteros módulo a primo p ).
  • Las curvas B- * funcionan en un "campo binario" (las coordenadas de los puntos son valores en GF (2 m ) ).
  • Las curvas K- * funcionan en los mismos campos que las curvas B- *, pero tienen una estructura especial que permite cálculos más rápidos.

El NIST descubrió que había una gran renuencia a implementar el soporte para estas 15 curvas, y mucho menos para las curvas "generales", por una variedad de razones:

  • Se considera que las matemáticas involucradas son "difíciles" (eso es más difícil de entender que RSA o Diffie-Hellman).
  • ... más aún para curvas en campos binarios.
  • Si bien es posible escribir un código "genérico" de manejo de curvas, el código que apunta a una curva específica a menudo es más fácil de implementar y más rápido. En particular, las curvas P- * funcionan con valores de módulo primo cuyo formato hace que la implementación sea más eficiente (reducción modular rápida).
  • Ha habido reclamos recurrentes y de larga data de patentes , haciendo que el uso de la curva elíptica sea "arriesgado".
  • ... especialmente para curvas en campos binarios;
  • ... y más generalmente para curvas genéricas elegidas para tener alguna característica que sea beneficiosa para la implementación. No se sabe si una curva se puede patentar (a diferencia de una técnica de implementación respaldada por una estructura de curva especial), pero la incertidumbre ya produce una fuerte disuasión.

Por lo tanto, las personas desconfiaban de implementar un soporte genérico para curvas elípticas, porque parecía ser difícil, perjudicial para el rendimiento y un campo de minas legal. Pegarse a algunas de las curvas más simples parecía más fácil, más rápido y más seguro; y eso es lo que paso NIST (bueno, NSA) formalizó esta tendencia como su suite de criptografía " suite B ", que exige la implementación de exactamente dos curvas: P-256 y P-384.

En SSL / TLS y en X.509, se pueden usar curvas arbitrarias. Sin embargo, la mayoría de las implementaciones no admiten curvas arbitrarias. OpenSSL admite las 15 curvas NIST, pero no las curvas arbitrarias. Firefox solo admite P-256 y P-384; No estoy seguro de que el código de Microsoft (Windows, por lo tanto, Internet Explorer) acepte más que eso (quizás también el P-521). Si intenta utilizar cualquier otra curva que no sea P-256 o P-384, entonces encontrará problemas de interoperabilidad (más problemas de los que ya obtiene al utilizar curvas elípticas). Algunos escritores estándar, sintiendo que deben "ser prácticos", han admitido completamente este hecho y solo han prohibido el uso de otras curvas, como se puede ver en RFC 5480 .

La generación de su propia curva no es difícil, pero es sustancialmente más difícil que la generación de sus propios parámetros DH. Implica el conteo de puntos con algoritmo de Schoof o una variante del mismo. No podrá abarcar un generador de curvas en una hora y cien líneas de código Java, mientras que la producción de parámetros DH se puede hacer bajo estas restricciones. El costo computacional también es más alto (todavía obtendrá una buena curva en un minuto, pero no en 100 ms). Para ser breve, la gente no lo hace a menudo, o en absoluto.

    
respondido por el Thomas Pornin 09.09.2013 - 19:37
fuente
0

Hay varias familias de curvas.

La elección del NIST fue sobre la ecuación corta de weiertstrass para campos primos  (y ^ 2 = x ^ 3 + ax + b)% p con orden n, cofactor h.

Las curvas personalizadas en SSL son la elección de diferentes a, b, p, n, h para la misma ecuación

Los campos binarios de NIST son una familia de curvas diferente

ed25519 es de la familia de la curva edwards torcida

c25519 es una curva de la familia de curvas de montgomery

Para cada familia, necesita más que unos pocos parámetros en un intercambio de protocolo, también necesita un código fuente para implementarlos. El nuevo código no se genera automáticamente en su biblioteca TLS / SSL. Tienes que esperar a que la comunidad de código abierto adopte las nuevas familias de curvas. Luego, también debe luchar contra la renuencia de los mantenedores de productos a exagerar su código fuente. Puede encontrar más y más familias de curvas aquí enlace , las más rápidas pueden ser las curvas de Huff y no están listadas.

    
respondido por el Pierre 23.08.2014 - 10:15
fuente

Lea otras preguntas en las etiquetas