¿Qué curva elíptica debo usar?

70

Actualmente estoy renovando un certificado SSL y estaba considerando cambiar a curvas elípticas. Según Bernstein y Lange , sé que no se deben usar algunas curvas, pero tengo dificultades para seleccionar las correctas en OpenSSL:

$ openssl ecparam -list_curves
  secp112r1 : SECG/WTLS curve over a 112 bit prime field
  secp112r2 : SECG curve over a 112 bit prime field
  secp128r1 : SECG curve over a 128 bit prime field
  secp128r2 : SECG curve over a 128 bit prime field
  secp160k1 : SECG curve over a 160 bit prime field
  secp160r1 : SECG curve over a 160 bit prime field
  secp160r2 : SECG/WTLS curve over a 160 bit prime field
  secp192k1 : SECG curve over a 192 bit prime field
  secp224k1 : SECG curve over a 224 bit prime field
  secp224r1 : NIST/SECG curve over a 224 bit prime field
  secp256k1 : SECG curve over a 256 bit prime field
  secp384r1 : NIST/SECG curve over a 384 bit prime field
  secp521r1 : NIST/SECG curve over a 521 bit prime field
  prime192v1: NIST/X9.62/SECG curve over a 192 bit prime field
  prime192v2: X9.62 curve over a 192 bit prime field
  prime192v3: X9.62 curve over a 192 bit prime field
  prime239v1: X9.62 curve over a 239 bit prime field
  prime239v2: X9.62 curve over a 239 bit prime field
  prime239v3: X9.62 curve over a 239 bit prime field
  prime256v1: X9.62/SECG curve over a 256 bit prime field
  sect113r1 : SECG curve over a 113 bit binary field
  sect113r2 : SECG curve over a 113 bit binary field
  sect131r1 : SECG/WTLS curve over a 131 bit binary field
  sect131r2 : SECG curve over a 131 bit binary field
  sect163k1 : NIST/SECG/WTLS curve over a 163 bit binary field
  sect163r1 : SECG curve over a 163 bit binary field
  sect163r2 : NIST/SECG curve over a 163 bit binary field
  sect193r1 : SECG curve over a 193 bit binary field
  sect193r2 : SECG curve over a 193 bit binary field
  sect233k1 : NIST/SECG/WTLS curve over a 233 bit binary field
  sect233r1 : NIST/SECG/WTLS curve over a 233 bit binary field
  sect239k1 : SECG curve over a 239 bit binary field
  sect283k1 : NIST/SECG curve over a 283 bit binary field
  sect283r1 : NIST/SECG curve over a 283 bit binary field
  sect409k1 : NIST/SECG curve over a 409 bit binary field
  sect409r1 : NIST/SECG curve over a 409 bit binary field
  sect571k1 : NIST/SECG curve over a 571 bit binary field
  sect571r1 : NIST/SECG curve over a 571 bit binary field
  c2pnb163v1: X9.62 curve over a 163 bit binary field
  c2pnb163v2: X9.62 curve over a 163 bit binary field
  c2pnb163v3: X9.62 curve over a 163 bit binary field
  c2pnb176v1: X9.62 curve over a 176 bit binary field
  c2tnb191v1: X9.62 curve over a 191 bit binary field
  c2tnb191v2: X9.62 curve over a 191 bit binary field
  c2tnb191v3: X9.62 curve over a 191 bit binary field
  c2pnb208w1: X9.62 curve over a 208 bit binary field
  c2tnb239v1: X9.62 curve over a 239 bit binary field
  c2tnb239v2: X9.62 curve over a 239 bit binary field
  c2tnb239v3: X9.62 curve over a 239 bit binary field
  c2pnb272w1: X9.62 curve over a 272 bit binary field
  c2pnb304w1: X9.62 curve over a 304 bit binary field
  c2tnb359v1: X9.62 curve over a 359 bit binary field
  c2pnb368w1: X9.62 curve over a 368 bit binary field
  c2tnb431r1: X9.62 curve over a 431 bit binary field
  wap-wsg-idm-ecid-wtls1: WTLS curve over a 113 bit binary field
  wap-wsg-idm-ecid-wtls3: NIST/SECG/WTLS curve over a 163 bit binary field
  wap-wsg-idm-ecid-wtls4: SECG curve over a 113 bit binary field
  wap-wsg-idm-ecid-wtls5: X9.62 curve over a 163 bit binary field
  wap-wsg-idm-ecid-wtls6: SECG/WTLS curve over a 112 bit prime field
  wap-wsg-idm-ecid-wtls7: SECG/WTLS curve over a 160 bit prime field
  wap-wsg-idm-ecid-wtls8: WTLS curve over a 112 bit prime field
  wap-wsg-idm-ecid-wtls9: WTLS curve over a 160 bit prime field
  wap-wsg-idm-ecid-wtls10: NIST/SECG/WTLS curve over a 233 bit binary field
  wap-wsg-idm-ecid-wtls11: NIST/SECG/WTLS curve over a 233 bit binary field
  wap-wsg-idm-ecid-wtls12: WTLS curvs over a 224 bit prime field
  Oakley-EC2N-3:
        IPSec/IKE/Oakley curve #3 over a 155 bit binary field.
        Not suitable for ECDSA.
        Questionable extension field!
  Oakley-EC2N-4:
        IPSec/IKE/Oakley curve #4 over a 185 bit binary field.
        Not suitable for ECDSA.
        Questionable extension field!

¿Podría un criptógrafo amable señalarme qué curvas aún se consideran seguras?

    
pregunta executifs 07.01.2015 - 18:18
fuente

3 respuestas

72

Estás malinterpretando el consejo de Bernstein y Lange (hay que admitir que su presentación es un poco engañosa, con las etiquetas rojas "Falsas"). Lo que significan no es que algunas curvas sean intrínsecamente inseguras, sino que la implementación segura de algunas curvas es más fácil que para otras (por ejemplo, con respecto al comportamiento de la biblioteca cuando encuentra algo que pretende ser la codificación de un punto de curva válido, pero no lo es).

Lo que realmente quieres es una curva tal que:

  • el software que confiará con su clave privada (su servidor SSL) se implementa correctamente y no filtrará detalles sobre su clave privada;
  • se logrará la interoperabilidad.

Para un certificado de servidor SSL, un certificado de "curva elíptica" se usará solo con firmas digitales (algoritmo ECDSA). El servidor firmará solo los mensajes que se genere; y, en cualquier caso, la única operación "privada" que implica una curva en ECDSA es la multiplicación del punto base convencional (codificado, ya que es parte de la definición de la curva, por lo tanto, correcto) por un valor aleatorio que genera el servidor. Por lo tanto, en su caso de uso, no hay riesgo de fuga de clave privada que sea específica a la curva utilizada. Si su implementación de SSL es deficiente, será deficiente para todas las curvas, no solo para algunas de ellas.

"Interoperabilidad" significa que probablemente lo preferiría si los clientes SSL realmente se puedan conectar a su servidor; de lo contrario, tener un servidor SSL sería bastante inútil. Esto simplifica mucho la pregunta: en la práctica, los clientes promedio solo admiten dos curvas, las que se designan en las llamadas NSA Suite B : estas son las curvas NIST P-256 y P-384 (en OpenSSL, se designan, respectivamente," prime256v1 "y" secp384r1 "). Si utiliza cualquier otra curva, algunos navegadores web generalizados (por ejemplo, Internet Explorer, Firefox ...) no podrán comunicarse con su servidor.

Use P-256 para minimizar los problemas. Si siente que su virilidad se ve amenazada por el uso de una curva de 256 bits donde está disponible una curva de 384 bits, entonces use P-384: aumentará sus costos computacionales y de red (un factor de aproximadamente 3 para la CPU, unos pocos adicionales). Docena de bytes en la red), pero es probable que esto sea insignificante en la práctica (en un servidor web con SSL, el alto costo está en "Web", no en "SSL").

    
respondido por el Thomas Pornin 07.01.2015 - 19:01
fuente
8

Yo diría que se apegue a secp521r1 - incluso DJB dice P-521 es una excelente primicia , y también es compatible con todas las bibliotecas criptográficas modernas .

Al mismo tiempo, deberíamos impulsar la adopción de curvas no NIST como Curve25519, que será totalmente rígida, menos propensa a errores de implementación y puede convertirse en una buena alternativa para aquellos que necesitan soluciones más rápidas que secp521r1.

    
respondido por el Michał Staruch 13.06.2015 - 11:46
fuente
2

Al menos no utilice las curvas secp112r1, secp112r2, secp128r1, secp128r2, secp160k1, secp160r1, secp160r2, secp192k1. tienen un tamaño demasiado pequeño para la aplicación de seguridad según la recomendación de NIST !

    
respondido por el sylvain 23.07.2015 - 16:48
fuente

Lea otras preguntas en las etiquetas