3. EdDSA Algorithm (Algoritmo EdDSA)
3. EdDSA Algorithm (Algoritmo EdDSA)
EdDSA è un sistema di firma digitale con 11 parametri.
Il sistema di firma digitale EdDSA generico con i suoi 11 parametri di input non è destinato a essere implementato direttamente. La scelta dei parametri è fondamentale per un funzionamento sicuro ed efficiente. Invece, si implementerebbe una particolare scelta di parametri per EdDSA (come Ed25519 o Ed448), a volte leggermente generalizzata per ottenere il riutilizzo del codice per coprire Ed25519 ed Ed448.
Pertanto, una spiegazione precisa dell'EdDSA generico non è particolarmente utile per gli implementatori. Per contesto e completezza, viene fornita qui una descrizione succinta dell'algoritmo EdDSA generico.
La definizione di alcuni parametri, come n e c, può aiutare a spiegare alcuni passaggi dell'algoritmo che non sono intuitivi.
Questa descrizione segue da vicino [EDDSA2].
EdDSA ha 11 parametri:
-
Una potenza prima dispari p. EdDSA utilizza una curva ellittica sul campo finito GF(p).
-
Un intero b con 2^(b-1) > p. Le chiavi pubbliche EdDSA hanno esattamente b bit, e le firme EdDSA hanno esattamente 2*b bit. Si raccomanda che b sia un multiplo di 8, in modo che le lunghezze delle chiavi pubbliche e delle firme siano un numero intero di ottetti.
-
Una codifica a (b-1) bit degli elementi del campo finito GF(p).
-
Una funzione hash crittografica H che produce un output di 2*b bit. Le funzioni hash conservative (cioè, funzioni hash dove è impossibile creare collisioni) sono raccomandate e non hanno molto impatto sul costo totale di EdDSA.
-
Un intero c che è 2 o 3. Gli scalari segreti EdDSA sono multipli di 2^c. L'intero c è il logaritmo in base 2 del cosiddetto cofattore.
-
Un intero n con c <= n < b. Gli scalari segreti EdDSA hanno esattamente n + 1 bit, con il bit superiore (la posizione 2^n) sempre impostato e i c bit inferiori sempre azzerati.
-
Un elemento non quadrato d di GF(p). La raccomandazione abituale è di prenderlo come il valore più vicino a zero che dà una curva accettabile.
-
Un elemento quadrato non nullo a di GF(p). La raccomandazione abituale per le migliori prestazioni è a = -1 se p mod 4 = 1, e a = 1 se p mod 4 = 3.
-
Un elemento B != (0,1) dell'insieme E = { (x,y) è un membro di GF(p) x GF(p) tale che a * x^2 + y^2 = 1 + d * x^2 * y^2 }.
-
Un numero primo dispari L tale che [L]B = 0 e 2^c * L = #E. Il numero #E (il numero di punti sulla curva) fa parte dei dati standard forniti per una curva ellittica E, o può essere calcolato come cofattore * ordine.
-
Una funzione "prehash" PH. PureEdDSA significa EdDSA dove PH è la funzione identità, cioè PH(M) = M. HashEdDSA significa EdDSA dove PH genera un output breve, indipendentemente dalla lunghezza del messaggio; ad esempio, PH(M) = SHA-512(M).
I punti sulla curva formano un gruppo sotto addizione, (x3, y3) = (x1, y1) + (x2, y2), con le formule
x1 * y2 + x2 * y1 y1 * y2 - a * x1 * x2
x3 = --------------------------, y3 = ---------------------------
1 + d * x1 * x2 * y1 * y2 1 - d * x1 * x2 * y1 * y2
L'elemento neutro nel gruppo è (0,1).
A differenza di molte altre curve utilizzate per applicazioni crittografiche, queste formule sono "complete"; sono valide per tutti i punti sulla curva, senza eccezioni. In particolare, i denominatori sono non nulli per tutti i punti di input.
Esistono formule più efficienti, che sono ancora complete, che utilizzano coordinate omogenee per evitare le costose inversioni modulo p. Vedere [Faster-ECC] e [Edwards-revisited].