Potęgowanie modułowe

Należy sprawdzić treść tego artykułu matematycznego (Styczeń 2014).

Popraw to lub przedyskutuj rzeczy do sprawdzenia . Jeśli właśnie umieściłeś baner, wskaż punkty do sprawdzenia tutaj .

W matematyce , a dokładniej w modułowej arytmetyki The modułowy potęgowanie jest typu potęgowanie ( potęgowania ) wykonywane modulo liczba całkowita . Jest szczególnie wykorzystywany w informatyce , zwłaszcza w dziedzinie kryptologii .

Generalnie, modularne problemy potęgowania są wyrażane w postaci: mając podstawę b , wykładnik e i liczbę całkowitą m, chcemy obliczyć c tak, że:


Jeśli b , e i m są dodatnie lub zero i b < m , Istnieje unikalne rozwiązanie c takie, że . Na przykład, jeśli b = 5, e = 3 i m = 13, obliczenie c daje 8.

Problemy potęgowania modułowego podobne do poprzedniego przykładu są uważane za łatwe do rozwiązania, mimo że ich liczby są ogromne. Wręcz przeciwnie, obliczenie dyskretnego logarytmu (znalezienie e z b , c i m ) jest trudne. To jednokierunkowe zachowanie funkcji sprawia, że ​​potęgowanie modularne jest dobrym kandydatem do użycia w algorytmach kryptologicznych.

Prezentacja ogólna

Naiwne obliczenie wykładnika modularnego jest następujące: mnożymy e razy liczbę b przez samą liczbę b , a po uzyskaniu liczby całkowitej b e obliczamy jej resztę modulo m za pomocą algorytmu dzielenia Euklidesa . Ta metoda ma dwie wady:

W dalszej części artykułu opisano te różne adaptacje i omówiono ich skuteczność w zależności w szczególności od wielkości danych.

Metoda bezpośrednia

Najbardziej bezpośrednią metodą obliczenia wykładnika modularnego jest obliczenie b e bezpośrednio, a następnie przyjęcie tej liczby modulo m . Spróbujmy obliczyć c , przy b = 4, e = 13 i m = 497:

Użyjmy kalkulatora, aby obliczyć 4 13 , otrzymamy wartość 67 108 864. Weźmy ten modulo 497, otrzymany wynik c to 445. Chociaż b ma tylko jedną cyfrę, a e dwa, wartość b e osiąga jedną długość 8 cyfr.

W silnej kryptologii b często ma co najmniej 256 cyfr binarnych (77 cyfr dziesiętnych). Weźmy b = 5 × 10 76 i e = 17, dwie doskonale rozsądne wartości. W tym przykładzie b ma 77 cyfr dziesiętnych, a e dwa, ale b e ma 1304 cyfry. Tego rodzaju obliczenia są możliwe na nowoczesnych komputerach, ale ogrom tego rodzaju liczby znacznie spowalnia szybkość obliczeń. Wraz ze wzrostem rozmiaru b i e w celu poprawy bezpieczeństwa szyfrowania, wartość b e staje się niemożliwa do zarządzania.

Czas wymagany do wykonania potęgowania zależy od środowiska operacyjnego i procesora. Obliczenie potęgi przez szereg mnożeń wymaga czasu O ( e ).

Metoda wykorzystująca mniej pamięci

Druga metoda obliczania potęgowania modularnego wymaga większej liczby operacji niż pierwsza metoda. Jednak ze względu na mniejsze zapotrzebowanie na pamięć operacje zajmują mniej czasu niż wcześniej. W rezultacie ten algorytm może być szybszy:

Algorytm ten wykorzystuje fakt, że dla dwóch danych liczb całkowitych b i c z pierwszych relacji wynika, co następuje:

Poniższy algorytm:

  1. Ustaw c = 1, e ' = 0.
  2. Zwiększ e ' o 1.
  3. Oblicz .
  4. Jeśli e ' < e , przejdź do kroku 2. W przeciwnym razie c zawiera poprawne rozwiązanie .

Zauważ, że za każdym razem, gdy przechodzisz przez krok 3, równanie staje się prawdziwe. Kiedy krok 3 zostało przeprowadzone th czas, a następnie, c zawiera odpowiedź, która została poszukiwanych.

Wróćmy do przykładu b = 4, e = 13 i m = 497. Algorytm przechodzi przez krok 3 trzynaście razy:


Ostateczna odpowiedź dla c to 445, tak jak w pierwszej metodzie.

Podobnie jak pierwsza metoda, wymaga to czasu obliczeń w O ( e ). Ponieważ jednak liczby użyte w tych obliczeniach są mniejsze niż liczby użyte w obliczeniach pierwszego algorytmu, współczynnik stały tej metody jest zwykle mniejszy.

Najbardziej wydajna metoda

Trzecia metoda drastycznie zmniejsza zarówno liczbę operacji, jak i miejsce w pamięci niezbędne do wykonania potęgowania modularnego. Jest to połączenie poprzedniej metody i bardziej ogólnej zasady zwanej szybką potęgą (znaną również jako potęgowanie kwadratowe).

Przede wszystkim musimy zamienić wykładnik e na notację binarną , czyli piszemy:

W tym zapisie długość od E jest N bitów. a i może przyjąć wartość 0 lub 1 dla dowolnego i takiego, że 0 ≤ i < n - 1. Z definicji a n - 1 = 1.

Wartość b e można wtedy zapisać:

Rozwiązaniem v jest zatem:

Taki algorytm można łatwo zaimplementować w języku programowania, który posiada przeciążenia operatorów i garbage collectory . Poniższy przykład jest w języku C# . Klasa Bignum reprezentuje dowolną dużą liczbę dodatnią. Zmienne wejściowe są podstawą dla podstawy ( b ), exp dla wykładnika ( e ) i m dla modułu.

Bignum modpow(Bignum base, Bignum exp, Bignum m) { Bignum result = 1; while (exp > 0) { if ((exp & 1) > 0) result = (result * base)b% m; exp >>= 1; base = (base * base)*% m; } return result; }

Kod ten, oparty na jednej stronie 244 na Applied Cryptography przez Bruce Schneier , 2 th ed. ( ISBN  0471117099 ) wykorzystuje pętlę while do wykonania całej pracy wymaganej do obliczenia potęgowania modularnego.

Zauważ, że przy pierwszym wejściu do pętli zmienna podstawowa zawiera b . Następnie powtórzenie kwadratury w trzecim wierszu kodu zapewnia, że ​​na końcu każdej pętli zmienna base jest równa , gdzie i jest liczbą iteracji pętli. (Co sprawia, że i jest następnym bitem do przetworzenia w wykładniku binarnym exp , najmniej znaczącym bitem, którym jest exp 0 ).

Pierwszy wiersz kodu po prostu wykonuje mnożenie w . Jeśli i wynosi zero, kod nie jest wykonywany, co jest równoznaczne z pomnożenia sumie o jeden. Jeśli z drugiej strony a i jest równe jeden, wynik jest po prostu mnożony przez zmienną bazową (zawierającą wartość pierwotnej bazy).

Na koniec przetestujmy na przykładzie b = 4, e = 13 i m = 497. Zauważ, że e jest równe 1101 w systemie binarnym. Ponieważ e ma długość czterech cyfr binarnych, pętla uruchomi się tylko cztery razy:

Pętla się kończy, ponieważ exp wynosi zero i zwracany jest wynik 445 . Jest to zgodne z dwoma poprzednimi algorytmami.

Czas wykonania tego algorytmu wynosi O (log e ). Podczas pracy z dużymi wartościami e jest znacznie szybszy niż dwa poprzednie algorytmy.

Uwagi i referencje

(fr) Ten artykuł jest częściowo lub w całości zaczerpnięty z artykułu w angielskiej Wikipedii zatytułowanego „  Wykładnictwo modułowe  ” ( patrz lista autorów ) . <img src="https://fr.wikipedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" title="" width="1" height="1" style="border: none; position: absolute;">