web-dev-qa-db-fra.com

La longueur de la clé publique ECC diffère de la représentation des bits

Une paire de clé ECC 256 bits (256 bits est censée être la longueur de la clé publique) générée avec OpenSSL à l'aide de cette commande à partir du manuel:

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

et la clé publique correspondante avec:

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

Le fichier public.pem contient une chaîne codée de base64, par exemple:

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

La clé publique consiste en un point (coordonnées X et Y) et la courbe utilisée.

Lors du décodé, chaque coordonnée est un nombre de 256 bits longs et la clé elle-même n'est en aucun cas de long de 256 bits. Est-ce correct?

Je vise la plus courte longueur de la clé publique possible tout en préservant la secuirty dans ma demande et je ne comprends pas pourquoi une "clé publique de 256 bits" suggérée est plus doublée de la taille en réalité.

2
Youleean

Une courbe elliptique est définie sur un champ fini de taille q pour certains Integer Q. Chaque élément de courbe est un point et comporte deux coordonnées [~ # ~ ~] x [~ # ~ ~] et [~ # ~] y [~ # ~], qui sont des éléments de courbe.

La "taille" de la courbe, qui est le paramètre important de sa résistance cryptographique, est proche de q. Il peut être montré que la taille totale de la courbe N est telle que | N Q + 1) | ≤ 2 * sqrt (q) (c'est --- (théorème de Hasse ). Donc, si vous voulez une "courbe de 256 bits", vous aurez besoin d'un champ de 256 bits.

Cependant, une clé publique est une courbe, représentée par deux coordonnées. Donc, vous vous retrouvez avec deux Valeurs 256 bits, d'où la taille de la clé publique. De plus, les formats de clé publique standard incluent également certains paramètres qui spécifient que la clé publique est du type "Courbe elliptique" et de référencer la courbe réelle à partir duquel le point fait partie du point. Nous appelons toujours une "clé publique de 256 bits" car ce nombre concerne la résistance cryptographique de la clé, non à la taille codée réelle.


Si nous creusons un peu plus loin, nous pouvons noter que tous les points de courbe doivent, par définition, remplir l'équation de la courbe, généralement Y2 = X3 + AX + B pour deux constantes A et B (ces constantes définissent réellement la courbe). Il s'ensuit que si vous savez [~ # ~ # ~] x [~ # ~], alors vous pouvez calculer y2 En utilisant l'équation de la courbe. Puisque nous travaillons dans un domaine, un élément a au plus deux racines carrées dans ce domaine, de sorte que de y2 Vous pouvez obtenir [~ # ~ # ~] y [~ # ~ ~] et y. Ceci permet compression de point : une représentation d'un point (x, y) comme seulement [- [~ # ~] x [~ # ~], plus un bit de [~ # ~] y [~ # ~ ~] (qui suffit à distinguer le [~ # ~] Y [~ # ~ ~] et y). Avec la compression POINT, une clé publique CE de 256 bits convient à 257 bits (en supposant que les informations sur la courbe utilisée sont transmises par une autre manière).

Malheureusement, la compression ponctuelle, tandis que Nifty, semble avoir été brevetée à un moment donné, de nombreuses implémentations existantes ne le soutiennent pas, même si ce serait "standard" (il est décrit dans ANS X9.62-2005). Du point de vue "RFC", la prise en charge de la compression des points est facultatif . Par conséquent, l'utilisation d'un risque de perte d'interopérabilité.

(Je ne sais pas si OpenSSL prend en charge la compression des points. Il devrait être testé.)

10
Thomas Pornin