Sunteți pe pagina 1din 4

Ministerul Educației al Republicii Moldova

Universitatea Tehnică a Moldovei

Facultatea Calculatoare, Informatică și Microelectronică

Departamentul Ingineria Software și Automatică

Raport
Lucrarea de laborator nr. 3

Disciplina: Securitatea informațională

A efectuat: st. gr. TI-151 f/r


Jimbei Vitalii

A verificat: lect. sup.


Poștaru Andrei

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

● Se alege arbitrar 𝑘 ∈ 𝑍𝑞∗ .


● Se calculează x=SHA-1(mesaj), cu x pe 160 de biți; SHA-1 este funcția de hash, care
realizează rezumatul mesajului (returnează un număr în funcție de conținutul
mesajului).
● Se calculează 𝛾 = (𝛼 𝑘 𝑚𝑜𝑑 𝑝)𝑚𝑜𝑑 𝑞.
● Se calculează 𝛿 = (𝑘 −1 (𝑥 + 𝛼𝛾))𝑚𝑜𝑑 𝑞.
● Dacă vreuna dintre cele două valori (𝛾 sau𝛽) este egală cu zero, atunci se reia calculul
cu generarea unui alt k.
● Cheia de semnare este (𝛾, 𝛿).

Verificarea

● Se calculează 𝜔 = 𝛿 −1 𝑚𝑜𝑑 𝑞.
● Se calculează 𝑒1 = (𝑥𝜔) 𝑚𝑜𝑑 𝑞.
● Se calculează 𝑒2 = (𝛾𝜔) 𝑚𝑜𝑑 𝑞.
● Se calculează 𝑣 = ((𝛼 𝑒1 𝛽 𝑒2 ) 𝑚𝑜𝑑 𝑝) 𝑚𝑜𝑑 𝑞.
● Semnătura este validă dacă și numai dacă 𝑣 = 𝛾.

A fost implemenentat un algortim care primește un mesaj, căruia îi atribuie o semnătură


digitală:

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;

public class DSA {


public static void main(String[] args) throws Exception {
//Accepting text from user
Scanner sc = new Scanner(System.in);
System.out.println("Enter some text");
String msg = sc.nextLine();

//Creating KeyPair generator object


KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");

//Initializing the key pair generator


keyPairGen.initialize(2048);

//Generate the pair of keys


KeyPair pair = keyPairGen.generateKeyPair();

//Getting the private key from the key pair


PrivateKey privKey = pair.getPrivate();

//Creating a Signature object


Signature sign = Signature.getInstance("SHA256withDSA");

//Initialize the signature


sign.initSign(privKey);
byte[] bytes = "msg".getBytes();

//Adding data to the signature


sign.update(bytes);

//Calculating the signature


byte[] signature = sign.sign();

//Printing the signature


System.out.println("Digital signature for given text: "+new String(signature, "UTF8"));
}
}

S-ar putea să vă placă și