Documente Academic
Documente Profesional
Documente Cultură
Raport
Lucrarea de laborator nr. 3
Chișinău – 2019
Tema: Algoritmi de semnătură digitală. DSA
Sarcina: De implementat algoritmul semnăturii digitale DSA.
Algoritmul pentru semnături digitale (engleză: "Digital Signature Algorithm"), cunoscut și sub
acronimul DSA, este un standard al guvernului Statelor Unite ale Americii pentru semnăturile digitale.
A fost propus de National Institute of Standards and Technology (NIST) în august 1991 pentru
utilizare în cadrul standardului Digital Signature Standard (DSS), specificat în FIPS 186 și adoptat în
1993. O revizie minoră a fost emisă în 1996 sub numele de FIPS 186-1. Standardul a fost extins în
2000 ca FIPS 186-2 și în 2009 ca FIPS 186-3.
Algoritmul este format din trei proceduri: generarea cheii, semnarea, verificarea semnăturii.
Generarea cheii
● Se alege q, astfel încât el este prim și are o dimensiune de 160 de biți (2159 < q < 2160).
● Se alege p, astfel încât el este prim și p = 2qz + 1 (2512 < p < 21024).
● Ultimele reglementări specifică faptul că p ar trebui să fie pe fix 1024 de biți, ceea ce
înseamnă că z trebuie să fie pe 864 de biți.
● Se alege ℎ ∈ 𝑍𝑝∗ , unde h este o rădăcină primitivă în 𝑍𝑝∗ .
𝑝−1
● 𝛼 = ℎ 𝑧′ 𝑚𝑜𝑑 𝑝, unde 𝑧 ′ = .
𝑞
● Se alege arbitrar 𝛼 ∈ 𝑍𝑝∗ .
𝛼
● Se calculează 𝛽 = 𝛼 𝑚𝑜𝑑 𝑝.
● Cheia publică este (𝑝, 𝑞, 𝛼, 𝛽).
● Cheia privată este α.
Semnarea
Verificarea
● Se calculează 𝜔 = 𝛿 −1 𝑚𝑜𝑑 𝑞.
● Se calculează 𝑒1 = (𝑥𝜔) 𝑚𝑜𝑑 𝑞.
● Se calculează 𝑒2 = (𝛾𝜔) 𝑚𝑜𝑑 𝑞.
● Se calculează 𝑣 = ((𝛼 𝑒1 𝛽 𝑒2 ) 𝑚𝑜𝑑 𝑝) 𝑚𝑜𝑑 𝑞.
● Semnătura este validă dacă și numai dacă 𝑣 = 𝛾.
Concluzie
Acest algoritm este considerat imposibil de spart, datorită siguranței mari asigurate de câteva
puncte, cum ar fi generarea aleatoare a lui p, q, a și k. Pentru a se afla k, de exemplu, ar trebui rezolvată
o problemă de tipul logaritmilor discreți, care este o problemă "dificilă", în sensul că ajungerea la o
soluție poate dura câteva luni.
Anexa A
Codul sursă
package DSAalgorithm;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Signature;
import java.util.Scanner;