Sunteți pe pagina 1din 13

Aplicații criptografice – Semnături digitale

Criptografia cu chei publice oferă o soluție pentru transmiterea unui mesaj, modificând forma mesajului
(în scopul ascunderii conținutului său), astfel încât doar părțile autorizate să îl poată citi, fără să fie
nevoie de un canal de comunicații off-line pentru a transmite cheia secretă. Cu toate acestea, nu oferă
dovada originii mesajului, deci autenticitatea sursei mesajului (dacă un mesaj provine într-adevăr de la
un anumit expeditor) și nici integritatea mesajului (dacă asupra mesajului s-a intervenit, fiind schimbat
pe ruta de comunicații).
Una dintre cele mai importante utilizări practice ale criptografiei moderne o reprezintă semnătura
digitală. Semnătura digitală este o primitivă criptografică care oferă mecanismele necesare autentificării,
integrității, dar și non-repudierii (atestarea faptului că documentul a fost produs de expeditor). Deși au
scopuri diferite, schemele de semnătură digitală și criptosistemele asimetrice utilizează instrumente
similare: chei publice și private și algoritmi care utilizează aceste chei; în cazul semnăturii digitale, cheia
privată este folosită de persoana care semnează mesajul, iar cheia publică este folosită de destinatar,
pentru verificarea semnăturii.
În lumea reală, „analogică”, dovada că o anumită persoană a generat un mesaj este obținută prin
semnături scrise de mână, pe hârtie. În lumea digitală, semnătura digitală este o metodă de ”semnare” a
unui document electronic, astfel încât acesta poate fi transmis pe un canal de comunicații (o rețea de
calculatoare). Aceasta acționează ca o semnătură scrisă de mână pe un document: ar trebui să fie dificil
de falsificat și ar trebui să fie dificil de eliminat dintr-un document și de atașat la un alt document.
Semnătura digitală trebuie să îndeplinească următoarele cerințe principale:
- să fie ușor de generat: o schemă de semnătură digitală nu trebuie să solicite semnatarului operațiuni
complexe, a.î. procesul de semnare digitală să fie cât mai eficient posibil;
- să fie ușor de autentificat: orice destinatar legal poate verifica eficient validitatea unei semnături
generate de un semnatar, folosind cheia de verificare publică;
- să utilizeze anumite informații cunoscute numai expeditorului pentru a preveni atât falsificarea, cât și
negarea;
- să fie unică/neimitabilă: analog semnăturii olografe, o semnătură digitală trebuie să fie unică pentru
fiecare semnatar, deci o anumită semnătură este generată de către o singură persoană; nici o altă persoană
nu va putea genera semnătura altui utilizator;
- orice modificare/deteriorare a documentului va invalida semnătura.
- să fie imposibil de negat: expeditorul mesajului nu poate nega semnătura digitală a mesajului la o dată
ulterioară, sub afirmația că nu este autentică;
- să permită destinatarilor să stocheze o copie a semnăturii pentru verificare ulterioară;

Deși o semnătură digitală joacă un rol similar cu o semnătură scrisă de mână, între ele există diferențe
semnificative:
► privind semnarea documentului:
- semnătura scrisă de mână (semnătura olografă) nu depinde de mesajul în sine, fiind întotdeauna
aceeași pentru mesaje diferite, ceea ce face posibilă falsificarea ei;
1
- semnătura digitală este legată de mesaj (pentru mesaje diferite este diferită), deoarece depinde atât de
conținutul mesajului, cât și de expeditorul mesajului; astfel, cea mai mică modificare în textul
expeditorului ar genera o semnătură diferită, a.î. destinatarul mesajului va detecta orice alterare a
integrității mesajului transmis, deoarece semnătura nu mai corespunde documentului și este incorectă
atunci când este verificată.
► privind verificarea semnăturii:
- semnătura scrisă de mână este verificată comparând-o cu alte semnături autentice, metoda nefiind
foarte sigură, deoarece nu este deloc imposibil de falsificat semnătura cuiva;
- semnătura digitală poate fi verificată de oricine, în baza unui algoritm de verificare cunoscut public,
ceea ce previne falsificarea.

În mecanismul realizării semnăturii digitale intervin următoarele elemente:


Cheia secretă/privată (Ks) = cheia folosită de persoana care semnează mesajul
Cheia publică (Kp) = cheia folosită de destinatar, pentru verificarea semnăturii.
Semnătura digitală (𝛔) = un șir de biți de lungime mare (de exemplu 2048 biți) care asociază un mesaj
(în format digital) cu entitatea care l-a generat.
Algoritm de generare a semnăturii digitale = metodă de producere a unei semnături digitale: un algoritm
probabilist primește la intrare documentul digital (m) și cheia secretă (Ks) și returnează semnătura (𝛔)
pentru documentul (m).
𝛔 ⟵ sig(m, Ks)
Algoritm de verificare a semnăturii digitale = metodă de verificare a faptului că o semnătură digitală
este autentică (adică a fost creată într-adevăr de către entitatea specificată): un algoritm determinist
primește la intrare documentul digital (m), semnătura (𝛔) și cheia publică (Kp) și returnează TRUE dacă
(𝛔) este o semnătură pentru documentul (m) asociată cheii secrete (Ks), altfel returnează FALSE.
ver(m, 𝛔, Kp) = TRUE, dacă 𝛔 = sig(m, Ks)
FALSE, dacă 𝛔 ≠ sig(m, Ks)
Schemă de semnătură digitală = algoritm de generare a semnăturii + un algoritm de verificare asociat
Proces/procedură de semnare digitală = algoritm (matematic) de generare a semnăturii digitale + o
metodă pentru formatarea datelor în mesaje care pot fi semnate
Proces/procedură de verificare a semnăturii digitale = algoritm de verificare + metodă de recuperare a
datelor din mesaj
Obs: Pentru fiecare cheie Kp, funcțiile sig(m, Ks) și ver(m, 𝛔, Kp) trebuie să fie calculabile în timp
polinomial.

2
Componentele mecanismului de obținere a semnăturii digitale

În practică, o schemă de semnătură digitală se utilizează asemănător unei scheme de criptare cu cheie
publică, astfel încât emitentul mesajului parcurge următorii pași:
- apelează un algoritm aleator de generare a perechii de chei publice și private (Kp, Ks)
- pentru a transmite un mesaj m, calculează 𝛔 ⟵ sig(m, Ks) și trimite mesajul semnat (m, 𝛔)
- la primirea mesajului semnat, destinatarul, care cunoaște cheia publică Kp, poate verifica autenticitatea
mesajului m, verificând dacă ver(m, 𝛔, Kp) = TRUE;

Semnătura digitală astfel produsă satisface cerințele de securitate:


► autenticitatea și integritatea: este imposibil pentru oricine care nu are acces la cheia secretă să
genereze un mesaj semnat – o pereche (m , 𝛔) care este validă pentru cheia publică. Altfel spus, pentru
un mesaj m, ar trebui să fie imposibil din punct de vedere computațional, pentru oricine altcineva decât
expeditorul, să obțină o semnătură 𝛔 astfel încât ver(m, 𝛔, Kp) = TRUE. Deci semnătura nu poate fi
falsificată, deoarece numai expeditorul cunoaște cheia secretă proprie.

Teoretic, dacă un atacator poate genera un mesaj semnat (m, 𝛔) a.î. ver(m, 𝛔, Kp) = TRUE și documentul
m nu a fost semnat de către expeditor, atunci semnătura 𝛔 este un fals.

► unicitatea: semnătura este ”legată” de document, a.î. dacă mesajul este schimbat, semnătura este
invalidată, nu mai poate fi verificată cu cheia publică a emitentului mesajului: ver(m, 𝛔, Kp) = FALSE;
astfel, semnătura nu este reutilizabilă, nu poate fi transferată în niciun alt document.

► non-repudierea: când un mesaj semnat (m, 𝛔) este valid, semnatarul nu poate pretinde că semnătura
a fost falsificată, deci dacă schema de semnătură este sigură, este imposibil ca un adversar să fi falsificat
acest mesaj, deci semnătura nu poate fi creată de altcineva decât deținătorul cheii secrete.

3
Semnătura digitală RSA
Schema de semnătură RSA se bazează pe parametrii criptosistemului RSA, cu inversarea rolului cheii
publice şi private pentru a transforma algoritmul de criptare în algoritm de semnătură digitală:

► Generarea cheilor:
Se generează două numere prime mari p și q, p ≠ q;
Se calculează n = p⋅q și φ(n) = (p − 1)(q − 1);
Se alege aleator un număr b (1 < b < φ(n)) a.î. c.m.m.d.c. (b, φ(n)) = 1;
Se calculează a = b−1 în Zφ(n) ⟺ a⋅b ≡ 1 (mod φ(n)) folosind algoritmul lui Euclid extins;
Pentru K = (n, p, q, a, b) se definesc:
cheia publică Kp = (n, b) și cheia secretă Ks = (n, a).

► Expeditorul A semnează mesajul m:


Algoritmul de generare a semnăturii digitale : 𝛔 ⟵ sig(m, Ks) = ma (mod n) ∈ Zn

► Destinatarul B verifică semnătura expeditorului:


se calculează m’ = 𝛔b (mod n) ∈ Zn
Algoritmul de verificare a semnăturii digitale : ver(m, 𝛔, Kp) = TRUE ⟺ m’ = m

Exemplu:
► Generarea cheilor:
Expeditorul A alege două numere prime, fie p = 53 și q = 61;
Calculează n = p⋅q = 3233 și φ(n) = (p − 1)(q − 1) = 3120;
Alege aleator un număr b (1 < b < 3120)) a.î. c.m.m.d.c. (b, 3120) = 1: fie b = 407
Se calculează a = b−1 în Z3120 ⟺ a⋅b ≡ 1 (mod 3120) ⟹ a= 23;
Pentru K = (n, p, q, a, b) se definesc cele două chei ale expeditorului A:
cheia publică Kp = (n = 3233, b = 407) și cheia secretă Ks = (n = 3233, a = 23)

► Expeditorul A semnează mesajul m:


Expeditorul alege mesajul care va fi semnat, fie m = 697, m < n
Expeditorul calculează semnătura digitală 𝛔 ⟵ sig(m, Ks) = ma (mod n) ∈ Zn
𝛔 = 69723 (mod 3233) = 2971
23 = (10111)2 ⟹ 69723 = ((((697)2)2⋅697)2⋅697)2⋅697 ⟹ c = 69723 (mod 3233):

4
i ki c
4 1 697
3 0 6972 (mod 3233) = 859
2 1 8592⋅697 (mod 3233) = 650
1 1 6502⋅697 (mod 3233) = 1462
0 1 14622⋅697 (mod 3233) = 2971

Expeditorul face publice mesajul m = 697 și semnătura 𝛔 = 2971

► Destinatarul B verifică semnătura expeditorului:


Destinatarul B, în baza cheii publice Kp = (n, b) calculează m’ = 𝛔b (mod n) ∈ Zn
m’ = 𝛔b (mod n) = 2971407 (mod 3233) = 697
407 = (110010111)2 ⟹ 2971407 = ((((((((2971)2⋅2971)2)2)2⋅2971)2)2⋅2971)2⋅2971)2⋅2971

i ki c
8 1 2971
7 1 (2971)2⋅2971 (mod 3233) = 451
6 0 (451)2 (mod 3233) =2955
5 0 (2955)2 (mod 3233) = 2925
4 1 (2925)2⋅2971 (mod 3233) = 936
3 0 (936)2 (mod 3233) = 3186
2 1 (3186)2⋅2971 (mod 3233) = 3182
1 1 (3182)2⋅2971 (mod 3233) = 701
0 1 (701)2⋅2971 (mod 3233) = 697

Algoritmul de verificare a semnăturii digitale : ver(m, 𝛔, Kp) = TRUE ⟺ m’ = m

Utilizarea funcțiilor hash în schemele de semnătură digitală

În practică, nu se realizează semnarea întregului document m, deoarece:


- algoritmul de criptare aplicat asupra întregului document (prin exponențiere modulară) este lent;
- semnătura digitală rezultată are aproximativ aceeași dimensiune ca documentul m; de fapt, prin
exponențiere modulară se poate ca semnătura să fie mai mare decât m, ceea ce înseamnă dublarea
cantității de informații care trebuie transmisă.
Soluția este utilizarea unei funcții hash h:{documente de dimensiune variabilă} → {0,1}k, difícil de
inversat, care va prelua un mesaj de lungime arbitrară și va produce un rezumat al mesajului, cu o
dimensiune specificată – un bloc de biți de dimensiune fixă (de ex. 224 biți). Rezumatul mesajului va fi
apoi semnat folosind o schemă de semnături.
Astfel, în loc de a semna întregul document m, expeditorul calculează și semnează h(m). La verificare,
destinatarul calculează și verifică semnătura pe h(m).

5
Atunci, în schema de semnătură RSA:
► se calculează h(m) și se aplică algoritmul de generare a semnăturii digitale pe h(m):
𝛔 ⟵ sig(h(m), Ks) = h(m)a (mod n) ∈ Zn
► mesajul semnat (m, 𝛔) este transmis destinatarului
► verificarea mesajului semnat poate fi efectuată (de către oricine), reconstruind mai întâi rezumatul
mesajului, h(m) folosind funcția hash publică h:
- se calculează h(m)
- se calculează h’ = 𝛔b (mod n)
- se verifică dacă h’ = h(m). Dacă da, se acceptă semnătura ca validă.
Deci o îmbunătățire a schemei de semnătură este ca semnătura să se aplice asupra rezumatului mesajului,
care, în plus, îndeplinește cerințele de securitate: rezistența la preimagine și la coliziune.

Semnături digitale cu recuperarea mesajului versus semnături digitale cu anexă

► Prin definiție, schemele de semnătură digitală care necesită mesajul ca input în algoritmul de
verificare sunt numite scheme de semnătură digitală cu anexă (cu apendice). În acest caz, informația ce
reprezintă semnătura digitală este anexată documentului semnat.
Schema RSA prezentată anterior este un exemplu de schemă de semnătură digitală cu anexă, deoarece
semnătura este o entitate separată de mesaj.
► Prin definiție, o schemă de semnătură digitală cu recuperarea mesajului este o schemă de semnătură
digitală pentru care nu este necesară cunoașterea apriori a mesajului pentru algoritmul de verificare. În
acest caz, documentul este transformat criptografic a.î. să reprezinte atât documentul care va fi semnat,
cât și semnătura digitală.
Pentru a elimina posibilitatea fraudării, se aplică o funcție de redundanţă asupra mesajului, semnătura
propriu-zisă aplicându-se asupra mesajului redundant. La verificare, verificatorul va recupera anumite
date din semnătura digitală. Dacă aceste date recuperate au formatul de redundanță corect, atunci
verificatorul va accepta aceste date ca fiind corecte.
Obs: orice schemă de semnătură digitală cu recuperarea mesajului poate fi transformată în semnătură
cu anexă prin utilizarea hash-ului mesajului și semnarea valorii de hash.

O schemă de semnătură digitală RSA cu recuperarea mesajului presupune parcurgerea


următorilor pași:

► Generarea cheilor:
Se generează două numere prime mari p și q, p ≠ q;
Se calculează n = p⋅q și φ(n) = (p − 1)(q − 1);
Se alege aleator un număr b (1 < b < φ(n)) a.î. c.m.m.d.c. (b, φ(n)) = 1;

6
Se calculează a = b−1 în Zφ(n) ⟺ a⋅b ≡ 1 (mod φ(n)) folosind algoritmul lui Euclid extins;
Pentru K = (n, p, q, a, b) se definesc:
cheia publică Kp = (n, b) și cheia secretă Ks = (n, a).

► Aplicarea redundanței:
Se aplică o funcție de redundanţă asupra mesajului, înainte de semnare. Redundanța adăugată datelor nu
are valoare de conținut și va fi folosită în principal ca mijloc pentru verificator să identifice dacă datele
recuperate sunt corecte.
~
m → m = R(m)

De exemplu: R(m) = m⋅2t, unde t  lg n  / 2

~
► Expeditorul A semnează mesajul m :
~ ~
Algoritmul de generare a semnăturii digitale : 𝛔 ⟵ sig( m , Ks) = m a (mod n) ∈ Zn
Datele transformate (date plus redundanță) sunt semnate folosind RSA. Cu alte cuvinte, datele formatate
sunt „criptate” folosind cheia privată a semnatarului. Rezultatul acestei „criptări” este semnătura
digitală, care va fi trimisă singură către verificator (nu este necesară și trimiterea mesajului de data
aceasta).

► Destinatarul B verifică semnătura expeditorului și recuperează mesajul m din semnătură:


Destinatarul verifică semnătura digitală „decriptând-o” cu cheia publică a semnatarului. Dacă totul este
bine, (datele au formatul de redundanță corect) rezultatul obținut reprezintă datele corect formatate.
~
m = ver(𝛔, Kp)
Ulterior, destinatarul elimină redundanța pentru a extrage datele din datele formatate: recuperează m din
~
m:
~
m = R-1( m )

Semnături digitale combinate cu criptarea informației

Integrarea celor două tehnici: criptografia cu chei publice și semnătura digitală, generează un
protocol care combină securitatea criptării cu autenticitatea semnăturii digitale, prin parcurgerea
următoarelor etape:
- expeditorul semnează un mesaj.
- expeditorul criptează mesajul și semnătura cu cheia publică a destinatarului și îl trimite destinatarului.
- destinatarul decriptează mesajul cu cheia sa privată și verifică semnătura expeditorului.

7
► Expeditorul A semnează mesajul m cu cheia sa privată:

𝛔 ⟵ sig(m, K sA )

► Expeditorul A criptează mesajul semnat (m, 𝛔) folosind cheia publică a destinatarului B:

z = eKB p (m, 𝛔) și transmite textul criptat z lui B

► Destinatarul B decriptează textul z utilizând cheia sa secretă pentru a obține mesajul semnat:

d KBs (z) = d KBs ( eKB p (m, 𝛔)) = (m, 𝛔)

► Destinatarul B verifică semnătura expeditorului A folosind cheia publică a lui A:

ver(m, 𝛔, K pA )

În cazul în care mesajul ar fi criptat înainte de a fi semnat, un adversar poate elimina semnătura din
mesajul criptat și poate să-și adauge propria sa semnătură:
► Expeditorul A criptează mesajul semnat m folosind cheia publică a destinatarului B:

z = eKB p (m)

► Expeditorul A semnează mesajul criptat z cu cheia sa privată:

𝛔 ⟵ sig(z, K sA ) și transmite lui B mesajul (z,𝛔)

► Destinatarul B decriptează z utilizând cheia sa secretă pentru a obține mesajul m:

d KBs (z) = d KBs ( eKB p (m)) = m

► Destinatarul B verifică 𝛔 ca semnătură a mesajului criptat z folosind cheia publică a lui A:

ver(z, 𝛔, K pA )

În baza acestui flux de lucru, un atacator poate intercepta mesajul (z,𝛔) pentru a înlocui semnătura 𝛔 cu
semnătura sa proprie, 𝛔’, urmând să transmită destinatarului B mesajul (z,𝛔’). De aceea, se semnează
înainte de criptare.

Obs: în practică se preferă să nu se utilizeze aceeași pereche cheie publică/ cheie privată pentru criptare
și respectiv pentru semnare. Utilizarea a două perechi de chei diferite are avantajul că limitează
compromiterea acestora; mai mult, cele două tipuri de perechi de chei pot avea dimensiuni diferite și pot
expira la date diferite.

Semnătura digitală El Gamal

Schema de semnături ElGamal se bazează pe parametrii criptosistemului ElGamal, securitatea


schemei bazându-se pe calculul logaritmului discret peste un câmp finit.

8
Semnătura El Gamal - Detalii de implementare:

Generarea cheilor:
Se generează p, un număr prim pentru care problema logaritmului discret este nefezabilă computațional
și a ∈ Z*p o rădăcină primitivă modulo p.
Se alege un număr 𝛼 (1 < 𝛼 < p).
Se calculează b = a𝛼 (mod p).
Pentru K = (p, 𝛼, a, b) se definesc:
cheia publică Kp = (p, a, b) și cheia secretă Ks = (𝛼).

► Expeditorul A semnează mesajul m ∈ Z*p parcurgând următorii pași:


- alege aleator un număr k ∈ Zp-1, a.î. c.m.m.d.c. (k,p-1)=1; k este un număr secret, ales pentru fiecare
mesaj în parte.
Algoritmul de generare a semnăturii digitale : 𝛔 ⟵ sig(m, Ks):
- calculează y1 = ak (mod p)
y2 = k-1(m- 𝛼y1) mod(p-1)

Semnătura expeditorului A va fi 𝛔 = (y1,y2)


Expeditorul face publice mesajul m și semnătura 𝛔 = (y1,y2).

► Destinatarul B verifică semnătura expeditorului:


Destinatarul B, în baza cheii publice Kp = (p, a, b) verifică în primul rând dacă 1≤ y1 <p-1 și în caz
contrar respinge semnătura.

Algoritmul de verificare a semnăturii digitale : ver(m, 𝛔, Kp) = TRUE ⟺ b y1  y1y2  a m (mod p )

Într-adevăr, dacă semnătura a fost generată de expeditorul A, atunci:


y1 1
b y1  y1y2  a   a k k ( m  y1 )
 a m (mod p )

Obs: Dacă un atacator poate rezolva problema logaritmului discret, atunci va putea rezolva ecuația
a𝛼 =b (mod p) pentru a afla cheia secretă 𝛼 a expeditorului și astfel îi poate falsifica semnătura.
O altă schemă de atac: cunoscând valorile publice b și am, atacatorul trebuie să determine numerele y1 și
y2 ce îndeplinesc condiția: b y1  y1y2  a m (mod p ) .

Logaritmând în baza a, expresia se rescrie: y1⋅logab + y2⋅logay1 = m (mod p-1). Dacă un atacator poate
rezolva problema logaritmului discret, atunci poate alege o valoare arbitrară pentru y1, calculează logab
și logay1 și rezolvă ecuația de mai sus pentru a determina pe y2.

9
Exemplu:

► Generarea cheilor :
Expeditorul A alege p=19; rădăcinile primitive modulo 19 fiind {2, 3, 10, 13, 14, 15}, alege de exemplu
a = 13.
Apoi alege cheia secretă 𝛼 (1 < 𝛼 < p): 𝛼 = 9 și calculează:
b = a𝛼 (mod p) = 139 (mod 19) = 18
cheia publică Kp = (p, a, b) = (19, 13, 18) și cheia secretă Ks = 𝛼 = 9.

► Expeditorul A semnează documentul m =15 ∈ Z*19 parcurgând următorii pași:


- alege aleator un număr k ∈ Zp-1, a.î. c.m.m.d.c. (k,p-1)=1: k = 7
Algoritmul de generare a semnăturii digitale : 𝛔 ⟵ sig(m, Ks):
- calculează y1 = ak (mod p) = 137 (mod 19) = 10
y2 = k-1(m- 𝛼y1) mod(p-1) = 7-1(15 - 9⋅10) (mod 18) = 13⋅ (-75) (mod 18) =
-975 (mod 18) = -3(mod 18) = 15

Semnătura expeditorului A va fi 𝛔 = (y1,y2) = (10,15)


Expeditorul face publice mesajul m = 15 și semnătura 𝛔 = (10,15)

► Destinatarul B verifică semnătura expeditorului:


Destinatarul B, în baza cheii publice Kp = (p, a, b) = (19, 13, 18) verifică în primul rând dacă
1≤ y1 <p-1 : 1≤ 10 <18

Algoritmul de verificare a semnăturii digitale : ver(m, 𝛔, Kp) = TRUE ⟺ b y1  y1y2  a m (mod p )

b y1  y1y2  1810⋅1015 (mod 19) = 1⋅ 8 = 8 (mod 19)

a m = 1315 (mod 19) = 8 (mod 19)


Deci destinatarul acceptă semnătura ca fiind validă.

Calculele efectuate:
15 = (1111)2 ⟹ 1315 = (((13)2⋅13)2⋅13)2⋅13 10 = (1010)2 ⟹ 1810 = (((18)2)2⋅18)2

i ki 1315 (mod 19) i ki 1810 (mod 19)


3 1 13 (mod 19) = 13 3 1 18 (mod 19) = 18
2 1 132⋅13 (mod 19) = 12 2 1 182 (mod 19) = 1
1 1 122⋅13 (mod 19) = 10 1 1 12⋅18 (mod 19) = 18
0 1 102⋅13 (mod 19) = 8 0 1 182 (mod 19) = 1

15 = (1111)2 ⟹ 1015 = (((10)2⋅10)2⋅10)2⋅10

10
i ki 1015 (mod 19)
3 1 10 (mod 19) = 10
2 1 102⋅10 (mod 19) = 12
1 1 122⋅10 (mod 19) = 15
0 1 152⋅10 (mod 19) = 8

Semnătura digitală propusă de Schnorr

Semnătura digitală El Gamal 𝛔 = (y1,y2) conține un număr calculat modulo p și celălalt modulo
(p-1), având o dimensiune de aproximativ 2⋅log2p biți. Pentru a rezista atacurilor problemei logaritmului
discret, p în general este ales cu valori între 1000 și 2000 de biți, deci semnătura are o dimensiune între
2000 și 4000 de biți.
Semnătura definită de Schnorr în 1989 s-a bazat pe necesitatea, ca, pe baza schemei de semnătură
El Gamal, să se obțină o semnătură de mai mici dimensiuni, dar mai eficientă – cu un timp de calcul mai
mic pentru semnare și verificare. În acest caz, exponenții utilizați în exponențierea modulară sunt mai
mici decât un număr q, unde q este un divizor prim al lui (p-1): p-1 ≡ 0 (mod q). De exemplu, pentru un
număr prim p de ordinul 1024 biți, p ≃ 21024, q va avea 160 de biți: q ≃ 2160. Semnătura obținută va avea
o dimensiune de 2⋅log2q = 320 biți în acest caz.

Semnătura Schnorr - Detalii de implementare:

Generarea cheilor:
Se generează p, un număr prim pentru care problema logaritmului discret este nefezabilă computațional
și un număr q – un factor prim al numărului (p-1).
Se alege un număr întreg a a.î. aq = 1 (mod p).
Valorile p, q și a formează o cheie publică, care poate fi comună pentru un grup de utilizatori.
Se alege un număr 𝛼 (0 < 𝛼 < p). Acesta va fi cheia privată a semnatarului.
Se calculează b = a-𝛼 (mod p). Acesta va fi cheia publică a semnatarului.
cheia publică Kp = (b) și cheia secretă Ks = (𝛼).

► Expeditorul A semnează mesajul m ∈ Z*p parcurgând următorii pași:


- alege aleator un număr k (0 < k < q); k este un număr secret, ales pentru fiecare mesaj în parte.
Algoritmul de generare a semnăturii digitale : 𝛔 ⟵ sig(m, Ks):
- calculează x = ak (mod p)
- concatenează mesajul m și valoarea x: m || x
- calculează valoarea hash e = H(m || x).
- calculează y = k + 𝛼⋅e
Semnătura expeditorului A va fi 𝛔 = (e,y)
11
Expeditorul face publice mesajul m și semnătura 𝛔 = (e,y).

► Destinatarul B verifică semnătura expeditorului:


Destinatarul B, în baza cheii publice Kp = (p, a, b) și a mesajului semnat primit (m, 𝛔 = (e,y)), calculează
x’ = ay⋅be.
Algoritmul de verificare a semnăturii digitale : ver(m, 𝛔, Kp) = TRUE ⟺ e = H(m || x’).
Într-adevăr, dacă semnătura a fost generată de expeditorul A, atunci:
x’ = ay⋅be = ay⋅a-𝛼⋅e = ay-𝛼⋅e = ak ≡ x (mod p).

Standardul de semnătură digitală DSS

DSA („Digital Signature Algorithm”) sau DSS („Digital Signature Standard”) a fost adoptat de
guvernul S.U.A. în 1993 ca standard al F.I.P.S. 186. În 2000 a fost publicată o versiune extinsă a
standardului ca FIPS 186-2, actualizată ulterior la FIPS 186-3 în 2009 și FIPS 186-4 în 2013.
La fel ca în algoritmul Schnorr, schema DSA se bazează pe un grup de parametrii comuni pentru
un grup de utilizatori:
- se generează p, un număr prim mare, pentru care problema logaritmului discret este nefezabilă
computațional: 2l-1 < p < 2l.
- se alege q – un factor prim al numărului (p-1): 2n-1 < q < 2n
Obs: Conform standardului F.I.P.S. 186-3, valorile alese pentru (l,n) se încadrează în {(1024, 160),
(2048, 224), (2048, 256), (3072, 256)}
- se alege aleator un număr întreg h, 1 < h < p-1 și se calculează g = h(p-1)/q .
Dacă g = 1, se va alege pentru altă valoare a.î. să se obțină g ≠ 1. Această alegere garantează faptul că
g este un element de ordin q în grupul Fp*, adică gq = 1 (mod p).
Valorile p, q și g formează o cheie publică, care poate fi comună pentru un grup de utilizatori.
- se alege un număr 𝛼 (0 < 𝛼 < p). Acesta va fi cheia secretă a semnatarului.
- se calculează b = g𝛼 (mod p). Acesta va fi cheia publică a semnatarului.
cheia publică Kp = (b) și cheia secretă Ks = (𝛼).

► Expeditorul A semnează mesajul m ∈ Z*p parcurgând următorii pași:


- alege aleator un număr k (0 < k < q); k este un număr secret, ales pentru fiecare mesaj în parte.
Algoritmul de generare a semnăturii digitale : 𝛔 ⟵ sig(m, Ks):
- calculează e = [gk (mod p)] (mod q)
- calculează y = [k-1(h(m) + 𝛼⋅e)] (mod q)

Obs: dacă e = 0 sau y = 0, se va genera o nouă valoare pentru k și se recalculează semnătura.

12
Semnătura expeditorului A va fi 𝛔 = (e,y)
Expeditorul face publice mesajul m și semnătura 𝛔 = (e,y).

► Destinatarul B verifică semnătura expeditorului:


- verifică în primul rând dacă 0< e <q și 0< y <q; caz contrar respinge semnătura.
- în baza cheii publice Kp = (b) și a mesajului semnat primit (m, 𝛔 = (e,y)),calculează:
v1 = [y-1⋅h(m)] (mod q)
v2 = [y-1⋅e] (mod q)

u  [ g v1  b v2 (mod p )](mod q )

Algoritmul de verificare a semnăturii digitale : ver(m, 𝛔, Kp) = TRUE ⟺ e = u.

Într-adevăr, dacă semnătura a fost generată de expeditorul A, atunci:


deoarece y = [k-1(h(m) + 𝛼⋅e)] (mod q) ⟹ k = [y-1(h(m) + 𝛼⋅e)] (mod q)
1 [ y 1e ](mod q )
h( m )](mod q )
u  [ g v1  b v2 (mod p )](mod q ) = [ g [ y b (mod p )](mod q )
1 [  y 1e ](mod q ) 1
h( m )](mod q ) ( h( m ) e )](mod q )
= [ g[ y g (mod p )](mod q ) = [ g [ y (mod p )](mod q ) =
[ g k (mod p )](mod q ) = e

Obs:
1) Schema utilizează o funcție hash din familia Sha-1, Sha-2, SHA-3 pe 160 – 512 biți. Valoarea hash
h(m) poate să aibă o dimensiune mai mare de n biți, caz în care se vor lua în calcul doar primii n cei mai
semnificativi biți din h(m).
2) Comparativ cu schema El Gamal, în DSA parametrul k este mai greu de determinat din valoarea
componentei e a semnăturii 𝛔, datorită faptului că este în plus redus modulo q.

13

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