Semnătura Lamport este un criptosistem de semnătură digitală cu o cheie publică. Poate fi construit pe orice funcție unidirecțională . A fost propus în 1979 și numit după autorul său, un om de știință american, Leslie Lamport [1] .
Să fie Alice să aibă o funcție hash criptografică de 256 de biți și un generator de numere pseudoaleatoare puternic criptografic . Ea dorește să creeze și să utilizeze perechea de chei a lui Lamport, o cheie privată și cheia publică corespunzătoare .
Pentru a genera o cheie secretă, Alice folosește un generator de numere aleatorii pentru a genera 256 de perechi de numere aleatorii (2x256 de numere în total). Fiecare număr este format din 256 de biți, deci dimensiunea totală este de 2x256x256 biți = 16 KiB . Aceste numere vor fi cheia secretă a lui Alice, iar ea le va păstra într-un loc secret pentru utilizare ulterioară.
Pentru a crea cheia publică, Alice hashează fiecare dintre cele 512 numere de cheie privată, făcând astfel 512 hashe-uri de 256 de biți fiecare. Aceste 512 hasheuri formează cheia publică a lui Alice, pe care o publică.
Acum Alice vrea să semneze mesajul. Mai întâi, trimite mesajul și primește un hash de 256 de biți. Apoi, pentru fiecare bit din acel hash, ia numărul corespunzător din cheia secretă. Dacă, de exemplu, primul bit din hash-ul mesajului este zero, acesta ia primul număr din prima pereche de chei secrete. Dacă primul bit este egal cu unu, se folosește al doilea număr din prima pereche. Si asa mai departe. Ca rezultat, se obțin 256 de numere aleatoare, a căror dimensiune este de 256 × 256 biți = 8 KiB. Aceste numere formează semnătura pe care Alice o trimite împreună cu mesajul.
Rețineți că, odată ce Alice și-a folosit cheia privată, aceasta nu trebuie să fie folosită din nou. Cele 256 de numere rămase, pe care nu le-a folosit în semnătură, Alice nu trebuie să le publice sau să le folosească niciodată. Este de preferat ca ea să le ștergă, altfel cineva le poate accesa și genera o semnătură falsă cu ele.
Bob vrea să verifice semnătura cu care Alice a semnat mesajul. De asemenea, trimite mesajul și primește un hash de 256 de biți. Apoi, pentru fiecare bit din acel hash, el alege un număr din cheia publică a lui Alice. Aceste numere sunt alese în același mod în care Alice a ales numerele pentru semnătură. Adică, dacă primul bit al mesajului hash este zero, Bob alege primul număr din prima pereche din cheia publică. Si asa mai departe.
Bob apoi șterge fiecare dintre cele 256 de numere din semnătura lui Alice și primește 256 de hashe-uri. Dacă aceste 256 de hasheuri se potrivesc exact cu cele 256 de hashe-uri pe care tocmai le-a primit de la cheia publică a lui Alice, Bob crede că semnătura este autentică. Dacă nu se potrivesc, atunci este fals.
Este de remarcat faptul că înainte ca Alice să publice semnătura mesajului, nimeni nu știe 2x256 numere aleatorii din cheia secretă. Astfel, nimeni nu poate crea setul corect de 256 de numere de semnat. După ce Alice publică semnătura, nimeni nu mai știe celelalte 256 de numere și, prin urmare, nu poate crea o semnătură pentru mesajele care au un hash diferit [2] .
Lăsați -l pe Alice să trimită un mesaj M = „Lamport” lui Bob, semnându-l cu semnătura lui Lamport și folosind o funcție hash pe 8 biți. Adică, mesajul original va fi convertit într-un hash de 8 biți.
Folosind un generator de numere aleatoare, Alice obține opt perechi de numere aleatorii. Aceste 16 numere sunt cheia privată a lui Alice.
Cheie privată:
Pentru a obține cheia publică, Alice calculează o valoare hash pentru fiecare număr din cheia privată.
Cheie publică:
Alice publică cheia publică rezultată.
Alice vrea să semneze mesajul M = „Lamport”. Pentru a face acest lucru, calculează valoarea hash a acestui mesaj și asociază fiecare bit al hash-ului cu una dintre valorile din perechile de chei private, formând astfel o semnătură.
Semnătura mesajului „Lamport”:
Bob primește un mesaj semnat „Lamport” și vrea să verifice dacă Alice l-a trimis cu adevărat. Pentru a face acest lucru, el folosește cheia publică pe care Alice a publicat-o. Acesta convertește mesajul primit într-un hash și mapează fiecare bit din hashul rezultat la un număr dintr-o pereche din cheia publică. Apoi indexează semnătura mesajului și compară cele două seturi de numere rezultate. Dacă sunt egale, atunci semnătura este reală, iar mesajele au fost într-adevăr trimise de Alice.
Un set de numere obținute din cheia publică:
Hash de semnătură:
Deoarece aceste seturi sunt egale, semnătura este reală.
Fie un număr pozitiv, fie un set de mesaje și fie o funcție unidirecțională .
Pentru fiecare și , partea care semnează mesajul alege și calculează aleatoriu .
Cheia secretă constă din . Cheia publică este formată din valori . [3]
Să fie un mesaj.
Semnătura mesajului este .
Partea care validează semnătura verifică pentru toți .
Pentru a falsifica o semnătură de mesaj, criptoanalistul ar trebui să inverseze funcția unidirecțională , care se presupune că este imposibil din punct de vedere computațional.
Puterea criptografică a semnăturilor Lamport se bazează pe puterea criptografică a funcției hash .
Pentru fiecare funcție hash care generează un digest de n biți, rezistența ideală la recuperarea preimagine și la recuperarea a doua preimagine implică 2 n operații și 2 n biți de memorie în modelul de calcul clasic pentru fiecare execuție a funcției hash . Folosind algoritmul lui Grover , recuperarea pre-imagine a unei funcții hash ideale este delimitată mai sus de operații O(2 n /2 ) într-un model de calcul cuantic [4] .
Un singur mesaj poate fi semnat cu o cheie privată Lamport. Aceasta înseamnă că dacă un anumit număr de mesaje sunt semnate, trebuie publicat același număr de chei publice. Dar, dacă utilizați un arbore Merkle compus din chei publice, atunci în loc să publicați toate cheile publice, puteți publica doar partea de sus a arborelui. Acest lucru mărește dimensiunea semnăturii, deoarece o parte din arborele hash trebuie inclusă în semnătură, dar face posibilă utilizarea unui singur hash pentru a verifica mai multe semnături. Conform acestei scheme, puteți semna mesaje, unde este adâncimea arborelui Merkle. Adică, teoretic, putem folosi o cheie publică pentru orice număr de mesaje [5] .
Mai întâi trebuie să generați cheile unice private ale Lamport și cheile unice publice ale Lamport . În plus, pentru fiecare cheie publică , unde , se calculează hash-ul său . Și pe baza acestor valori se construiește un arbore Merkle .
Numerotăm nodurile arborelui în așa fel încât indicele să desemneze distanța de la acest nod la elementul frunză, iar indicele să desemneze numărul ordinal al nodului de la stânga la dreapta la același nivel .
În arborele nostru, valorile hash sunt elemente frunze, adică . Fiecare nod care nu este frunză al arborelui este o valoare hash de la unirea a doi copii împreună, adică , și așa mai departe.
Astfel, avem un arbore al cărui element rădăcină este cheia noastră publică .
Pentru a semna un mesaj conform schemei noastre, mai întâi trebuie să-l semnați cu o semnătură Lamport unică . Acest lucru se face folosind una dintre perechile de chei publice/private .
este elementul frunză al arborelui corespunzător cheii publice . Calea de la elementul frunză al copacului până la vârful acestuia constă din elementele , unde este elementul frunză și este vârful copacului. Pentru a calcula această cale, avem nevoie de toți copiii nodurilor . Știm că nodul este un copil al nodului . Pentru a calcula următorul nod pe calea către vârf, avem nevoie de ambii copii ai nodului . Prin urmare, trebuie să cunoaștem „fratele” nodului . Să-l sunăm . Deci, . Prin urmare, avem nevoie de noduri pentru a calcula partea de sus a arborelui. Le calculăm și le salvăm.
Aceste noduri, împreună cu semnătura unică a mesajului, constituie semnătura finală .
Destinatarul mesajului are la dispoziție cheia publică , mesajul și semnătura . Mai întâi verifică semnătura unică a mesajului . Dacă este autentic, destinatarul calculează . Și apoi pentru calcule . Dacă este egală cu , atunci semnătura este considerată autentică.
În loc de a genera și stoca toate numerele aleatorii ale cheii secrete, se poate stoca un singur număr de dimensiunea corespunzătoare. De obicei, dimensiunea este aleasă să fie aceeași cu dimensiunea unui număr aleatoriu din cheia privată. Această cheie poate fi folosită ca sămânță pentru un generator de numere aleatoare (CSPRNG), astfel încât întreaga secvență de chei secrete de numere aleatoare să poată fi recreată atunci când este necesar.
În același mod, o cheie poate fi utilizată împreună cu un CSPRNG pentru a genera mai multe chei Lamport. Sunt preferate CSPRNG-urile care au o putere criptografică ridicată, cum ar fi BBS .
O semnătură Lamport poate fi utilizată împreună cu o listă de hashuri, făcând posibilă includerea unui singur hash într-o cheie publică. Adică, în loc de valori - . Pentru a putea compara numerele aleatorii din semnătură cu hash-ul din cheia publică, toate hashurile neutilizate în cheia publică, adică valorile pentru oricare , trebuie incluse în semnătură. Ca rezultat, cheia publică devine semnificativ mai scurtă, iar dimensiunea semnăturii se dublează aproximativ.
Schema de semnătură digitală Lamport nu necesită ca mesajul m să fie hashing înainte de a fi semnat. Hashingul poate fi folosit, de exemplu, pentru a semna mesaje lungi, unde hash-ul mesajului va fi semnat, și nu mesajul în sine [6] .
Principalele avantaje ale schemei de semnătură unică a Lamport sunt că poate fi construită pe orice funcție unidirecțională și că algoritmul său de verificare a semnăturii și a mesajelor este semnificativ mai rapid decât algoritmii sistemelor de semnătură reutilizabile. În același timp, schema are o serie de dezavantaje. În primul rând, dezavantajul este posibilitatea de unică folosință a cheilor. Adică, la semnarea fiecărui mesaj nou, trebuie să generați o nouă pereche, ceea ce duce la complicarea sistemului. În al doilea rând, schema are dezavantajul unei dimensiuni mari a semnăturii și a unei perechi de chei publice și private [7] .
Acest sistem are potențial în lumina faptului că dezvoltarea potențială a unui computer cuantic amenință securitatea multor algoritmi utilizați pe scară largă, precum RSA , în timp ce semnătura Lamport va rămâne sigură și în acest caz [8] . Împreună cu arborii Merkle , criptosistemul Lamport poate fi folosit pentru autentificarea mai multor mesaje, acționând ca o schemă de semnătură digitală destul de eficientă [9] .