DSA

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 12 septembrie 2016; verificările necesită 76 de modificări .
DSA, algoritm de semnătură digitală
Creator NIST
Creată 1991
publicat 1998
Dimensiunea cheii închis: 160-256 biți, deschis: 1024-3072 biți
Dimensiunea semnăturii două numere de 160-256 de biți

DSA ( Digital Signature Algorithm - algoritm de semnătură digitală ) - un algoritm criptografic care  utilizează o cheie privată (de la o pereche de chei: <public; private>) pentru a crea o semnătură electronică , dar nu pentru criptare (spre deosebire de RSA și schema ElGamal ). Semnătura este creată în secret (cheie privată), dar poate fi verificată public (cheie publică). Aceasta înseamnă că un singur subiect poate crea o semnătură de mesaj, dar oricine poate verifica dacă este corectă. Algoritmul se bazează pe complexitatea de calcul a luării de logaritmi în câmpuri finite .

Algoritmul a fost propus de Institutul Național de Standarde și Tehnologie ( SUA ) în august 1991 și este brevetat [1] (autorul brevetului - David W. Kravitz), NIST a făcut acest brevet disponibil pentru utilizare fără drepturi de autor . DSA face parte din DSS ( Digital  Signature Standard), publicat pentru prima dată la 15 decembrie 1998 (document FIPS-186 [2] ( Federal Information Processing Standards ) . Standardul a fost actualizat de mai multe ori [3] [4] , cea mai recentă versiune este FIPS-186-4 [5] . (Iulie 2013).  

Descrierea algoritmului

DSA include doi algoritmi (S, V): pentru a crea o semnătură de mesaj (S) și pentru a o verifica (V).

Ambii algoritmi calculează mai întâi hash -ul mesajului folosind o funcție hash criptografică . Algoritmul S folosește hash și cheia secretă pentru a crea semnătura, algoritmul V folosește hash-ul mesajului, semnătura și cheia publică pentru a verifica semnătura.

Merită să subliniem că nu mesajul (de lungime arbitrară) este semnat efectiv, ci hash-ul său (160 - 256 biți), prin urmare coliziunile sunt inevitabile și o singură semnătură, în general, este valabilă pentru mai multe mesaje cu același hash. . Prin urmare, alegerea unei funcții hash suficient de „bună” este foarte importantă pentru întregul sistem în ansamblu. Prima versiune a standardului a folosit funcția hash SHA-1 [6] [2] (  Secure Hash Algorithm - secure hashing algorithm) , în cea mai recentă versiune puteți folosi și orice algoritm din familia SHA-2 [6] [5 ] . În august 2015, a fost publicat FIPS-202 [7] , care descrie noua funcție hash SHA-3 . Dar astăzi nu este inclus în standardul DSS [5] .

Sistemul necesită o bază de corespondență între detaliile reale ale autorului (pot fi fie o persoană fizică, fie o organizație) și cheile publice , precum și toți parametrii necesari ai schemei de semnătură digitală (funcția hash, numere prime ). De exemplu, o autoritate de certificare poate servi drept bază .

Opțiuni pentru schema de semnătură digitală

Pentru a construi un sistem de semnătură digitală, trebuie să efectuați următorii pași:

  1. Alegerea funcției hash criptografice H(x).
  2. Alegerea unui număr prim q a cărui dimensiune N în biți este aceeași cu dimensiunea în biți a valorilor hash H(x).
  3. Alegerea unui număr prim p astfel încât (p-1) să fie divizibil cu q . Lungimea bitului p este notată cu L .
  4. Alegerea unui număr g ( ) astfel încât ordinea lui multiplicativă modulo p să fie egală cu q . Pentru a-l calcula, puteți folosi formula , unde h  este un număr arbitrar astfel încât . În cele mai multe cazuri, valoarea h = 2 satisface această cerință. [5]

După cum sa menționat mai sus, parametrul principal al schemei de semnătură digitală este funcția hash criptografică utilizată pentru a converti textul mesajului într-un număr pentru care este calculată semnătura. O caracteristică importantă a acestei funcții este lungimea de biți a secvenței de ieșire, notată cu N mai jos . În prima versiune a standardului DSS , se recomandă funcția SHA-1 [2] și, în consecință, lungimea de biți a numărului cu semn este de 160 de biți. Acum SHA-1 nu mai este suficient de sigur [8] [9] . Standardul specifică următoarele perechi posibile de valori pentru numerele L și N :

  1. L=1024, N=160
  2. L=2048, N=224
  3. L=2048, N=256
  4. L=3072, N=256

Funcțiile hash ale familiei SHA-2 sunt recomandate conform acestui standard . Organizațiile guvernamentale din SUA trebuie să utilizeze una dintre primele trei opțiuni, CA trebuie să utilizeze o pereche egală sau mai mare decât perechea utilizată de abonați [5] . Proiectantul de sistem poate alege orice funcție hash validă. Prin urmare, o atenție suplimentară nu se va concentra asupra utilizării unei anumite funcții hash.

Puterea unui criptosistem bazat pe DSA nu depășește puterea funcției hash utilizată și puterea perechii (L,N), a cărei putere nu este mai mare decât puterea fiecăruia dintre numere separat. De asemenea, este important să se ia în considerare cât timp trebuie să rămână sigur sistemul. În prezent, pentru sistemele care trebuie să fie persistente până în 2010 ( 2030 ), se recomandă o lungime de 2048 (3072) biți. [5] [10]

Chei publice și private

  1. Cheia secretă este un număr
  2. Cheia publică se calculează folosind formula

Parametrii publici sunt numerele (p, q, g, y) . Există un singur parametru privat - numărul x . În acest caz, numerele (p, q, g) pot fi comune pentru un grup de utilizatori, iar numerele x și y sunt cheile private și, respectiv, publice ale unui anumit utilizator. La semnarea unui mesaj se folosesc numerele secrete x și k , iar numărul k trebuie ales aleatoriu (în practică, pseudoaleatoriu) la calcularea semnăturii fiecărui mesaj următor.

Deoarece (p, q, g) poate fi utilizat pentru mai mulți utilizatori, în practică utilizatorii sunt adesea împărțiți în funcție de anumite criterii în grupuri cu același (p, q, g) . Prin urmare, acești parametri sunt numiți Parametri de domeniu. [5]

Semnătura mesajului

Semnătura mesajului se realizează conform următorului algoritm [5] :

  1. Alegerea unui număr aleatoriu
  2. calcul
  3. Alegând un alt k dacă
  4. calcul
  5. Alegând un alt k dacă
  6. Semnătura este o pereche de lungime totală

Operațiile complexe din punct de vedere computațional sunt modul de exponențiere (calcul ), pentru care există algoritmi rapizi , calculul hash , unde complexitatea depinde de algoritmul de hashing ales și de dimensiunea mesajului de intrare și găsirea elementului invers folosind, de exemplu, euclidianul extins. algoritm sau mica teoremă a lui Fermat în formă .

Verificarea semnăturii

Verificarea semnăturii se realizează conform algoritmului [5] :

1 Calcul 2 Calcul 3 Calcul 4 Calculul 5 Semnătura este corectă dacă

Când sunt verificate, operațiile complexe din punct de vedere computațional sunt două exponențiații , un calcul hash și găsirea elementului invers .

Corectitudinea schemei

Această schemă de semnătură digitală este corectă în măsura în care o persoană care dorește să verifice autenticitatea semnăturii va primi întotdeauna un rezultat pozitiv în caz de autenticitate. Să-l arătăm:

În primul rând, dacă , atunci după Mica Teoremă a lui Fermat rezultă că . Deoarece g >1 și q este prim, atunci g trebuie să aibă ordinea multiplicativă q modulo p .

Pentru a semna un mesaj, calculează

Prin urmare

Deoarece g este de ordinul q , obținem

În cele din urmă, corectitudinea schemei DSA rezultă din

[5]

Exemplu de lucru

Să dăm un exemplu despre cum funcționează algoritmul pentru numere mici. Lăsați valoarea hash a mesajului nostru .

Generarea parametrilor

  1. lungime hash , astfel încât să puteți alege
  2. alege pentru că
  3. alege

Crearea cheilor

  1. alege ca cheie secretă
  2. apoi cheia publică

Semnătura mesajului

  1. alege
  2. apoi
  3. , mergi mai departe
  4. , unde se are în vedere că
  5. , mergi mai departe
  6. semnătura este o pereche de numere

Verificarea semnăturii

  1. primit, ceea ce înseamnă că semnătura este corectă.

Analogii

Algoritmul DSA se bazează pe dificultatea calculării logaritmilor discreti și este o modificare a schemei clasice ElGamal [11] , unde se adaugă hashingul mesajelor, iar toți logaritmii sunt calculati prin , ceea ce face posibilă scurtarea semnăturii în comparație cu analogii. [12] . Pe baza schemei ElGamal, au fost construiți și alți algoritmi, de exemplu, GOST rusesc 34.10-94 , care este acum considerat învechit. A fost înlocuit cu standardul GOST R 34.10-2012 [13] , care utilizează un grup de puncte dintr- o curbă eliptică .

O astfel de modificare, adică trecerea de la grupul multiplicativ modulo un număr prim la grupul de puncte de curbă eliptică există și pentru DSA - ECDSA [14] (  Elliptic Curve Digital Signature Algorithm - digital signature algorithm on elliptic curves) . Este folosit, de exemplu, în criptomoneda bitcoin pentru a confirma tranzacțiile. Această traducere vă permite să reduceți dimensiunea cheilor fără a sacrifica securitatea - în sistemul bitcoin, dimensiunea cheii private este de 256 de biți, iar cheia publică corespunzătoare este de 512 biți.

Un alt algoritm comun cu cheie publică (folosit atât pentru criptare, cât și pentru semnătura digitală), RSA (numit după autorii: RivestShamir , Adleman ), se bazează pe dificultatea factorizării numerelor mari.

Puterea criptografică

Orice atac asupra algoritmului poate fi descris astfel: un atacator primește toți parametrii de semnătură publică și un anumit set de perechi (mesaj, semnătură) și încearcă, folosind acest set, să creeze o semnătură validă pentru un mesaj nou care nu este reprezentat în set. .

Aceste atacuri pot fi împărțite condiționat în două grupuri - în primul rând, un atacator poate încerca să recupereze cheia secretă și apoi are imediat posibilitatea de a semna orice mesaj și, în al doilea rând, poate încerca să creeze o semnătură validă pentru un mesaj nou fără recuperând direct cheia secretă.

Predictibilitatea unui parametru aleatoriu

Distribuția uniformă a parametrului aleatoriu este foarte importantă pentru securitatea sistemului. Dacă sunt cunoscuți mai mulți biți de parametri consecutivi pentru o serie de semnături, atunci cheia secretă poate fi recuperată cu mare probabilitate. [cincisprezece]

Repetarea parametrului pentru două mesaje duce la o simplă hacking a sistemului. Acest lucru se poate întâmpla atunci când utilizați un generator de numere pseudo-aleatoare prost . Această vulnerabilitate a sistemului PlayStation 3 a permis semnarea oricăror programe în numele Sony . În unele implementări ale sistemului bitcoin pentru Android, un atacator ar putea obține acces la portofel. [16] [17] Ambele exemple au folosit sistemul ECDSA [14] .

Dacă același parametru a fost folosit pentru două mesaje , atunci semnăturile lor vor avea aceleași , dar diferite , să le numim .

Din expresia pentru putem exprima totalul :

.

Și echivalează comun pentru diferite mesaje:

De aici este ușor să exprimați cheia secretă :

Fals existențial

Unii algoritmi de semnătură digitală pot fi atacați de un fals existent (fals existent) . Constă în faptul că pentru o semnătură (fie aleatorie, fie creată după o anumită regulă) este posibil să se creeze un mesaj corect (care, totuși, de obicei nu are sens) folosind doar parametri publici.

Pentru schema DSA , semnătura , în orice caz , este valabilă pentru un mesaj cu hash .

Acesta este unul dintre motivele pentru hashing mesajul de intrare. Dacă funcția hash este aleasă corect, algoritmul DSA este protejat de acest atac, deoarece inversarea funcției hash criptografice (adică, pentru o constatare dată astfel încât ) este dificilă din punct de vedere computațional. [optsprezece]

Recuperarea cheii

condiția de corectitudine a semnăturii poate fi rescrisă într-o formă diferită:

această ecuație este echivalentă (deoarece ordinea multiplicativă a lui g   modulo p  este egală  cu q)

deci putem presupune că, pentru a recupera cheia, atacatorul trebuie să rezolve un sistem de ecuații de forma

dar în acest sistem este necunoscut și atât , ceea ce înseamnă că numărul de necunoscute este cu unul mai mult decât ecuațiile, iar pentru oricare sunt cele care satisfac sistemul. Deoarece q este un număr prim mare, va fi necesar un număr exponențial de perechi (mesaj, semnătură) pentru recuperare. [unu]

Falsificarea semnăturii

Puteți încerca să falsificați o semnătură fără să cunoașteți cheia secretă, adică să încercați să rezolvați ecuația

cu privire la și . Pentru fiecare fix , ecuația este echivalentă cu calcularea logaritmului discret. [unu]

Sistemul de verificare a implementării algoritmului

Termenii licenței vă permit să implementați algoritmul în software și hardware. NIST a creat DSAVS [19] ( Eng.  The Digital Signature Algorithm Validation System - un sistem de verificare a algoritmului de semnătură digitală ). DSAVS constă din mai multe module de testare a conformității care testează fiecare componentă a sistemului independent de celelalte. Componente de implementare testate:

  1. Generarea parametrilor de domeniu
  2. Verificarea setărilor domeniului
  3. Generarea unei perechi de chei public-private
  4. Creați o semnătură
  5. Verificarea semnăturii

Pentru a testa implementarea, dezvoltatorul trebuie să depună o cerere de testare a implementării acesteia la laboratorul CMT ( Cryptographic Module Testing Laboratory ) .  [5]

Generarea numerelor prime

Algoritmul DSA necesită două numere prime ( și ), deci este necesar un generator prime sau pseudo -prime .

Algoritmul Shaw-Taylor [20] este folosit pentru a genera numere prime .

Pseudoprimele sunt generate folosind o funcție hash și testul probabilistic Miller-Rabin este utilizat pentru a testa primalitatea . I se poate adăuga un singur test de primalitate Luke . [5]

Numărul necesar de iterații depinde de lungimea numerelor utilizate și de algoritmul de verificare [5] :

Opțiuni doar test M-R Test M-R + test Luke
p: 1024 biți

q: 160 de biți

probabilitatea de eroare

40 p: 3

q:19

p: 2048 biți

q: 224 de biți

probabilitatea de eroare

56 p: 3

q:24

p: 2048 biți

q: 256 de biți

probabilitatea de eroare

56 p: 3

q:27

p: 3072 biți

q: 256 de biți

probabilitatea de eroare

64 p: 2

q:27

Generarea numerelor aleatorii

Algoritmul necesită, de asemenea, un generator de numere aleatoare sau pseudo-aleatoare . Acest generator este necesar pentru a genera o cheie de utilizator privată x , precum și pentru a genera un parametru secret aleatoriu .

Standardul oferă diverse modalități de a genera numere pseudoaleatoare folosind cifruri bloc sau funcții hash. [5] [21]

Note

  1. ^ 123 Brevet US 5231668 A.
  2. 123 FIPS 186-1 . _
  3. FIPS 186-2 .
  4. FIPS 186-3 .
  5. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 FIPS 186-4 .
  6. 12 FIPS 180-4 .
  7. FIPS 202 .
  8. Găsirea coliziunilor în SHA-1 complet .
  9. Coliziune Freestart pentru SHA-1 complet .
  10. Publicația specială NIST 800-57 .
  11. Elgamal, 1985 .
  12. C. P. Schnorr. Identificare și semnături eficiente pentru carduri inteligente  //  Progrese în criptologie - CRYPTO' 89 Proceedings / Gilles Brassard. — New York, NY: Springer, 1990. — P. 239–252 . - ISBN 978-0-387-34805-6 . - doi : 10.1007/0-387-34805-0_22 . Arhivat din original pe 12 aprilie 2022.
  13. GOST R 34.11-2012
  14. 1 2 Algoritmul de semnătură digitală cu curbă eliptică (ECDSA) .
  15. Insecuritatea algoritmului de semnătură digitală cu non-uri parțial cunoscute .
  16. ECDSA - Eșecuri de aplicare și implementare .
  17. Criptografia cu curbă eliptică în practică .
  18. Argumente de securitate pentru semnăturile digitale și semnăturile oarbe .
  19. Sistemul de validare a algoritmului de semnătură digitală .
  20. Generarea de numere prime puternice .
  21. Generarea numerelor aleatorii .

Literatură

Standarde și brevete

Articole