Inzynieria bezpieczenstwa

Transkrypt

Inzynieria bezpieczenstwa
INŻYNIERIA BEZPIECZEŃSTWA
LABORATORIUM NR 2
ALGORYTM XOR
ŁAMANIE ALGORYTMU XOR
1. Algorytm XOR
Operacja XOR to inaczej alternatywa wykluczająca, oznaczona symbolem „^” w języku C i
symbolem ⊕ w matematyce. Operacja ta działa na wartościach binarnych, zdefiniowana jest
następująco:
0
1
⊕
0
0
1
1
1
0
Właściwości algorytmu XOR:
a ⊕ a = 0 (1)
a ⊕ b ⊕ a = b (2)
Algorytm XOR nie jest niczym więcej, niż szyfrem Vigenere’a. Jest on do dziś stosowany w
komercyjnych pakietach oprogramowania, zwłaszcza przeznaczonego dla systemu Windows,
i reklamowany jest jako „prawie tak bezpieczny, jak DES”. Jak zostanie za chwilę pokazane,
algorytm ten nie zapewnia praktycznie żadnego bezpieczeństwa. W USA algorytm ten jest
stosowany z kluczem 160-bitowym w urządzeniach telefonii komórkowej do szyfrowania
rozmów na terenie całego kraju.
Algorytm XOR jest algorytmem symetrycznym. Kryptogram jest wynikiem binarnego
sumowania modulo 2 tekstu jawnego z kluczem. Jedna procedura, realizująca algorytm XOR,
może być zastosowana zarówno do operacji szyfrowania, jak i deszyfrowania, ponieważ
dwukrotne sumowanie modulo 2 tej samej wartości daje w wyniku tę wartość:
M⊕K=C
C⊕K=M
2. Łamanie algorytmu XOR
Algorytm XOR można złamać bardzo łatwo, jednakże łamanie ograniczone jest kilkoma
warunkami:
– klucz szyfrujący musi być użyty cyklicznie;
- długość kryptogramu musi być wystarczająca;
-1-
- kryptoanalityk musi znać typ zaszyfrowanych danych (tekst, plik BMP itp).
W niniejszej instrukcji ograniczamy się do opisania sposobu łamania kryptogramów z
zaszyfrowanym tekstem w języku polskim. Ograniczona jest również długość klucza, który
będzie mógł zostać znaleziony.
Instrukcja postępowania:
1. Stworzyć tablicę, zawierającą dwie kolumny: Przesunięcie i Ilość. Tablicę wypełnić w
sposób następujący: do kolumny Przesunięcie wpisać kolejne liczby od 1 do
zakładanej maksymalnej długości klucza (można założyć np 200); kolumnę Ilość
wypełnić zerami.
2. Uzupełnić dane w kolumnie Ilość: należy dla każdego przesunięcia (wpisanego w
kolumnę Przesunięcie w tablicy) obliczyć ile znaków jest takich samych. Dla
przesunięcia 1 porównujemy znaki nr 1 i 2, potem 2 i 3 itd. Dla przesunięcia 3
porównujemy znaki nr 1 i 4, potem 2 i 5, 3 i 6 itd.
3. Posortować dane w tablicy malejąco, pod względem kolumny Ilość.
4. Obliczyć długość klucza: należy wziąć trzy wartości przesunięć, odpowiadające
największej ilości tych samych znaków (czyli wartości z kolumny Przesunięcie z
dwóch górnych wierszy tablicy), i wyliczyć ich NWD (Największy Wspólny
Dzielnik), np za pomocą algorytmu Euklidesa. Wyliczona wartość jest długością
klucza.
Uwaga. W przypadku, gdy długość klucza jest równa 1, można spróbować zamiast
trzech wartości wziąć dwie. Jeśli długość klucza nadal będzie równa 1, należy założyć,
że klucz rzeczywiście ma 1 znak (aczkolwiek możliwe jest, że analizowane dane nie
są kryptogramem).
5. Znaki klucza mogą być całkowicie dowolne (z całego zakresu ASCII), dlatego też
należy sprawdzić wszystkie. W tym celu należy utworzyć drugą tablicę, zawierającą
dwie kolumny: ASCII oraz Ilość. Kolumnę ASCII należy wypełnić liczbami od 0 do
255 (zakres ASCII), a kolumnę Ilość wypełnić ją zerami. Należy założyć też zbiór
znaków, które występują najczęściej; zwykle zakłada się wszystkie widzialne znaki
(spacja, duże i małe litery, cyfry).
Uwaga. Zbiór ten można zmienić (np ograniczyć tylko do występujących najczęściej
znaków – ‘ ‘, ‘a’, ‘e’, ‘t’, ‘s’). Zbiór ten ma znaczący wpływ na efekty poszukiwania
znaków klucza, dlatego należy dobrać go empirycznie.
6. Przystąpić do wyznaczania samego klucza. W tym celu należy z odpowiednim
przesunięciem (równym długości klucza) dokonywać operacji XOR na znakach
kryptogramu i wszystkich możliwych znakach kodu ASCII, symbolizujących literę
klucza. Na przykład dla klucza o długości 10 szukając pierwszego znaku
przetwarzamy co 10 znak kryptogramu (znaki nr 1, 11, 21 itd) sumując każdy
przetwarzany znak kryptogramu modulo 2 z kolejnymi kodami ASCII. Jeśli wynik
operacji należy do założonego zbioru znaków, należy zwiększyć o 1 wartość w tablicy
-2-
w kolumnie Indeks, dla której wartość w kolumnie ASCII odpowiada drugiemu
czynnikowi operacji XOR, czyli znakowi klucza.
Przykład.
Rozważmy kryptogram XOR w następującej postaci (podano kody ASCII znaków w formie
heksadecymalnej):
1
2
3
4
5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
25
42
19
00
16
0D
1B
0D
09
0E
43
0E
03
0C
14
1B
10
0E
0C
6F
03
4E
00
0B
69
10
04
0C
17
1B
0F
0A
04
1B
43
00
05
05
08
42
0C
13
42
17
41
0D
13
04
03
14
13
05
0F
00
0D
0C
06
0C
01
41
0D
0A
18
18
11
00
42
0D
18
Tekst ma długość 69 bajtów.
Tworzymy tablicę przesunięć i wypełniamy ją – np są trzy pary identycznych znaków dla
przesunięcia o 1 znak: 1B w pierwszej linii, pozycje 7 i 8; 13 w drugiej linii, pozycje 11 i 12;
0C w czwartej linii, pozycje 3 i 4. Podobnie są trzy pary dla przesunięcia o 3 znaki: 1B w
pierwszej linii na pozycjach 4 i 7; 0 w pierwszej linii na pozycjach 13 i 16; 0 w trzeciej linii
na pozycjach 5 i 8.
Przesunięcie
Ilość
1
3
2
0
3
3
4
1
5
2
6
3
7
2
8
0
9
5
10
1
11
1
12
6
Sortujemy tablicę:
Przesunięcie
12
9
1
3
6
5
7
4
10
Ilość
6
5
3
3
3
2
2
1
1
-3-
11
2
8
1
0
0
Na podstawie tabeli posortowanej można ustalić długość klucza. Pierwsze trzy przesunięcia to
12, 9 i 1, a NWD(12,9,1) = 1. Jednak biorąc tylko dwa przesunięcia, otrzymujemy wynik 3
(NWD(12,9) = 3) i powinniśmy wziąć pod uwagę właśnie to rozwiązanie, zwłaszcza, że dalej
w tabeli są wartości będące wielokrotnościami 3 – 3 i 6.
Zakładamy zatem, że klucz ma 3 znaki.
Szukamy pierwszej litery klucza. Wiedząc, że klucz ma trzy znaki, pierwsza litera klucza była
użyta do szyfrowania znaku nr 1, 4, 7, 10 itd. – i tylko te znaki będziemy badać. Szukając
drugiej litery klucza, badamy znaki nr 2, 5, 8, 11 itd. Dla kolejnych – analogicznie.
Tworzymy drugą tablicę, zawierającą kody ASCII (szesnastkowo) i częstości wystąpień
(dziesiętnie) i wypełniamy ją, szukając pierwszej litery klucza. Wypełniamy następująco:
wiersze Ax oznaczają kody ASCII, a wiersze Ix ilość znaków, stanowiących wynik operacji
XOR znaku kryptogramu z kolejnymi możliwymi znakami, które mogą wystąpić w kluczu
(od 0 do 255).
A0 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0
0
0
0
0
0
0
0
0
0
I0
0
0
0
0
0
1
A1 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
I1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
A2 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
I2
0
0
0
0
0
0
0
0
0
0
0
3
2
1
1
1
A3 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
I3
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
A4 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
I4
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
A5 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
I5
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
A6 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
I6
0
0
0
0
0
1
6
1
5
3
1
2
4
1
1
5
A7 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
I7
0
0
0
2
1
1
3
4
2
3
1
2
2
1
2
1
A8 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
I8
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
A9 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
I9
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
A10 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
I10 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
A11 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
I11 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
A12 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
I12 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
A13 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
I13 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
A14 E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
-4-
I14 0
A15 F0
I15 0
0
F1
0
0
F2
0
0
F3
0
0
F4
0
0
F5
0
0
F6
0
0
F7
0
0
F8
0
0
F9
0
0
FA
0
0
FB
0
0
FC
0
0
FD
0
0
FE
0
0
FF
0
W wypełnionej tabeli zaznaczone pogrubieniem i na czerwono są wszystkie elementy
niezerowe. Szukamy maksimum – jest w wierszu I6 i zostało już zaznaczone na zielono.
Odpowiadający maksimum kod ASCII to 61, co oznacza literę ‘a’.
W ten sposób wyznaczona została pierwsza litera klucza. Należy analogicznie kontynuować
wyznaczanie kolejnych znaków klucza, pamiętając tylko o wyczyszczeniu używanej tablicy
(wyzerowaniu kolumny Ilość).
Zadania.
1. Dokonać implementacji programu łamiącego XOR. Założyć, że program ma operować
tylko na kryptogramach tekstów jawnych będących tekstami w języku polskim lub
angielskim. Program powinien obsługiwać pliki (o dowolnej wielkości) i dokonywać
operacji deszyfrowania po znalezieniu klucza. Klucz po jego znalezieniu powinien być
wyświetlony na ekranie.
2. Znaleźć klucz oraz podać tekst jawny dla opisywanego w przykładzie kryptogramu.
-5-

Podobne dokumenty