web-dev-qa-db-fra.com

Quelle courbe elliptique dois-je utiliser?

Je renouvelle actuellement un certificat SSL et j'envisageais de passer aux courbes elliptiques. Per Bernstein et Lange , je sais que certaines courbes ne doivent pas être utilisées mais j'ai des difficultés à sélectionner les bonnes dans 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!

Un cryptographe aimable pourrait-il me signaler quelles courbes sont toujours considérées comme sûres?

91
executifs

Vous lisez mal les conseils de Bernstein et Lange (certes, leur présentation est un peu trompeuse, avec les effrayantes étiquettes rouges "Faux"). Ce qu'ils signifient n'est pas que certaines courbes sont intrinsèquement dangereuses, mais que une mise en œuvre sûre de certaines courbes est plus facile que pour d'autres (par exemple en ce qui concerne le comportement de la bibliothèque lorsqu'elle rencontre quelque chose qui prétend être le codage d'un point de courbe valide, mais ne l'est pas).

Ce que vous voulez vraiment, c'est une courbe telle que:

  • le logiciel auquel vous confierez votre clé privée (votre serveur SSL) est correctement implémenté et ne divulguera pas de détails sur votre clé privée;
  • l'interopérabilité sera réalisée.

Pour un certificat de serveur SSL, un certificat de "courbe elliptique" sera utilisé uniquement avec les signatures numériques (algorithme ECDSA). Le serveur ne signera que les messages qu'il génère lui-même; et, en tout cas, la seule opération "privée" impliquant une courbe dans ECDSA est la multiplication du point de base conventionnel (codé en dur, car il fait partie de la définition de la courbe, donc correct) par une valeur aléatoire que le serveur génère. Par conséquent, dans votre cas d'utilisation, il n'y a aucun risque de fuite de clé privée qui serait spécifique à la courbe utilisée. Si votre implémentation SSL est mauvaise, elle le sera pour toutes les courbes, pas seulement pour certaines d'entre elles.

"Interopérabilité" signifie que vous préféreriez probablement que les clients SSL puissent réellement se connecter à votre serveur; sinon, avoir un serveur SSL serait plutôt inutile. Cela simplifie beaucoup la question: dans la pratique, les clients moyens ne prennent en charge que deux courbes, celles qui sont désignées dans ce que l'on appelle NSA Suite B : il s'agit des courbes NIST P-256 et P-384 (dans OpenSSL, elles sont désignées respectivement par "prime256v1" et "secp384r1"). Si vous utilisez une autre courbe, certains navigateurs Web répandus (par exemple Internet Explorer, Firefox ...) ne pourront pas parler à votre serveur.

Utilisez P-256 pour minimiser les problèmes. Si vous sentez que votre virilité est menacée en utilisant une courbe de 256 bits où une courbe de 384 bits est disponible, alors utilisez P-384: cela augmentera vos coûts de calcul et de réseau (un facteur d'environ 3 pour le CPU, quelques supplémentaires) une douzaine d'octets sur le réseau), mais cela risque d'être négligeable en pratique (dans un serveur Web SSL, le coût élevé est dans "Web", pas dans "SSL").

96
Thomas Pornin

Je dirais que je m'en tiens à secp521r1 - même DJB dit le P-521 est plutôt joli , et c'est aussi pris en charge dans toutes les bibliothèques de cryptographie modernes .

Dans le même temps, nous devrions faire avancer l'adoption de courbes non NIST comme Curve25519, qui seront entièrement rigides, moins sujettes aux erreurs de mise en œuvre et pourraient devenir une alternative intéressante pour ceux qui ont besoin de solutions plus rapides que secp521r1.

9
Michał Staruch

N'utilisez pas au moins les courbes secp112r1, secp112r2, secp128r1, secp128r2, secp160k1, secp160r1, secp160r2, secp192k1. ils ont une taille trop petite pour l'application de sécurité selon recommandation NIST !

3
sylvain