Rozdział 6 Pakowanie plecaka
Transkrypt
Rozdział 6 Pakowanie plecaka
Rozdział 6 Pakowanie plecaka 6.1 Postawienie problemu Jak zauważyliśmy, szyfry oparte na rachunku macierzowym nie są przerażająco trudne do złamania. Zdecydowanie trudniejszy jest kryptosystem oparty na następującym problemie pakowania plecaka: Załóżmy, że musimy zabrać ze sobą na wycieczkę w góry wiele ,,potrzebnych” przedmiotów. Jednakże do dyspozycji mamy jedynie plecak o ograniczonej pojemności S. Przedmioty mają objętości a1 , a2 , . . . , an , które po zsumowaniu dają objętość większą od S. Musimy zatem z czegoś zrezygnować. Jedynym kryterium jest tu tylko to, by plecak był zapakowany optymalnie, tj. bierzemy tylko te przedmioty, których objętości dają sumę S. Co zatem włożyć do plecaka? 6.1.Przykład. Niech (a1 , a2 , a3 , a4 , a5 ) = (2, 7, 8, 11, 12) oraz niech S = 21. Wówczas mamy a1 + a3 + a5 = S oraz a1 + a2 + a5 = S. Zatem zabieramy ze sobą przedmioty pierwszy, trzeci i piąty, lub pierwszy, drugi i szósty. Powyższy problem można sformułować następująco: Dla danych liczb naturalnych a1 , a2 , . . . , an oraz S, znaleźć taki ciąg x1 , x2 , . . . , xn złożony z zer i jedynek, żeby zachodziła równość a1 x1 + a2 x2 + · · · + an xn = S. Rozważając ciąg z przykładu 6.1 dostajemy dwa rozwiązania: x1 = x3 = x4 = 1, x2 = x3 = 0 oraz 1 x1 = x2 = x5 = 1, x3 = x4 = 0. (6.2) Aby sprawdzić, czy (6.2) zachodzi musimy wykonać co najwyżej n dodawań, jednak żeby rozwiązać problem pakowania plecaka metodą prób i błędów, musimy sprawdzić wszystkie 2n możliwości. Oznacza to, że rozwiązanie powyższego problemu zajmuje O(2n ) czasu. Najszybszy znany algon rytm działa w czasie O(2 2 ). Jeśli n = 100, to komputer wykonujący 220 operacji na sekundę potrzebuje na rozwiązanie problemu pakowania plecaka czas rzędu 230 , czyli około miliard sekund albo ponad 30 lat! Pewne wartości liczb a1 , a2 , . . . , an zdecydowanie przyśpieszają rozwiązanie problemu pakowania plecaka. Na przykład, jeśli są to potęgi dwójki, to rozwiązanie sprowadza się do znalezienia rozwinięcia liczby S w systemie dwójkowym. Rozwinięcie to znajdujemy w czasie logarytmicznym stosując tzw. ,,chciwy algorytm”, który opiszemy poniżej. 6.2 Szybko rosnące ciągi Ciąg liczb naturalnych a1 , a2 , . . . , an nazywamy szybko rosnącym, jeśli j−1 X ai < aj dla j ∈ {2, 3, . . . , n}. i=1 Przykładem szybko rosnącego ciągu jest 2,3,7,14,27. Niech S = 37. Wówczas ,,chciwy algorytm” działa następująco: Zawsze bierzemy największy przedmiot jaki się mieści. Tak więc x5 = 1, ale x4 = 0 ponieważ 27 + 14 > 37. x3 = 1 gdyż 27 + 7 < 37. Podobnie, x2 = 1 oraz x1 = 0. Ogólnie, jeśli mamy szybko rosnący ciąg a1 , a2 , . . . , an , to wyznaczamy xn , xn−1 , . . . , x1 korzystając ze wzorów ( 1, jeśli S ≥ an xn = 0, jeśli S < an oraz ( P 1, jeśli S − ni=j+1 xi ai ≥ aj xj = P 0, jeśli S − ni=j+1 xi ai < aj dla j ∈ n − 1, n − 2, . . . , 1. Problem pakowania plecaka dla ciągów szybko rosnących może być więc rozwiązany bardzo szybko. Poniższy system kryptograficzny Merklego–Hellmana, który do roku 1982 był uważany za najlepszy system o tzw. kluczu publicznym opiera się na ,,zamianie” problemu trudnego na problem łatwy. 2 6.3 Kryptosystem oparty na problemie pakowania plecaka Załóżmy, że a1 , a2 , . . . , an jest szybko rosnącym ciągiem liczb naturalnych. Niech m będzie liczbą naturalną większą od 2an . Weźmy dowolną liczbę całkowitą nieujemną w względnie pierwszą z m i utwórzmy ciąg b1 , b2 , . . . , bn biorąc wa1 , wa2 , . . . , wan modulo m. Jeżeli b1 , b2 , . . . , bn nie jest Pnciągiem szybko rosnącym, to żeby rozwiązać problem pakowania plecaka i=1 xi bi = S, nie możemy użyć chciwego algorytmu. Jednakże, jeśli znamy w−1 , to możemy rozwiązać problem pakowania plecaka n X xi ai = S0 , (6.3) i=1 gdzie S0 ≡ Sw−1 (mod m). Kiedy mamy już rozwiązany problem (6.3), to wiemy, że n n X X w−1 S = w−1 xi bi ≡ xi ai (mod m). (6.4) i=1 i=1 Powyższą procedurę opiszemy na przykładzie. 6.5.Przykład. Rozważmy szybko rosnący ciąg (a1 , a2 , a3 , a4 , a5 ) = (3, 5, 9, 20, 44), m = 89 oraz w = 67. Zauważmy, że w−1 = 4. Wówczas (b1 , b2 , b3 , b4 , b5 ) = (23, 68, 69, 5, 11). Żeby rozwiązać problem pakowania plecaka 23x1 + 68x2 + 69x3 + 5x4 + 11x5 = 84, mnożymy obie strony powyższego równania przez 4 i redukujemy modulo 89 otrzymując 3x1 + 5x2 + 9x3 + 20x4 + 44x5 = 69. Teraz rozwiązujemy łatwo powyższy problem pakowania plecaka otrzymując x1 = x3 = 0; x2 = x4 = x5 = 1. Zatem nasz pierwotny problem ma rozwiązanie 68 + 5 + 11 = 84. System kryptograficzny oparty na problemie pakowania plecaka działa następująco. Wybieramy szybko rosnący ciąg a1 , a2 , . . . , an , liczbę m > 2aN oraz liczbę w względnie pierwszą z N . Następnie obliczamy wyrazy ciągu b1 , 3 b2 , . . . , bN i podajemy je do publicznej wiadomości. Jeśli ktoś chce przesłać do nas wiadomość, najpierw koduje ją za pomocą zer i jedynek (na przykład jak w poniższej tabelce), a następnie dzieli otrzymany ciąg na bloki PN długości N . Dla każdego bloku x1 , x2 , . . . , xN , nadawca oblicza sumę i=1 xi bi i otrzymany ciąg sum wysyła jako tekst zaszyfrowany. litera odpowiednik litera odpowiednik A B C D E F G H I J K L M 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 N O P Q R S T U V W X Y Z 01101 01110 01111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 Dla przykładu zaszyfrujemy wiadomość REPLY IMMEDIATELY używając ciągu C = (2002, 3337, 2503, 2170, 503, 172, 3347, 855, 709, 417). Najpierw zamieniamy litery (a w zasadzie digramy) na bloki 10–cyfrowe: 1000100100 0111101011 1100001000 0010000011 0100000000 1001100100 0110001100 0101111000 Następnie obliczamy odpowiednie sumy wyrazów ciągu C otrzymując kryptogram (3360, 12986, 8686, 10042, 3629, 3337, 5530, 9729). (6.6) Na przykład dodajemy 2002, 503 i 855 żeby otrzymać 3360. Zauważmy teraz, dlaczego klucz szyfrujący może być podany do publicznej wiadomości: Mamy tekst jawny oraz kryptogram właśnie otrzymany, 4 ale czy jesteśmy w stanie odczytać inny kryptogram, np. (4619, 3337), zaszyfrowany tym samym kluczem? Powyższa idea prowadzi do powstania sieci korespondentów. Każdy użytkownik sieci ma swój prywatny klucz rozszyfrowujący, a klucze szyfrujące mogą być umieszczone w swoistej ,,książce telefonicznej”, która jest dostarczona każdemu użytkownikowi sieci. Ideę tę omówimy w następnym rozdziale, a teraz pokażemy jak można łatwo rozszyfrować szyfr (6.6). Do rozszyfrowania potrzebujemy oryginalnego ciągu szybko rosnącego, jakim jest (2, 11, 14, 29, 58, 119, 241, 480, 959, 1917), liczby m = 3837 oraz w−1 = 23. Żeby rozszyfrować 3360, znajdujemy najpierw 3360 · 23 ≡ 540 (mod 3837) i zauważamy, że 540 = 480 + 58 + 2. Zatem odpowiadającym blokiem zero–jedynkowym jest 1000100100, który odpowiada digramowi RE. Zauważmy, że jeżeli długość ciągu jest równa 5, to opisany szyfr jest bardziej skomplikowaną wersją klasycznego szyfru permutacyjnego - litera alfabetu jest zastąpiona liczbą. W opisanym przykładzie liczbą zastępujemy digram tekstu jawnego. Aby odróżnić szyfr oparty na problemie pakowania plecaka od szyfru klasycznego powinniśmy wybierać ciągi długości różnej niż wielokrotność długości bloku reprezentującego litery alfabetu. W roku 1983 Shamir opublikował pracę, która zdyskwalifikowała system kryptograficzny oparty na problemie pakowania plecaka jako system bezpieczny. Otóż okazało się, że szyfr ten można złamać w czasie wielomianowym. Po roku 1983 starano się utrudnić szyfr, ale ponieważ każda próba kończyła się szybko podobną publikacją, szyfry oparte na problemie pakowania plecaka nie mają dziś dużego powodzenia, mimo że niektóre z nich w dalszym ciągu są nie złamane. 5