Passa al contenuto principale

1. Introduzione

Molti protocolli crittografici richiedono una procedura che codifichi un input arbitrario, ad esempio una password, in un punto di una curva ellittica. Tale procedura è nota come hashing su una curva ellittica, in cui la procedura di hashing fornisce resistenza alle collisioni e non rivela il logaritmo discreto del punto prodotto. Esempi di rilievo di crittosistemi che effettuano l'hashing su curve ellittiche includono gli scambi di chiavi autenticati con password (password-authenticated key exchanges) [BM92] [J96] [BMP00] [p1363.2], la crittografia basata sull'identità (Identity-Based Encryption) [BF01], le firme Boneh-Lynn-Shacham [BLS01] [BLS-SIG], le funzioni casuali verificabili (Verifiable Random Functions) [MRV99] [VRF] e le funzioni pseudo-casuali oblivious (Oblivious Pseudorandom Functions) [NR97] [OPRFs].

Purtroppo, per gli implementatori, la funzione di hash esatta adatta a un dato protocollo realizzato tramite una data curva ellittica è spesso poco chiara dalla descrizione del protocollo. Nel frattempo, una scelta errata della funzione di hash può avere conseguenze disastrose per la sicurezza.

Il presente documento mira a colmare questa lacuna fornendo un insieme completo di algoritmi raccomandati per un'ampia gamma di tipi di curve. Ciascun algoritmo è conforme a un'interfaccia comune: prende in input una stringa di byte di lunghezza arbitraria e produce in output un punto su una curva ellittica. Forniamo i dettagli di implementazione di ciascun algoritmo, descriviamo la motivazione di sicurezza alla base di ciascuna raccomandazione e forniamo indicazioni per le curve ellittiche non esplicitamente trattate. Presentiamo inoltre implementazioni ottimizzate delle funzioni interne utilizzate da tali algoritmi.

I lettori che desiderano specificare o implementare rapidamente una funzione di hash conforme dovrebbero consultare la Sezione 8, che elenca le suite di hash-to-curve raccomandate e descrive sia come implementare una suite esistente sia come specificarne una nuova.

Il presente documento non specifica metodi di campionamento per rifiuto probabilistici, a volte denominati "try-and-increment" o "hunt-and-peck", poiché l'obiettivo è specificare algoritmi che possano ragionevolmente essere calcolati in tempo costante. L'uso di questi metodi di rifiuto probabilistici NON È RACCOMANDATO, poiché sono stati una causa ricorrente di vulnerabilità da canali laterali. Si veda Dragonblood [VR20] come esempio concreto di questo problema, e l'Appendice A per una descrizione informale dei metodi di campionamento per rifiuto e dei canali laterali temporali che essi introducono.

Il presente documento rappresenta il consenso del Crypto Forum Research Group (CFRG).

1.1. Notazione dei requisiti​

Le parole chiave "MUST" (DEVE), "MUST NOT" (NON DEVE), "REQUIRED" (RICHIESTO), "SHALL" (DOVRÀ), "SHALL NOT" (NON DOVRÀ), "SHOULD" (DOVREBBE), "SHOULD NOT" (NON DOVREBBE), "RECOMMENDED" (RACCOMANDATO), "NOT RECOMMENDED" (NON RACCOMANDATO), "MAY" (PUÒ) e "OPTIONAL" (OPZIONALE) contenute nel presente documento devono essere interpretate come descritto nel BCP 14 [RFC2119] [RFC8174] solo ed esclusivamente quando compaiono in lettere maiuscole, come qui mostrato.