Algoritmul Gelfond-Shanks ( ing. Baby-step giant-step ; numit și algoritmul pașilor mari și mici ; de asemenea, puteți găsi foarte des algoritmul de potrivire a numelui , de exemplu, în cartea lui Vasilenko „Algoritmi teoriei numerice ale criptografiei” ) - în teoria grupurilor, un algoritm determinist de logaritmi discreti în grupul multiplicativ al inelului de reziduuri modulo un număr prim. A fost propus de matematicianul sovietic Alexander Gelfond în 1962 și Daniel Shanks în 1972 [1] [2] [3] .
Metoda simplifică teoretic soluția problemei logaritmului discret, pe a cărei complexitate de calcul sunt construite multe criptosisteme cu cheie publică . Se referă la metode de întâlnire la mijloc .
Problema logaritmului discret este de mare interes pentru construcția de criptosisteme cu cheie publică . Pe ipoteza unei complexități de calcul extrem de ridicate a rezolvării acestei probleme, astfel de criptoalgoritmi se bazează, de exemplu, RSA , DSA , Elgamal , Diffie-Hellman , ECDSA , GOST R 34.10-2001 , Rabin și alții. În ele, criptoanalistul poate obține cheia privată luând logaritmul discret al cheii publice (cunoscută de toată lumea) și folosindu-l pentru a converti textul cifrat în textul mesajului. Cu toate acestea, cu cât este mai dificil să îl găsiți (cu cât trebuie să faceți mai multe operațiuni pentru a găsi logaritmul discret), cu atât criptosistemul este mai sigur . O modalitate de a crește complexitatea problemei logaritmului discret este de a crea un criptosistem bazat pe un grup cu o ordine mare (unde logaritmul va fi modulo un număr prim mare). În cazul general, o astfel de problemă se rezolvă prin enumerare exhaustivă , dar acest algoritm permite în unele cazuri simplificarea găsirii exponentului (reducerea numărului de pași) la calcularea modulo unui număr prim, în cel mai favorabil caz, prin rădăcina pătrată. de ori [4] , dar această reducere încă nu este suficientă pentru a rezolva problema pe un calculator electronic într-un timp rezonabil (chestiunea rezolvării problemei logaritmului discret în timp polinomial pe un computer personal este încă deschisă) [5] .
Să fie dat un grup ciclic cu generator , care conține elemente. Un număr întreg (în intervalul de la până la ) se numește logaritm de bază discretă al unui element dacă relația este adevărată:
Sarcina logaritmului discret este de a determina pentru dat .
Formal, problema logaritmului discret se pune după cum urmează [6] :
cu condiția ca acesta să nu existe și poate fi, de asemenea, fie un număr prim, fie un număr compus.
Ideea algoritmului este de a alege raportul optim de timp și memorie , și anume, într-o căutare îmbunătățită a exponentului.
Să fie dat un grup ciclic de ordine , un generator al grupului și un element al grupului . Sarcina se reduce la găsirea unui număr întreg pentru care
Algoritmul Gelfond-Shanks se bazează pe reprezentarea în forma , unde , și enumerarea lui și . Restricția asupra și rezultă din faptul că ordinea grupului nu depășește , ceea ce înseamnă că intervalele indicate sunt suficiente pentru a obține toate cele posibile din semiinterval . Această reprezentare este echivalentă cu egalitatea
|
|
(unu) |
Algoritmul precalculează pentru diferite valori și le stochează într- o structură de date care permite o căutare eficientă, apoi iterează peste toate valorile posibile și verifică dacă se potrivește cu o anumită valoare . Astfel, se găsesc indici și care satisfac relația (1) și ne permit să calculăm valoarea [7] .
Intrare : Un grup de ordine ciclică , un generator și un anumit element .
Ieșire : un număr care satisface .
Este necesar să se demonstreze că aceleași elemente din tabele există în mod necesar, adică există așa și , că . Această egalitate are loc în cazul , sau . Căci , inegalitatea este valabilă . Pentru perechi diferite și avem , deoarece altfel s-ar dovedi că cu alegerea indicată este posibil numai în cazul , și, prin urmare, . Astfel, expresiile iau toate valorile din intervalul de la până la , care, datorită faptului că , conține toate valorile posibile de la până la . Prin urmare, pentru unii și egalitatea [2] este valabilă .
Să presupunem că trebuie să rezolvăm , unde și sunt numere întregi pozitive mai mici decât . O modalitate este de a itera secvenţial de la la , comparând valoarea cu . În cel mai rău caz, avem nevoie de pași (când ). În medie, va fi nevoie de pași. În caz contrar, putem reprezenta ca . Astfel, problema se reduce la găsirea și . În acest caz, puteți rescrie sarcina ca sau . Acum putem itera toate valorile posibile din partea dreaptă a expresiei. În acest caz, acestea sunt toate numerele de la până la . Aceștia sunt așa-numiții pași mari. Se știe că una dintre valorile obținute pentru este cea cerută. Putem înregistra toate valorile din partea dreaptă a expresiei într-un tabel. Putem calcula apoi valorile posibile pentru partea stângă pentru diferite valori ale . Acestea sunt toate numerele de la până la unul dintre care este cel dorit și împreună cu valoarea corectă a părții drepte dă rezultatul dorit pentru . Astfel, sarcina se reduce la sortarea diferitelor valori din partea stângă și căutarea lor în tabel. Dacă valoarea dorită este găsită în tabel, atunci am găsit , și, prin urmare, corespunzătoare . Această ilustrație demonstrează viteza algoritmului. În medie, se efectuează operațiuni. În cel mai rău caz, sunt necesare operații [3] .
Mai jos este un exemplu de rezolvare a problemei logaritmului discret cu o ordine de grup mic. În practică, criptosistemele folosesc grupuri de ordin superior pentru a îmbunătăți puterea criptografică .
Să fie cunoscut . La început, vom crea și completa tabelul pentru „pașii mari”. Să alegem ← ( ). Apoi va rula de la până la .
unu | 2 | 3 | patru | 5 | |
douăzeci | 9 | 19 | 12 | zece |
Să găsim o valoare potrivită pentru , astfel încât valorile din ambele tabele să se potrivească
unu | 2 | 3 | patru | |
· | cincisprezece | 6 | 7 | 12 |
Se poate observa că în al doilea tabel pentru , o astfel de valoare este deja în primul tabel. Găsiți [2] .
Există o modalitate de a îmbunătăți performanța algoritmului Gelfond-Shanks. Constă în folosirea unei scheme eficiente de acces la tabel. Cel mai bun mod este să utilizați un tabel hash . Ar trebui să aplicați hash pe a doua componentă și apoi să efectuați o căutare hash în tabel în bucla principală pe . Deoarece accesarea și adăugarea elementelor la un tabel hash necesită timp ( o constantă ), acest lucru nu încetinește asimptotic algoritmul.
Timpul de rulare al algoritmului este estimat ca , ceea ce este mult mai bun decât timpul de rulare al enumerarii exhaustive a exponenților [4] .
Algoritmi teoretici numerelor | |
---|---|
Teste de simplitate | |
Găsirea numerelor prime | |
Factorizarea | |
Logaritm discret | |
Găsirea GCD | |
Modul de aritmetică | |
Înmulțirea și împărțirea numerelor | |
Calcularea rădăcinii pătrate |