Warszawa 25.01.2008 Piotr Bratkowski 4T2 Przemysław Tytro 4T2 Dokumentacja projektu Układy Cyfrowe Implementacja algorytmu szyfrującego serpent w układzie FPGA
1. Cele projektu Celem projektu jest implementacja algorytmu szyfrującego Serpent w układzie mikroprogramowalnym FPGA. Układ ma za zadanie szyfrować i deszyfrować dane pojawiające się na szynie wejściowej przy użyciu 256 bitowego klucza podawanego na szynę klucza. Dane powinny być podawane w postaci bitowych bloków. Na wyjściu układu pojawiają się zaszyfrowane dane jako bitowe bloki. W układzie stosujemy model szyfrowania ECB, ale układ jest tak skonstruowany, że można go użyć jako moduł systemu szyfrującego metodą CBC. 2. Analiza zagadnienia Algorytm Serpent pozwala jednocześnie albo na szyfrowanie albo deszyfrowanie danych. Serpent jest jednym z finalistów konkursu na algorytm AES. Jest algorytmem bardzo bezpiecznym, ale skomplikowanym i wymagającym dużych zasobów sprzętowych, m.in. w odróżnieniu od wielu innych algorytmów blok szyfrujący i deszyfrujący nie posiadają żadnych wspólnych modułów i muszą być całkowicie odrębnymi elementami w układzie. 3. Opis algorytmu Serpent jest algorytmem szyfrującym o 256 bitowym kluczu. Klucz może być dowolnej długości jednak musi być przesłany w postaci 256 bitowej liczby. Następnie jest ona dzielona na osiem -bitowych bloków z których rekurencyjnie otrzymujemy 1 wartości k i. Wartości te są transformowane przez tablice przejść zwane S-Boxami a następnie scalane w 33 wektory K i z których każdy stanowi klucz dla pojedynczej rundy szyfrowania/deszyfrowanie. Runda szyfrowania składa się z operacji XOR danych z kluczem, następnie przejścia przez tablice S-Box oraz transformacji linearnej. Ostania faza to operacja XOR danych z kluczem K 33. Deszyfrowanie polega na operacji XOR bloku z kluczem K i. Następnie każda z pozostałych rund przebiega na podaniu danych na wejście S-Box potem stosujemy klucz K i oraz odwrotna transformacje linearna. 4. Budowa układu Układ składa się z trzech bloków obliczający klucz, szyfrujący i deszyfrujący, których schematy znajdują się poniżej. Zaszyfrowane dane pojawiają się na wyjściu układu po 272 cyklach zegara od momentu podania ich na wejście. Przy f = 130 Mhz jakie można uzyskać wykorzystując układ Cyclon II czas obliczeń wynosi 1,78 us. Uzyskujemy dzięki temu przepływność na poziomie ok. 61 Mbps 2
3
4
Deszyfrowanie Do modułu szyfrowania R1 - rejestr wejściowy bits M6 R 2 1 bit XOR 10 M14 Hold 0 Load 1 R 9 bufor przed S x 0123 M 15 bits Hold 00 ++ 01 Reset 10 C 6 licz. Mod_8 01234567 M16 Klucz Ki S 0 S 1 S 2 S 3 S 4 S 5 S 6 S 7 01234567 M17 0123 M18 Hold 0 Load 1 R 10A bufor po S x R 10B bufor po S x R 10C bufor po S x R 10D bufor po S x XOR 10 M19 5 C 5 licz. rundy Hold 00 ++ 01 Reset 10 Linear Transformation Hold 0 Load 1 R8 -rejestr wyjściowy bits 5
5. Interfejs układu Wejścia i wyjścia układu oraz ich krótka charakterystyka: IN / OUT Nazwa Typ Szerokość Opis data_in In Szyna danych wejściowych key In 256 Szyna wejściowa klucza task In 1 Sygnał sterujący - szyfrowanie / deszyfrowanie start In 1 Sygnał sterujący uruchamiający układ clk In 1 Sygnał zegara rst In 1 Reset asynchroniczny data_out Out Szyna danych wyjściowych ready Out 1 Sygnał sterujący informuje o gotowości układu data_valid Out 1 Sygnał sterujący inf. o gotowych danych na wyjściu data_in - szyna wejściowa, na którą są podawane kolejne paczki bitowych danych do zaszyfrowania/odszyfrowania key szyna, na którą w tym samym czasie co dane musi być podany klucz użyty do zaszyfrowania/odszyfrowania danych task sygnał, który steruje czy dane są szyfrowane czy deszyfrowane. Gdy 0 szyfrowanie, gdy 1 deszyfrowanie. start - sygnał, na którym po pojawieniu się 1 układ pobiera dane z szyn wejściowych i zaczyna proces szyfrowania/deszyfrowania rst reset asynchroniczny data_out szyna wyjściowa na którą są podawane kolejne paczki bitów po zaszyfrowaniu/deszyfrowaniu ready - sygnał sterujący informujący, że układ jest gotowy do pracy i znajduje się w stanie spoczynku gdy na wyjściu jest 1 data_valid - sygnał sterujący informujący, że na szynie wyjściowej pojawiła się nowa paczka danych zaszyfrowany/deszyfrowanych. 6. Sterowanie układem Sterowanie układem polega na podaniu odpowiednich danych i sygnałów sterujących na wejście w jednym cyklu zegara i oczekiwanie, aż układ wykona obliczenia i poinformuje o ich zakończeniu. Po uruchomieniu, wykonaniu resetu rst = 1 lub zaszyfrowaniu/odszyfrowaniu paczki danych układ znajduje się w stanie spoczynku i oczekuje na dane wejściowe co jest sygnalizowane sygnałem ready = 1. Tylko w takiej sytuacji można podać na wejście nowe dane. Gdy powyższy warunek jest spełniony należy podać jednocześnie paczkę danych na wejście data_in klucz na wejście key oraz rodzaj zadania szyfrowanie/deszyfrowanie na wejście task. Gdy zostanie podany sygnał start = 1 podczas najbliższego narastającego zbocza układ załaduje do rejestrów dane z szyn wejściowych i rozpocznie obliczenia. Aby podać kolejną porcje danych należy czekać, aż ready = 1. Gdy układ zakończy szyfrowanie/deszyfrowanie paczki danych pojawia się ona na szynie wyjściowej data_out i jest to sygnalizowane przez dwa cykle zegara sygnałem data_valid = 1. Dane na szynie wyjściowej pozostają do pojawienia się kolejnej porcji danych lub wykonania resetu. 6
Przebiegi czasowe: Na powyższym obrazku widzimy poszczególne etapy pracy układu 1. Układ w stanie ready oczekuje na podanie danych i sygnału start 2. Podanie sygnału start, układ zaczyna szyfrowanie, ponieważ task = 0. Koniec stanu oczekiwania dlatego task zmienia się na stan niski. 3. Zmiana sygnału task na wysoki aby podczas następnego podania danych układ deszyfrował 4. Informacja o gotowych danych na rejestrze wyjściowym data_valid = 1 oraz ten rejestr z danymi. 5. Informacja o zakończeniu szyfrowania i przejściu w stan oczekiwania na nowe dane. 6. Podanie sygnału start i rozpoczęcie deszyfrowania, ponieważ task jest w stanie wysokim. 7. Informacja o gotowych danych na rejestrze wyjściowym data_valid = 1 oraz ten rejestr z danymi. 8. Informacja o zakończeniu deszyfrowania i przejściu w stan oczekiwania na nowe dane. 9. Wykonanie resetu rst = 1 10. Wyzerowany rejestr wyjściowy poprzez reset. 7
7. Stany automatów Układem sterują cztery automaty. Automat główny, który steruje pracą automatów: obliczającego klucz, szyfrującego i deszyfrującego. W zależności od zadania automat główny uruchamia równolegle automat obliczający klucz i szyfrujący lub automat obliczający klucz i deszyfrujący. S1 oczekiwanie na nowe dane i start S2 odbiór danych z szyn wejściowych S3 wybór typu zadania na podstawie task o S4 - szyfrowanie (uruchomienie automatów szyfrującego i liczącego klucz) o S5 - deszyfrowanie (uruchomienie automatów deszyfrującego i liczącego klucz) S6 oczekiwanie na zakończenie szyfrowania/deszyfrowania przez automaty S7 wysłanie informacji na wyjście o gotowych danych (data_valid = 1) S8 gotowe dane na rejestrze wyjściowym do odebrania 8. Wyniki syntezy Synteza została przeprowadzona dla układu Cyclone II EP2C35F672C6 Wyniki syntezy dla różnych metod optymalizacji przy kodowaniu automatów stanów metodą One-Hot: Typ optymalizacji Total Logic Elements Clock f-max Speed 3 798 134,08 MHz Balanced 3 351 125,66 MHz Area 3 351 125,66 MHz Wyniki syntezy dla metody optymalizacji Balanced oraz różnych metod kodowania automatów stanów: Kodowanie stanów Total Logic Elements Clock f-max One-Hot 3 351 125,66 MHz Minimal Bits 3 365 130,04 MHz Najlepszym kompromisem pod względem prędkości i liczby zajętych komórek wydaje się być metoda optymalizacja Balanced oraz kodowanie automatów Minimal Bits 8
9. Wnioski W układzie można by zwiększyć prędkość działania poprzez zmniejszenie cykli zegara potrzebnych na zaszyfrowanie/deszyfrowanie paczki danych. Można by to osiągnąć poprzez modyfikacje automatów stanów szyfrującego i deszyfrującego usuwając z nich niektóre stany i wykonując więcej operacji równolegle. Wymagało by to jednak pewnych modyfikacji w zasadzie działania całego układu. Kolejną modyfikacją mogło by być zaimplementowanie szyfrowania metodą CBC, która jest dużo bezpieczniejszą wersją od ECB. Wymagało by to dorobienia nadrzędnego elementu który sterował by przepływem kolejnych paczek danych. Na pewno zwiększyło by to w znacznym stopniu liczbę wymaganych komórek logicznych. 10. Bibliografia Dr. Mariusz Rawski Wykłady UCYF Prof. Tadeusz Łuba,,,Synteza układów logicznych, Oficyna Wydawnicza Politechniki Warszawskiej, 2005 Prof. Tadeusz Łuba, Synteza układów cyfrowych, WKiŁ, 2003 Marek Zwoliński, Projektowanie układów cyfrowych z wykorzystaniem języka VHDL WKiŁ, 2002 Oficjalna strona algorytmu Serpent, http://www.cl.cam.ac.uk/~rja14/serpent.html Piotr Bora, Tomasz Czajka, Implementation of the Serpent algorithm using Altera FPGA devices Wikipedia, Block cipher modes of operation, http://en.wikipedia.org/wiki/block_cipher_modes_of_operation#electronic_codebook_.28ecb.29 9