Implementacja algorytmu szyfrującego serpent w
Transkrypt
Implementacja algorytmu szyfrującego serpent w
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 128 bitowych bloków. Na wyjściu układu pojawiają się zaszyfrowane dane jako 128 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 32 -bitowych bloków z których rekurencyjnie otrzymujemy 132 wartości ki. Wartości te są transformowane przez tablice przejść zwane S-Boxami a następnie scalane w 33 wektory Ki 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 K33. Deszyfrowanie polega na operacji XOR bloku z kluczem Ki. Następnie każda z 32 pozostałych rund przebiega na podaniu danych na wejście S-Box-1 potem stosujemy klucz Ki 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 R1 - rejestr wejściowy 128 bits R2 1 bit M6 Do modułu szyfrowania 128 XOR 10 M14 128 Hold – 0 Load – 1 128 R 9 – bufor przed Sx 128 bits 32 Hold – 00 ++ – 01 Reset – 10 128 0123 M 15 01234567 M16 C 6 – licz. Mod_8 32 Klucz Ki 32 S0-1 S1-1 S2-1 S3-1 S4-1 S5-1 S6-1 S7-1 32 01234567 M17 32 0123 M18 128 128 32 Hold – 0 Load – 1 R 10A – bufor po Sx 32 R 10B – bufor po Sx 32 R 10C – bufor po Sx 32 R 10D – bufor po Sx 32 128 XOR 10 M19 5 C 5 – licz. rundy Hold – 00 ++ – 01 Reset – 10 128 Linear Transformation-1 128 Hold – 0 Load – 1 R8 -rejestr wyjściowy 128 bits 5 5. Interfejs układu Wejścia i wyjścia układu oraz ich krótka charakterystyka: Nazwa data_in key task start clk rst data_out ready data_valid Typ In In In In In In Out Out Out Szerokość 128 256 1 1 1 1 128 1 1 IN / OUT Opis Szyna danych wejściowych Szyna wejściowa klucza Sygnał sterujący - szyfrowanie / deszyfrowanie Sygnał sterujący uruchamiający układ Sygnał zegara Reset asynchroniczny Szyna danych wyjściowych Sygnał sterujący – informuje o gotowości układu Sygnał sterujący – inf. o gotowych danych na wyjściu • data_in - szyna wejściowa, na którą są podawane kolejne paczki 128 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 128 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