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

Podobne dokumenty