Una curva ellittica è definita su un campo finito di dimensioni q per alcuni interi q . Ogni elemento di curva è un punto e ha due coordinate X e Y , che sono elementi di curva.
La "dimensione" della curva, che è il parametro importante per la sua forza crittografica, è vicina a q . Si può dimostrare che la dimensione della curva totale n è tale che | n - (q + 1) | ≤ 2 * sqrt (q) (cioè il teorema di Hasse ). Quindi se vuoi una "curva a 256 bit" avrai bisogno di un campo a 256 bit.
Tuttavia, una chiave pubblica è un punto curva, rappresentato da due coordinate. Quindi ti ritroverai con due valori a 256-bit, quindi la dimensione della chiave pubblica. Inoltre, i formati di chiave pubblica standard includono anche alcuni parametri che specificano che la chiave pubblica è del tipo "curva ellittica" e fanno riferimento alla curva effettiva da cui il punto è parte. Lo chiamiamo ancora "chiave pubblica a 256 bit" perché quel numero si riferisce alla forza crittografica della chiave, non alla effettiva dimensione codificata.
Se approfondiamo un po ', possiamo notare che tutti i punti della curva devono, per definizione, soddisfare l'equazione della curva, di solito Y 2 = X 3 + aX + b per due costanti a e b (queste costanti definiscono effettivamente la curva). Ne consegue che, se conosci X , puoi calcolare Y 2 usando l'equazione della curva. Dato che stiamo lavorando in un campo, un elemento ha al massimo due radici quadrate in quel campo, quindi da Y 2 puoi ottenere Y e -Y . Ciò consente la compressione dei punti : una rappresentazione di un punto (X, Y) come solo X , più un bit di Y (che è sufficiente per distinguere tra Y e -Y ). Con la compressione dei punti, una chiave pubblica EC a 256 bit si adatta a 257 bit (presupponendo che le informazioni sulla curva utilizzata vengano trasmesse in un altro modo).
Sfortunatamente, la compressione dei punti, mentre nifty, sembra essere stata brevettata ad un certo punto, quindi molte implementazioni esistenti non la supportano, anche se sarebbe "standard" (è descritta in ANS X9.62- 2005). Dal punto di vista "RFC", il supporto della compressione dei punti è opzionale . Pertanto, utilizzarlo comporta un rischio di perdita di interoperabilità.
(Non so se OpenSSL supporti la compressione dei punti. Dovrebbe essere testato.)