Szyfrowanie DES

     Obecnie stosowane szyfry symetryczne są zdecydowanie bardziej skomplikowanej niż te opisane w poprzednim artykule (niż np. szyfr Cezara). Szyfrowaniem nie zajmują się już ludzie, lecz komputery. Dlatego też najważniejsza zmiana jaka nastąpiła w momencie zastosowania maszyn liczących do szyfrowania, jest zmiana obiektu szyfrowania. Człowiek szyfrował znaki (które składały się na słowa). Komputer pracuje w systemie binarnym. Dla niego są tylko dwa stany „0” i „1”. Komputer umie tylko wykonywać operacje matematyczne na „0” i „1” ale za to robi to bardzo szybko. W procesie szyfrowania komputery operują na bitach. Wśród wielu szyfrów symetrycznych obecnie stosowanych należy wymienić algorytm DES. Standard szyfrowania danych zaakceptowany w roku 1977 przez Narodowe Biuro Standardów (National Bureau of Standards), stosowany do szyfrowania informacji “nie utajnionej, ale ważnej”. Szczegółowy opis algorytmu DES został opublikowany. Dzięki temu algorytm DES prawdopodobnie nie zawiera tzw. ukrytych drzwi (tak określa celowo zostawione przez autoró algorytmu luki, pozwalające na częściowe lub całkowite złamanie tego szyfru).

Poglądowo algorytm szyfrowania danych wygląda następująco: na początku tekst jawny, który ma zostać zaszyfrowany, dzielony jest na 64-bitowe bloki (co odpowiada 8 znakom 8-bitowego kodu ASCII). Blok 64-bitowy poddawany jest permutacji wstępnej. Potem dzielony jest na dwa podciągi 32-bitowe. Następnie wykonywanych jest 16 cykli jednakowych operacji, nazywanych funkcjami f  (funkcjami Feistela). Po szesnastym cyklu lewa i prawa strona są łączone i poddawane permutacji końcowej. Poniżej opisałem szczegółowo każdy z  etapów szyfrowania.

Permutacja początkowa

Bity stanowiące blok danych wejściowych poddawane są procesowi zamiany miejsc według permutacji początkowej, określonej jako IP . Nie będę tutaj prezentował tabeli transpozycji IP. Można ją znaleźć praktycznie w każdym podręczniku dotyczącym kryptologii. Dość jednak powiedzieć, że w wyniku tego procesu otrzymujemy 64-bitowy blok, w którym zgodnie z tablicą transpozycji IP np. pierwszy bit jest 58 bitem bloku wejściowego, bit 2 jest 50 bitem bloku wejściowego.

Podział na części

Blok otrzymany w wyniku permutacji początkowej IP jest następnie dzielony na część lewą i prawą (po 32 bity każda). Oznaczamy je jako L i R.

Iteracja funkcji f

Następuje teraz 16 rund identycznych operacji opisanych funkcją f, w czasie których blok prawy R jest przekształcany przy wykorzystaniu klucza. Pojedyncza iteracja wygląda tak: Blok Ri jest rozszerzany za pomocą permutacji rozszerzającej do bloku 48-bitowego. Jednocześnie następuje obróbka klucza. Ponieważ klucz jest 64-bitowy, redukowany jest do klucza 56 bitów przez pominięcie co ósmego bitu parzystości. Tak przygotowany ciąg bitów poddawany jest permutacji wejściowej , po czym dzielony jest na dwa podciągi 28-bitowe. Następnie połowy te przesuwane są w lewo o jeden lub dwa bity, zależnie od numeru cyklu. Następnie w wyniku permutacji kompresującej powstaje klucz 48-bitowy Ki (stanowi klucz i-ej iteracji Ki). Teraz blok Ri sumowana jest modulo 2 z stworzonym właśnie 48-bitowym kluczem  Ki. Po tej operacji otrzymany ciąg dzielony jest na 8 części po 6-bitów każda i wprowadzany do skrzynek S-bloków, gdzie z 6-bitowych podciągów na wyjściu otrzymujemy 4-bitowe  podciągi, które łączymy ze sobą. Nowo powstały ciąg jest na wyjściu poddany permutacji i otrzymujemy zaszyfrowany ciąg 32-bitowy. Blok sumowany modulo 2 z lewą połówką bloku wejściowego. Tak zmieniony blok staje się nową prawą połową, poprzednia prawa połowa staje się natomiast lewą połową – cykl dobiega końca.

Po wykonaniu 16 cykli operacji lewa i prawa połowa danych jest łączona za pomocą operacji XOR.

Warto tu jeszcze wyjaśnić jak dochodzi do zamiany bloków 6-bitowyn na 4-bitowe w skrzynkach zwanych S-blokami. Jest 8 S-bloków. Każdy z nich inny. S-bloki można sobie wyobrazić jako tablice o 4 wierszach i 16 kolumnach. Element tabeli to 4-bitowe liczby. Wybór wiersza i kolumny tabeli wygląda następująco. Dzieli się 6-bitowe ciągi wejściowe w ten sposób, że pierwszy i ostatni bit ciągu tworzy liczbę 2-bitową, która wybiera wiersz (na 2 bitach można zakodować liczbę 0..3). Pozostałe (środkowe 4-bity) bity tworzy liczbę, która wybiera kolumnę. Wskazany element tabeli jest podawany jako wynik podstawienia (4-bitowy).

Permutacja końcowa

W ostatnim kroku algorytmu 64-bitowy blok poddawany jest permutacji końcowej IP-1, stanowiącej odwrotność transformacji początkowej IP.

Implementacja algorytmu DES może być zrealizowana zarówno programowo jaki i sprzętowo. Opracowanie programu szyfrującego DES (można to zrobić praktycznie w dowolnym języku programowania np. C) zajmuje trochę czasu, a efekt pracy jest z reguły … niezbyt zadawalający. Okazuje się bowiem, że zaszyfrowanie pojedynczego pliku 5MB (np. zdjęcia) jest bardzo szybkie, ale zaszyfrowanie archiwum o pojemności 10GB już jest bardzo czasochłonne. Dlatego też algorytm DES implementuje się sprzętowo. Można to zrobić na bazie procesora TMS320. Wymaga to oczywiście odpowiedniego zaprogramowania procesora, ale efekt jest zdecydowanie lepszy. Taki układ scalony jest w stanie  szyfrować z szybkością rzędu GB/sek. Najbardziej jednak bezpieczną implementacją algorytmu DES jest budowa dedykowanego układu scalonego. Takie układy stasuje się w praktyce. Implementacje sprzętowe są nie tylko szybsze ale i bezpieczniejsze niż programowe. Do systemu z dedykowanym układem scalonym trudniej się bowiem włamać (i zmienić algorytm szyfrujący) niż do komputera z oprogramowaniem realizującym szyfrowanie DES.