O funcție unidirecțională este o funcție matematică care este ușor de evaluat pentru orice valoare de intrare, dar dificil de găsit argumentul având în vedere valoarea funcției. Aici „ușor” și „greu” trebuie înțeles în termenii teoriei complexității computaționale . Diferența dintre complexitatea transformărilor înainte și înapoi determină eficiența criptografică a unei funcții unidirecționale. Non- injectivitatea unei funcții nu este o condiție suficientă pentru a o numi unilaterală. Funcțiile unidirecționale pot fi, de asemenea, numite greu de anulat sau ireversibile.
Existența funcțiilor unidirecționale nu a fost încă dovedită. Existența lor va dovedi că clasele de complexitate P și NP nu sunt egale , rezolvând pe parcurs o serie de probleme din informatica teoretică . Modern[ când? ] criptografia asimetrică se bazează pe presupunerea că funcțiile unidirecționale există.
Funcțiile unidirecționale sunt instrumente fundamentale în criptografie , identificare personală, autentificare și alte domenii ale securității datelor. Deși existența unor astfel de funcții este încă o ipoteză nedovedită, există mai mulți concurenți care au rezistat decenii de analiză. Multe dintre ele sunt parte integrantă a majorității sistemelor de telecomunicații , precum și a sistemelor de comerț electronic și de internet banking din întreaga lume.
Fie mulțimea tuturor șirurilor binare de lungime n. O funcție este o funcție unidirecțională dacă este calculată eficient în timp polinomial pe o mașină Turing deterministă , dar nu există o mașină Turing probabilistică polinomială care inversează această funcție cu o probabilitate mai mare decât exponențial mică. Adică, pentru orice mașină polinomială probabilistică , pentru orice polinom și suficient de mare :
unde rândul este ales aleatoriu pe mulțime în conformitate cu legea distribuției uniforme. Timpul de funcționare al mașinii este limitat de un polinom în lungimea preimaginei dorite [1] .
Existența funcțiilor unidirecționale nu a fost dovedită. Dacă f este o funcție unidirecțională, atunci găsirea funcției inverse este dificilă (prin definiție), dar ușor de verificat (prin evaluarea lui f pe ea). Astfel, din existența unei funcții unidirecționale rezultă că P ≠ NP. Totuși, nu se știe dacă P ≠ NP implică existența funcțiilor unidirecționale.
Existența funcțiilor unidirecționale va presupune existența multor alte obiecte criptografice utile, inclusiv:
Se spune că o funcție unidirecțională păstrează lungimea dacă lungimea de biți a valorii funcției este egală cu lungimea de biți a argumentului. Astfel de funcții sunt utilizate, de exemplu, în generatoarele pseudoaleatoare. Dacă lungimea de biți a valorii unei funcții unidirecționale este constantă pentru orice lungime de argument, atunci se numește funcție hash . Deci, funcția hash este folosită pentru a stoca parole sau pentru a crea o semnătură electronică [1] .
Dificultatea problemei de construire a schemelor criptografice din funcții unidirecționale poate fi ilustrată prin următorul exemplu. Să fie o funcție unidirecțională și trebuie să construim un criptosistem cu o cheie secretă . Într-un astfel de sistem criptografic, există o singură cheie - una secretă, care este cunoscută atât de expeditor, cât și de destinatarul mesajului criptat. Algoritmii de criptare și de decriptare depind ambii de această cheie secretă și sunt astfel încât pentru orice text simplu . Este clar că dacă criptograma mesajului este calculată ca , atunci adversarul, care a interceptat , poate calcula doar cu o probabilitate neglijabilă. Dar, în primul rând, nu este clar cum un destinatar legitim poate recupera un mesaj dintr-o criptogramă? În al doilea rând, din faptul că funcția este unidirecțională, rezultă doar că adversarul nu poate calcula întregul mesaj. Și acesta este un nivel foarte scăzut de stabilitate. Este de dorit ca un adversar care cunoaște criptograma să nu poată calcula un singur bit din textul simplu.
Pentru a rezolva prima problemă, au fost inventate funcții unidirecționale cu o intrare secretă . Acesta este un tip special de funcție unidirecțională pentru care este ușor de calculat dat , dar dificil de calculat din cunoscut . Cu toate acestea, există câteva informații secrete suplimentare care, dacă sunt cunoscute, pot fi calculate cu ușurință .
Un alt exemplu de utilizare a funcțiilor unidirecționale în schemele criptografice este următoarea schemă de autentificare:
Abonatul generează următoarea secvență de mesaje: etc. , unde este o funcție unidirecțională. Apoi este transmis pe un canal secret (sau la o întâlnire) către abonat . Când este necesar să-și confirme identitatea, el transmite un mesaj pe un canal deschis . verificări: . Data viitoare va trimite și va verifica: etc. Interceptarea mesajelor în etapa a i-a în canalul deschis nu va oferi nimic atacatorului, deoarece acesta nu va putea obține valoarea corespunzătoare pentru a se identifica ca abonat în continuare. timp . Astfel de scheme sunt folosite pentru a identifica „prietenul/dușmanul” [2] .
Pentru a proteja sistemele informatice de abuzul de servicii, părții solicitante i se cere să rezolve o problemă care necesită mult timp pentru a găsi o soluție, iar rezultatul este ușor și rapid verificat de către partea care servește. Un exemplu de astfel de protecție anti -spam este sistemul Hashcash [3] , care solicită un hash de inversare parțială de la expeditorul e-mailului.
Sistemul Bitcoin necesită ca suma hash rezultată să fie mai mică decât un parametru special. Pentru a căuta suma hash dorită, este necesar să o recalculați de mai multe ori cu enumerarea valorilor arbitrare ale parametrului suplimentar. Este nevoie de aproximativ 10 minute pentru ca toate computerele din sistem să caute o sumă hash, care reglementează rata la care sunt emise noi bitcoini. Verificarea necesită doar un singur calcul hash.
Existența funcțiilor unidirecționale este o condiție necesară pentru puterea multor tipuri de scheme criptografice. În unele cazuri, acest fapt este stabilit destul de simplu. Luați în considerare o funcție astfel încât . Este calculat prin algoritm în timp polinomial. Să arătăm că dacă nu este o funcție unidirecțională, atunci criptosistemul este instabil. Să presupunem că există un algoritm probabilist polinom care inversează cu probabilitate pentru cel puțin un polinom . Iată lungimea cheii . Un atacator poate introduce o cheie în algoritm și poate obține o valoare din preimagine cu probabilitatea specificată . Apoi, atacatorul alimentează algoritmul ca intrare și primește o pereche de chei . Deși nu este neapărat același cu , este totuși , prin definiție , un criptosistem pentru orice text simplu . Deoarece se găsește cu o probabilitate de cel puțin , ceea ce nu este considerat neglijabil în criptografie, criptosistemul este instabil.
Din cele spuse rezultă că ipoteza existenței funcțiilor unidirecționale este cea mai slabă ipoteză criptografică, care poate fi suficientă pentru a demonstra existența unor scheme criptografice puternice de diferite tipuri. Pentru a afla dacă această condiție este într-adevăr suficientă, sunt îndreptate eforturi considerabile ale specialiștilor.
In zilele de azi[ când? ] se dovedește că existența funcțiilor unidirecționale este o condiție necesară și suficientă pentru existența unor criptosisteme puternice cu cheie secretă, precum și protocoale criptografice puternice de mai multe tipuri, inclusiv protocoale de semnătură electronică. Pe de altă parte, există rezultatul lui Impagliazzo și Rudich, care este un argument suficient de puternic că anumite tipuri de scheme criptografice (inclusiv protocoale de distribuție a cheilor de tip Diffie-Hellman) necesită ipoteze mai puternice decât ipoteza funcției unidirecționale [4] .
Mai jos sunt descriși mai mulți concurenți pentru funcții unidirecționale. Momentan nu se știe dacă acestea sunt cu adevărat unidirecționale, dar cercetări ample nu au reușit încă să găsească un algoritm invers eficient pentru fiecare dintre ele.
Funcția ia ca intrare două numere prime și în reprezentare binară și returnează produsul lor . Această funcție poate fi calculată în ordinea timpului , unde este lungimea totală (numărul de numere binare) a intrării. Construirea unei funcții inverse necesită găsirea factorilor unui număr întreg dat . Determinarea factorilor este o operație de calcul care necesită foarte mult timp. Pentru a estima complexitatea unui algoritm care descompune un întreg în factori primi, funcția este adesea folosită:
Dacă algoritmul are complexitate , atunci are nevoie de un timp polinom pentru a rula (dimensiunea problemei la intrare, numărul de biți ai numărului, ). Cu complexitate, va necesita timp exponențial. Astfel, rata de creștere a funcției este între polinom și exponențial. Prin urmare, se spune că algoritmii cu o asemenea complexitate necesită timp sub-exponențial [5] .
Există mai multe metode de factorizare a unui număr cu numere prime și . Unii dintre ei:
Funcția poate fi generalizată la o gamă de semiprime . Rețineți că nu poate fi unilateral pentru arbitrare , deoarece produsul lor are un factor de 2 cu probabilitate ¾.
Rețineți că factorizarea cu complexitate polinomială este posibilă pe un computer cuantic folosind algoritmul lui Shor ( clasa BQP ).
Funcția ia două numere întregi: și , unde este produsul a două numere prime și . Ieșirea este restul după împărțirea la . Găsirea funcției inverse necesită calcularea rădăcinii pătrate modulo , adică găsirea dacă se știe și că . Se poate arăta că ultima problemă este la fel de dificilă din punct de vedere computațional precum factorizarea.
Criptosistemul Rabin se bazează pe presupunerea că funcția Rabin este unidirecțională.
Funcția de exponent discret ia ca argumente un număr prim și un întreg în intervalul de la până la și returnează restul după împărțirea unora la . Această funcție poate fi ușor calculată în timp , unde este numărul de biți în . Inversarea acestei funcții necesită calcularea logaritmului discret modulo . Fie un grup abelian finit, de exemplu, un grup multiplicativ al unui câmp finit sau o curbă eliptică peste un câmp finit. Sarcina calculării logaritmilor discreti este de a determina un număr întreg care, având în vedere datele, satisface relația:
Pentru unele grupuri , această sarcină este destul de simplă. De exemplu, dacă este un grup de numere întregi modulo adiție. Pentru alte grupuri însă, această sarcină este mai dificilă. De exemplu, într-un grup multiplicativ cu câmp finit, cel mai cunoscut algoritm pentru rezolvarea problemei logaritmului discret este metoda sităi pătratice într-un câmp numeric . Complexitatea calculării logaritmilor discreti în acest caz este estimată ca . Schema ElGamal se bazează pe această problemă [6] .
Pentru grupuri precum curba eliptică, problema logaritmului discret este și mai dificilă. Cea mai bună metodă disponibilă în prezent pentru calcularea logaritmilor discreti pe o curbă eliptică generală peste un câmp se numește metoda ρ a lui Pollard . Complexitatea sa . Acesta este un algoritm exponențial, așa că criptosistemele cu curbe eliptice tind să funcționeze cu o cheie mică, în jur de 160 de biți. În timp ce sistemele bazate pe factorizarea sau calculul de logaritmi discreti în câmpuri finite folosesc chei de 1024 de biți [6] .
Câteva probleme strâns legate sunt, de asemenea, legate de problema logaritmului discret. Să fie dat un grup abelian finit :
Se poate demonstra că problema de selecție Diffie-Hellman nu este mai dificilă decât problema Diffie-Hellman, iar problema Diffie-Hellman nu este mai dificilă decât problema logaritmului discret [6] .
Există multe funcții hash criptografice (de exemplu SHA-256 ) care sunt rapid de calculat. Unele dintre versiunile mai simple nu au trecut prin analize complexe, dar cele mai puternice versiuni continuă să ofere soluții rapide și practice pentru calcule unidirecționale. O mare parte din suportul teoretic pentru aceste caracteristici are ca scop contracararea unora dintre atacurile de succes anterior.
Alți concurenți pentru funcții unidirecționale se bazează pe dificultatea decodării codurilor liniare aleatoare și alte probleme.