[TECH] L’algorithme ECDSA – Application dans 2D-Doc

ECDSA

ECDSA est un algorithme cryptographique : Elliptic Curve Digital Signature Algorithm.

ECDSA fait partie de la famille des algorithmes asymétriques. L'algorithme repose dans ce cas sur une paire de clé, une dite privée connue uniquement par son porteur et stockée sur un support dédié (carte ou token cryptographique, HSM, un fichier software pour des raisons de test, ...) et une deuxième clé dite publique connue par tout le monde et stockée sous forme d'un certificat X.509 émis par une autorité de confiance (fichier .crt, .cer, .pem, ...).

Dans le contexte du métier de signature électronique, le signataire utilise sa clé privée pour chiffrer des données. Le résultat de cette opération étant appelée signature cryptographique (par opposition à la signature avancée qui à son tour inclut la signature cryptographique mais y rajoute d'autres informations, conditions et contraintes).

La clé publique est à son tour utilisée pour déchiffrer (décrypter) la signature cryptographique. Cette opération permet d'assurer l'authentification de l'émetteur de la signature cryptographique.

Pourquoi ECDSA

Il est important de rappeler qu'une signature cryptographique générée avec un algorithme ECDSA ayant la taille 64 bits a le même niveau de sécurité d'une signature cryptographique RSA de taille 2048 bits.

Sachant que la norme 2D-Doc cherche à optimiser la taille de toutes ses composantes afin de générer un code à barre d'une taille raisonnable, le choix de l'utilisation de l'algorithme ECDSA devient raisonnable et évident.

La norme 2D-Doc indique qu'il faut obligatoirement utiliser des clés ECDSA en utilisant la courbe elliptique dite P-256. Rien n'interdit d'utiliser des clés d'une taille supérieure (Des clés de signature avec la courbe dite P-384 pour une plus longue validité des 2D-Doc générés, ceci est le cas de la carte Labes générée par QRSecure)

Selon les recommandations NIST https://www.keylength.com/en/4/ on peut même remarquer que les clés ECDSA avec la courbe elliptique P-256 ont le même niveau de sécurité que les clés de signature RSA de taille 3072. Dans les deux cas, les clés et les signatures sont protégés au delà de 2030.

La signature cryptographique ECDSA

La signature cryptographique est une opération purement mathématique. Dans le cadre des signatures ECDSA, ceci revient à appliquer une fonction elliptique à partir d'une base donnée.

Le résultat étant deux nombres d'une taille fixe appelés R et S. La taille de ces membres est fixe en fonction de la taille de la clé de chiffrement.

Par exemple, pour une clé de chiffrement utilisant la courbe P-256, R et S ont chacun la taille 32 alors que pour une clé de chiffrement suivant la courbe P-384, la taille de R et S est de 46.

R et S étant deux nombres, ils peuvent naturellement être soit négatifs ou positifs. Dans la pratique, un bit de valeur 0 est ajouté pour que R et/ou S qui a une valeur négative devienne positif.

Représentation de la signature cryptographique ECDSA

La signature cryptographique ECDSA peut-être représentée de plusieurs façons différentes. Nous allons nous concentrer dans ce qui suit sur deux représentations directement liées à 2D-Doc.

Représentation ASN.1 en encodage DER

Nous pouvons définir ASN.1 comme une représentation abstraite permettant de décrire des données binaires. DER étant une des implémentations de ASN.1, et celle la plus utilisée dans le cadre des signatures électroniques.

DER étant l'abréviation de Distinguished Encoding Representation. Il permet de définir une représentation universelle des données binaires. DER repose sur la notion TLV qui est l'abréviation de Tag, Length and Value.

TLV consiste à décrire toute donnée par :

  • TAG : (un code, une constante, ...)
  • LENGTH : qui est la taille de la donnée protégée par le TAG en question
  • VALUE : la valeur en question.

La définition de la signature ECDSA en ASN.1 est la suivante :

ECDSA-Sig-Value ::= SEQUENCE {
     r  INTEGER,
     s  INTEGER
   }

La représentation de la signature sera alors sous forme de

[TAG SEQUENCE] [TAILLE DE TOUTE LA SEQUENCE] [TAG INT] [TAILLE DE R] [R] [TAG INT] [TAILLE DE S] [S]

Nous distinguons dans cette représentations les TAG, les Length et les VALUE qui sont principalement R et S.

Sachant que :

  • Chaque TAG est représenté par un seul octet
  • Chaque LENGTH est représenté par un seul octet

Pour un exemple d'une paire de clé suivant la courbe P-256, nous pouvons avoir les combinaisons suivantes :

  • R et S positifs : La taille de chacun est de 32 bits. La taille totale de la signature est alors de 70 octets.
  • L'un est positif, l'autre est négatif : La taille du nombre négatif est de 33 octets que le nombre positif est de taille 32 octets. La taille totale de la signature est alors de 71 octets.
  • R et S négatifs : Les deux nombres sont de taille 33 octets chacun. La taille totale de la signature est de 72 octets.

Représentation de la signature cryptographique avec 2D-Doc (CEV)

Carte Labes : 2D-Doc (CEV)

Carte Labes : 2D-Doc (CEV)

Dans le cadre de 2D-Doc (Cachet Électronique Visible) les TLV ne doivent pas être utilisée. C'est la représentation RAW de R suivie par S qui doit être utilisée. R et S doivent avoir une taille de 32 octets chacun en acceptant la représentation négative quand elle se présente (le 0 ne doit pas être ajouté à la représentation du nombre négatif).

Quand l'application de génération de signature retourne une signature encodée en DER, le générateur du 2D-Doc doit la traiter pour n'en extraire que R et S afin de les insérer dans le 2D-Doc.

A la validation, c'est l'opération inverse qui s'impose. Il faut retrouver la signature représentée en ASN.1 à partir de R | S tel que dans le code 2D-Doc.

Les commentaires sont fermés.