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).
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ă .
Pentru a construi un sistem de semnătură digitală, trebuie să efectuați următorii pași:
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 :
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]
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 se realizează conform următorului algoritm [5] :
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 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 .
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]Să dăm un exemplu despre cum funcționează algoritmul pentru numere mici. Lăsați valoarea hash a mesajului nostru .
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: Rivest , Shamir , Adleman ), se bazează pe dificultatea factorizării numerelor mari.
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ă.
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ă :
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]
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]
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]
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:
Pentru a testa implementarea, dezvoltatorul trebuie să depună o cerere de testare a implementării acesteia la laboratorul CMT ( Cryptographic Module Testing Laboratory ) . [5]
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 |
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]