La lunghezza della chiave pubblica ECC differisce dalla rappresentazione dei bit

1

Una coppia di chiavi ECC a 256 bit (si suppone che 256 bit sia la lunghezza della chiave pubblica) generata con OpenSSL usando questo comando dal manuale:

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

e la chiave pubblica corrispondente con:

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

Il file public.pem contiene una stringa codificata in base 64, ad esempio:

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

La chiave pubblica è composta da un punto (coordinate xey) e dalla curva utilizzata.

Quando decodificato, ogni coordinata è un numero lungo 256 bit e la chiave stessa non è affatto lunga 256 bit. È corretto?

Sto puntando alla lunghezza della chiave pubblica più corta, preservando la secuirty nella mia applicazione e non capisco perché una "chiave pubblica a 256 bit" suggerita è più che raddoppiata nella realtà.

    
posta Youleean 12.06.2014 - 23:00
fonte

1 risposta

9

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.)

    
risposta data 12.06.2014 - 23:14
fonte

Leggi altre domande sui tag