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