Iteracyjna realizacja algorytmu DES – VHDL
Transkrypt
Iteracyjna realizacja algorytmu DES – VHDL
CAD Projektowanie układów kryptograficznych Mariusz Rawski [email protected] http://rawski.zpt.tele.pw.edu.pl/ Kryptografia • Kryptografia to dziedzina nauki, zajmująca się przekształcaniem informacji zwanej tekstem jawnym (plaintext) w informację zaszyfrowaną zwaną szyfrogramem (ciphertext) przy wykorzystaniu klucza szyfrującego zdefiniowanego przez użytkownika. Przekształcenie musi być dokonane w taki sposób, aby osoba dysponująca szyfrogramem nie mogła, bez znajomości klucza szyfrującego, odtworzyć tekstu jawnego w „rozsądnym” czasie. Algorytmy, które dokonują takiego przekształcenia nazywane są szyframi lub algorytmami kryptograficznymi. • Większość algorytmów kryptograficznych wykorzystywanych dzisiaj to algorytmy blokowe, które charakteryzują się tym, że jednorazowo przekształcają fragment (blok) tekstu jawnego. Dla porównania algorytmy strumieniowe przekształcają dane o różnej długości. Szyfry strumieniowe mogą być postrzegane jako generatory pseudolosowe z ziarnem (seed), który stanowi klucz szyfrujący. Pseudolosowe liczby generowane przez taki generator są poddawane operacji XOR (sumy modulo 2) z teksem jawnym tworząc szyfrogram • Algorytmy kryptograficzne charakteryzują się zazwyczaj dużą złożonością obliczeniową. Z tego powodu najbardziej efektywne realizacje takich algorytmów to realizacje sprzętowe. Algorytmy blokowe najczęściej są bardziej złożone od algorytmów strumieniowych zarówno pod względem zasady działania, jak i realizacji. Mariusz Rawski 2 DES • Doskonałym przykładem szyfru blokowego, który ilustruje najbardziej istotne koncepcje wykorzystywane w takich algorytmach jest algorytm DES (Data Encryption Standard). • Algorytm DES został zaprojektowany w latach 1970. przez firmę IBM. W 1976 roku organizacja NIST (National Institute of Standards and Technology) zaaprobowała ten algorytm jako oficjalny standard szyfrowania. Został on zaprojektowany pod kontem realizacji sprzętowych, dlatego też realizowany programowo jest bardzo niewydajny. Wraz z upływem czasu algorytm ten stawał się coraz mniej odporny na kryptoanalizę różnicową co spowodowane było nieustannie zwiększającą się możliwością obliczeniową komputerów. • W 1997 roku organizacja RSA Security ogłosiła konkurs na złamanie szyfru DES. Konkurs ten wygrał projekt DESCHALL wykorzystując tysiące komputerów połączonych siecią Internet. Czas potrzebny do złamania algorytmu wynosił kilka miesięcy. Rok później organizacja Electronic Frontier Foundation zaprezentowała urządzenie o nazwie „Deep Crack”. Dzięki wykorzystaniu 1800 układów specjalnie zaprojektowanych w technologii full custom urządzenie to pozwalało złamać algorytm DES w mniej niż 3 dni. Inne rozwiązanie o nazwie COPACOBANA zaproponowane przez zespoły z uniwersytetów Bochum i Kiel zbudowane zostało z wykorzystaniem 120 układów FPGA Spartan3-1000 firmy Xilinx. Średni czas złamania szyfru DES z wykorzystaniem tego urządzenia wynosi ok. 6 dni. W 2001, po zakończeniu międzynarodowego konkursu, organizacja NIST zastąpiła szyfr DES nowym algorytmem AES (Advanced Encryption Standard). Mariusz Rawski 3 Algorytm DES (1) • DES (Data Encryption Standard) - jest szyfrem blokowym, o algorytmie ogólnie znanym. • Dane są szyfrowane blokami o długości 64 bitów (odpowiada to 8 literom ASCII, każda zaopatrzona w bit parzystości). Blok 64 bitów tekstu jawnego podawany jest jako dane wejściowe algorytmu, wynikiem działania algorytmu jest blok 64 bitów szyfrogramu. • Zarówno podczas szyfrowania, jak i deszyfrowania wykorzystuje się ten sam algorytm (za wyjątkiem różnic w operowaniu kluczem). • Klucz ma długość 56 bitów. Zwykle klucz jest liczbą zapisaną za pomocą 64 bitów, przy czym każdy co ósmy bit jest bitem parzystości, który jest pomijany (tak jest, gdy klucz jest ciągiem ośmiu znaków alfabetu ASCII). • Kluczem może być dowolna liczba o długości 56 bitów, która może być zmieniona w dowolnej chwili. Mariusz Rawski 4 Algorytm DES (2) • Działanie algorytmu opiera się na kombinacji dwóch podstawowych technik szyfrowania: mieszania i rozpraszania. • Podstawowy blok, z którego jest zbudowany DES stanowi pojedynczą kombinację tych technik (podstawienie, za którym następuje permutacja) działającą z udziałem klucza. • Ciąg tych działań nazywany jest rundą. Szyfrowanie i deszyfrowanie za wykorzystaniem algorytmu DES składa się z 16 rund. • W trakcie każdej rundy dokonywane są te same obliczenia na wynikach z poprzedniej rundy i specjalnym podkluczu Ki generowanym z 64-bitowego klucza. • Dodatkowo przed pierwszą i po ostatniej rundzie bity są permutowane w ustalony sposób. • Algorytm wykorzystuje tylko standardową arytmetykę i operacje logiczne na liczbach o długości co najwyżej 64 bitów. Mariusz Rawski 5 Algorytm DES (3) • Po permutacji początkowej IP blok wejściowy (64bitowy blok tekstu jawnego) jest dzielony na lewą i prawą połowę, o długości 32 bitów każda. plain_data key init_perm pc1_perm L0 • • • R0 Następnie wykonywanych jest 16 rund jednakowych operacji, nazywanych funkcjami f, w czasie których dane są łączone z kluczem. Po szesnastym cyklu lewa i prawa połowa są łączone i końcowa permutacja IP-1 będąca odwrotnością permutacji początkowej kończy przebieg algorytmu. Dla każdej rundy generowany jest oddzielny podklucz Ki . Z 64 bitowego klucza głównego K (key) w wyniku permutacji selekcjonującej pc1_perm tworzone są 28 bitowe bloki C i D. Bloki te są przesuwane w lewo o 1 lub 2 bity w zależności od numeru rundy, a następnie przy wykorzystaniu permutacji selekcjonującej pc2_perm jest wybieranych 48 bitów z 56 bitów klucza. f L1 K1 f L2 L15 Kn f L16 R16 shl C1 D2 shl shl C2 D2 shl shl C15 D15 shl shl C16 D16 pc2_perm R15 K16 shl pc2_perm R2 f D0 pc2_perm R1 K2 C0 pc2_perm inv_perm ciphered_data Mariusz Rawski 6 Algorytm DES (4) Mariusz Rawski 7 Algorytm DES (5) • • • • W każdym cyklu bity klucza są przesuwane, a następnie jest wybieranych 48 bitów z 56 bitów klucza. Prawa połowa bloku danych jest rozszerzana do 48 bitów za pomocą permutacji z rozszerzeniem, łączona za pomocą bitowej sumy modulo 2 z 48 bitami przesuniętego i poddanego permutacji klucza. Następnie jest dokonywane podstawienie bloku 32 nowych bitów za pomocą algorytmu podstawiania, a potem jeszcze raz jest dokonywana permutacja. Te cztery operacje tworzą funkcję f. Ciąg wyjściowy funkcji f jest dalej łączony z lewą połową za pomocą bitowej sumy modulo 2. Wynikiem tych operacji jest nowa prawa połowa bloku; stara prawa połowa staje się nową lewą połową. Operacje te są powtarzane 16 razy, tworząc 16 rund algorytmu DES. Mariusz Rawski 8 Runda algorytmu DES • Funkcja opisująca rundę algorytmu DES jest następująca: Ri+1 = Li ⊕ P(S(E(Ri) ⊕ Ki), Li+1 = Ri, gdzie Ri, Li – dane wejściowe rundy, Ri+1, Li+1 – dane wyjściowe rundy, Ki – podklucz Mariusz Rawski 9 Realizacja programowa • Algorytm DES został zaprojektowany z myślą o realizacji sprzętowej. • Realizacje programowe tego algorytmy są często mniej wydajne niż inne algorytmy. • Przekształcenia wykonywane w procesie szyfrowania nie są operacjami typowymi dla procesorów, czy to ogólnego przeznaczenia (general purpose processors) czy to procesorów sygnałowych (signal processors). • Algorytm opiera swe działanie na takich operacjach jak permutacja czy postawienie, które są operacjami manipulacji na bitach. • Efektywna realizacja programowa tego typu przekształceń nie jest prosta. Mariusz Rawski 10 Permutacja – realizacja programowa • W celu zamiany bitów między dwoma słowami danych można wykorzystać makro realizujące tą operację języku C z wykorzystaniem takich operacji bitowych jak przesunięcie, iloczyny i XOR #define DO_PERMUTATION(a, temp, b, offset, mask) temp = ((a>>offset) ^ b) & mask; b ^= temp; a ^= temp<<offset; \ \ \ • Zrealizowanie operacji permutacji wymaga wykonania wielu takich zmian bitów. Można wykorzystać pewne prawidłowości występujące w permutacji do uproszczenia całej realizacji. #define INITIAL_PERMUTATION(left, temp, right) \ DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f) \ DO_PERMUTATION(left, temp, right,16, 0x0000ffff) \ DO_PERMUTATION(right, temp, left, 2, 0x33333333) \ DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff) \ right = (right << 1) | (right >> 31); \ temp = (left ^ right) & 0xaaaaaaaa; \ right ^= temp; \ left ^= temp; \ left = (left << 1) | (left >> 31); Mariusz Rawski 11 Wyniki Programowa realizacja w C skompilowana kompilatorem gcc i uruchomiona na komputerze stacjonarnym wyposażonym w procesor Intel Core2 Quad Q9550 taktowany zegarem 3,4 GHz PC • • PMultiBlock PSingleBlock [Mbit/s] [Mbit/s] 183,91 75,03 Tryb MultiBlock – jednen klucza do szyfrowania wszystkich bloków tekstu jawnego (obliczanie podkluczy następuje tylko raz) Tryb SingleBlock – każdy blok tekstu jawnego szyfrowany innym kluczem. Mariusz Rawski 12 Permutacja początkowa • Permutacja początkowa init_perm dokonuje przestawienia bitów 64 bitowych danych wejściowych według podanej tabeli. 58 50 42 34 26 18 10 2 plain_data key init_perm pc1_perm L0 R0 60 52 44 36 28 20 12 4 62 54 46 38 30 22 14 6 f L1 f L2 K2 R2 Kn shl shl C1 D2 shl shl pc2_perm 1 f D0 pc2_perm R1 64 56 48 40 32 24 16 8 57 49 41 33 25 17 9 K1 C0 C2 D2 shl shl C15 D15 shl shl C16 D16 pc2 perm pc2_perm 59 51 43 35 27 19 11 3 L15 R15 61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7 f L16 R16 K16 pc2_perm inv_perm ciphered_data • Tablica ta opisuje sposób przestawienia kolejnych bitów danych wejściowych. Jeśli bity danych wejściowych oznaczymy indeksami od 1 do 64 to w wektorze wyjściowym na pozycji pierwszej umieszczamy 58 bit danych wejściowych, na drugiej bit 50, a na ostatniej bit 7. Odczytanie tabeli wierszami utworzy 64 bitowy ciąg będący wynikiem transpozycji. Mariusz Rawski 13 Permutacja początkowa – VHDL library ieee; use ieee.std_logic_1164.all; entity init_perm is port( in_data : in std_logic_vector(1 to 64); out_data : out std_logic_vector(1 to 64) ); end; architecture behav of init_perm is begin perm_loop: for i in 0 to 7 generate out_data(i+1) <= in_data(58-8*i); out_data(i+1+8) <= in_data(60-8*i); out_data(i+1+16) <= in_data(62-8*i); out_data(i+1+24) <= in_data(64-8*i); out_data(i+1+32) <= in_data(57-8*i); out_data(i+1+40) <= in_data(59-8*i); out_data(i+1+48) <= in_data(61-8*i); out_data(i+1+56) <= in_data(63-8*i); end generate; end behav; Mariusz Rawski Wykorzystanie struktur języka VHDL do warunkowej generacji kodu ułatwia opis modułu 58 50 42 34 26 18 10 60 52 44 36 28 20 12 62 54 46 38 30 22 14 64 56 48 40 32 24 16 57 49 41 33 25 17 9 59 51 43 35 27 19 11 61 53 45 37 29 21 13 63 55 47 39 31 23 15 2 4 6 8 1 3 5 7 14 Permutacja początkowa – wyniki Fitter Summary W układzie permutacja została zrealizowana bez wykorzystania komórek Top-level Entity Name init_perm Family Stratix Device EP1S10F484C5 Total logic elements 0 / 10,570 ( 0 % ) Total pins 128 / 336 ( 38 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0/6(0%) Total DLLs 0/2(0%) Permutacja to nic innego, jak odpowiednie przestawianie połączeń między wejściem a wyjściem Mariusz Rawski 15 Permutacja końcowa • Na wejście tego bloku podane są dane otrzymane po zakończeniu 16 rundy kodowania. 40 8 48 16 56 24 64 32 plain_data key init_perm pc1_perm L0 39 7 38 6 R0 47 15 55 23 63 31 46 14 54 22 62 30 37 5 45 13 53 21 61 29 36 4 44 12 52 20 60 28 35 3 43 11 51 19 59 27 34 2 42 10 50 18 58 26 f L1 f L2 41 9 K2 L15 Kn shl C1 D2 shl shl C2 D2 shl shl C15 D15 shl shl C16 D16 pc2 perm pc2_perm R15 K16 shl pc2_perm R2 f D0 pc2_perm R1 f 33 1 K1 C0 pc2_perm 49 17 57 25 L16 R16 inv_perm ciphered_data • Część danych L i R zostają zamienione miejscami. Otrzymany w ten sposób blok danych 64 bitowych stanowi zaszyfrowany ciąg danych wejściowych. Mariusz Rawski 16 Permutacja końcowa – VHDL library ieee; use ieee.std_logic_1164.all; entity inv_perm is port( in_data : in std_logic_vector(1 to 64); out_data : out std_logic_vector(1 to 64) ); end; architecture behav of inv_perm is begin perm_loop: for i in 0 to 7 generate out_data(8*i+1) <= in_data(40-i); out_data(8*i+2) <= in_data( 8-i); out_data(8*i+3) <= in_data(48-i); out_data(8*i+4) <= in_data(16-i); out_data(8*i+5) <= in_data(56-i); out_data(8*i+6) <= in_data(24-i); out_data(8*i+7) <= in_data(64-i); out_data(8*i+8) <= in_data(32-i); end generate; end behav; Mariusz Rawski Wykorzystanie struktur języka VHDL do warunkowej generacji kodu ułatwia opis modułu 40 39 38 37 36 35 34 33 8 7 6 5 4 3 2 1 48 47 46 45 44 43 42 41 16 15 14 13 12 11 10 9 56 55 54 53 52 51 50 49 24 23 22 21 20 19 18 17 64 63 62 61 60 59 58 57 32 31 30 29 28 27 26 25 17 Permutacja końcowa – wyniki Fitter Summary Top-level Entity Name inv_perm Family Stratix Device EP1S10F484C5 Total logic elements 0 / 10,570 ( 0 % ) Total pins 128 / 336 ( 38 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0/6(0%) Total DLLs 0/2(0%) Dokładnie taka sama sytuacja, jak w przypadku permutacji początkowej Mariusz Rawski 18 Permutacja rozszerzająca • Permutacja rozszerzająca dokonuje przestawienia bitów w 32 bitowym bloku danych wejściowych z jednoczesnym powieleniem niektórych bitów wejściowych tak, aby uzyskać 48 bitowe dane wyjściowe. Jest to konieczne, aby można było wykonać operację xor z 48 bitowym podkluczem. 32 1 2 3 4 5 4 5 6 7 8 9 8 9 10 11 12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25 24 25 26 27 28 29 28 29 30 31 32 1 Mariusz Rawski 19 Permutacja rozszerzająca – VHDL library ieee; use ieee.std_logic_1164.all; entity ext_perm is port( in_data : in std_logic_vector(1 to 32); out_data : out std_logic_vector(1 to 48) ); end; architecture behav of ext_perm is begin out_data <= in_data(32) & in_data(1 to 5) & in_data(4 to 9) & in_data(8 to 13) & in_data(12 to 17) & in_data(16 to 21) & in_data(20 to 25) & in_data(24 to 29) & in_data(28 to 32) & in_data(1); end behav; Mariusz Rawski W tym przypadku nie można znaleźć żadnej prawidłowości, więc permutacja jest zapisana kolejne podstawienie bitów 32 4 8 12 16 20 24 28 1 5 9 13 17 21 25 29 2 6 10 14 18 22 26 30 3 7 11 15 19 23 27 31 4 8 12 16 20 24 28 32 5 9 13 17 21 25 29 1 20 Permutacja końcowa – wyniki Fitter Summary Top-level Entity Name ext_perm Family Stratix Device EP1S10F484C5 Total logic elements 0 / 10,570 ( 0 % ) Total pins 80 / 336 ( 24 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0/6(0%) Total DLLs 0/2(0%) Dokładnie taka sama sytuacja, jak w przypadku permutacji początkowej Mariusz Rawski 21 Skrzynki podstawieniowe • Każdy blok S-box reprezentuje funkcję dokonującą przekodowania 6 bitowego wektora wejściowego na wektor 4 bitowy. Przekodowanie dokonywane jest zgodnie z zasada przedstawioną w postaci tablicy . S1 14 4 13 1 2 15 11 8 0 15 4 • 7 4 14 2 13 1 10 1 14 8 13 6 15 12 3 10 8 2 4 9 6 12 5 9 0 7 6 12 11 9 5 3 8 3 10 5 0 2 11 15 12 9 1 7 3 5 11 7 14 10 0 6 13 Przy użyciu 8 bloków selekcyjnych wektor 48 bitowy otrzymany przez zastosowanie permutacji rozszerzającej do 32 bitowego wektora wejściowego R rundy przekształcany jest na powrót w wektor 32 bitowy. Mariusz Rawski 22 Skrzynki podstawieniowe – VHDL library ieee; use ieee.std_logic_1164.all; entity s1 is port( in_data : in std_logic_vector(1 to 6); out_data : out std_logic_vector(1 to 4) ); end; architecture behav of s1 is signal internl_in : std_logic_vector(1 to 6); begin internl_in <= (in_data(1) & in_data(6) & in_data(2) & in_data(3) & in_data(4) & in_data(5)); with internl_in select out_data <= "1110" when "000000" , "0100" when "000001" , "1101" when "000010" , ...................... "1000" when "000111" , ...................... "0110" when "111110" , "1101" when "111111" , "----" when others; end behav; Mariusz Rawski Bit 1 i 6 określają pozostałe kolumny 000 wiersz 0111 S1 14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7 00 0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8 4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0 15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13 23 Skrzynki podstawieniowe – wyniki Fitter Summary Top-level Entity Name s1 Family Stratix Device EP1S10F484C5 Total logic elements 24 / 10,570 ( < 1 % ) Total pins 10 / 336 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0/6(0%) Total DLLs 0/2(0%) Jeden S-box zajmuje aż tyle komórek… wprowadza też duże opóźnienie. S1 S2 S3 S4 S5 S6 S7 S8 Liczba komórek 24 22 24 24 24 23 23 24 Max. opóźnienie 13,5 13,1 13,0 14,0 12,9 13,1 13,0 13,3 Mariusz Rawski 24 Permutacji P • Dokonuje permutacji na kolejno zestawionych wyjściach z S-boksów wg następującego schematu 16 7 20 21 29 12 28 17 1 15 23 26 5 18 31 10 2 8 24 14 32 27 3 9 19 13 30 6 22 11 • 4 25 Wynik permutacji P jest sumowany bitowo modulo 2 z częścią L początkowego bloku 64-bitowego i tak stworzony blok 32-bitowy podawany jest jako część R dla rundy następnej. Mariusz Rawski 25 Permutacji P – VHDL library ieee; use ieee.std_logic_1164.all; entity p_perm is port( in_data : in std_logic_vector(1 to 32); out_data : out std_logic_vector(1 to 32) ); end; architecture behav of p_perm is begin out_data <= in_data(16) & in_data(7) & in_data(20) & in_data(21) & in_data(29) & in_data(12) & in_data(28) & in_data(17) & in_data(1) & in_data(15) & in_data(23) & in_data(26) & in_data(5) & in_data(18) & in_data(31) & in_data(10) & in_data(2) & in_data(8) & in_data(24) & in_data(14) & in_data(32) & in_data(27) & in_data(3) & in_data(9) & in_data(19) & in_data(13) & in_data(30) & in_data(6) & in_data(22) & in_data(11) & in_data(4) & in_data(25); end behav; Mariusz Rawski W tym przypadku nie można znaleźć żadnej prawidłowości, więc permutacja jest zapisana kolejne podstawienie bitów 16 7 20 21 29 12 28 17 1 15 23 26 5 18 31 10 2 8 24 14 32 27 3 9 19 13 30 6 22 11 4 25 26 Permutacji PC-1 • Blok ten dokonuje permutacji 64 bitowego bloku klucza. W wyniku otrzymuje się 56 bitowy blok, który dzielony jest na 28 bitowe bliki C i D plain_data key init_perm pc1_perm L0 R0 f 57 49 41 33 25 17 2 59 51 43 35 27 f L2 f L15 f L16 21 13 Mariusz Rawski 5 28 20 12 shl 4 Kn R16 K16 C1 D2 shl shl pc2_perm C2 D2 shl shl C15 D15 shl shl C16 D16 pc2_perm R15 7 62 54 46 38 30 22 6 61 53 45 37 29 K2 R2 3 60 52 44 36 63 55 47 39 31 23 15 14 shl pc2_perm R1 1 58 50 42 34 26 18 19 11 D0 9 L1 10 K1 C0 pc2_perm inv_perm ciphered_data 27 Permutacji PC-1 – VHDL library ieee; use ieee.std_logic_1164.all; entity pc1_perm is port( in_data : in std_logic_vector(1 to out_data : out std_logic_vector(1 to ); end; architecture behav of pc1_perm is begin out_data <= in_data(57) & in_data(49) in_data(25) & in_data(17) in_data(58) & in_data(50) in_data(26) & in_data(18) in_data(59) & in_data(51) in_data(27) & in_data(19) in_data(60) & in_data(52) in_data(63) & in_data(55) in_data(31) & in_data(23) in_data(62) & in_data(54) in_data(30) & in_data(22) in_data(61) & in_data(53) in_data(29) & in_data(21) in_data(28) & in_data(20) end behav; Mariusz Rawski 64); 56) & & & & & & & & & & & & & & in_data(41) in_data(9) in_data(42) in_data(10) in_data(43) in_data(11) in_data(44) in_data(47) in_data(15) in_data(46) in_data(14) in_data(45) in_data(13) in_data(12) & & & & & & & & & & & & & & in_data(33) in_data(1) in_data(34) in_data(2) in_data(35) in_data(3) in_data(36) in_data(39) in_data(7) in_data(38) in_data(6) in_data(37) in_data(5) in_data(4); & & & & & & & & & & & & & 28 Permutacji PC-2 • Blok ten dokonuje permutacji 58 bitowego bloku powstałego w wyniku przesunięcia w lewo blików C i D. W wyniku otrzymuje się 48 blok, który stanowi podklucz dla danej rundy. 14 17 11 24 1 5 plain_data key init_perm pc1_perm L0 R0 f 3 28 15 16 D0 shl C1 D2 shl shl C2 D2 shl shl C15 D15 shl shl C16 D16 pc2_perm 6 21 10 L1 23 19 12 K1 C0 shl 4 26 7 27 20 13 R1 8 2 f L2 f L15 Kn pc2_perm R15 f 44 49 39 56 34 53 46 42 50 36 29 32 pc2_perm R2 41 52 31 37 47 55 30 40 51 45 33 48 K2 L16 R16 K16 pc2_perm inv_perm ciphered_data Mariusz Rawski 29 Permutacji PC-2 – VHDL library ieee; use ieee.std_logic_1164.all; entity pc2_perm is port( in_data : in std_logic_vector(1 to out_data : out std_logic_vector(1 to ); end; architecture behav of pc2_perm is begin out_data <= in_data(14) & in_data(17) in_data(1) & in_data(5) in_data(15) & in_data(6) in_data(23) & in_data(19) in_data(26) & in_data(8) in_data(27) & in_data(20) in_data(41) & in_data(52) in_data(47) & in_data(55) in_data(51) & in_data(45) in_data(44) & in_data(49) in_data(34) & in_data(53) in_data(50) & in_data(36) end behav; Mariusz Rawski 56); 48) & & & & & & & & & & & & in_data(11) in_data(3) in_data(21) in_data(12) in_data(16) in_data(13) in_data(31) in_data(30) in_data(33) in_data(39) in_data(46) in_data(29) & & & & & & & & & & & & in_data(24) & in_data(28) & in_data(10) & in_data(4) & in_data(7) & in_data(2) & in_data(37) & in_data(40) & in_data(48) & in_data(56) & in_data(42) & in_data(32); 30 Runda algorytmu DES • • Jest to podstawowy element algorytmu DES. Jakość realizacji tego bloku będzie decydować o szybkości działania całego algorytmu i wielkości zasobów niezbędnych do realizacji algorytmu w sprzęcie. Blok ten składa się z permutacji rozszerzającej ext_perm, ośmiu skrzynek selekcyjnych S-Box, permutacji p_perm, permutacji pc2_perm i bloków shl realizujących przesunięcie w lewo o 1 lub 2 bity. Nazwa l_i r_i c_i d_i shift_i l_o r_o c_o d_o Typ in in in in in out out out out Mariusz Rawski Rozmiar 32 32 28 28 1 32 32 28 28 Opis część danych poddawanych przekształceniu w danej rundzie część danych poddawanych przekształceniu w danej rundzie część klucza dla danej rundy część klucza dla danej rundy przesunięcie przy generacji podklucza : 0 – przesunięcie o 1 bit w lewo 1 – przesunięcie o 2 bit w lewo część danych przekształconych w danej rundzie część danych przekształconych w danej rundzie część klucza dla następnej rundy część klucza dla następnej rundy 31 Runda algorytmu DES – VHDL (1) library ieee; use ieee.std_logic_1164.all; use work.des_design.all; entity data_rund is port( shift_i : in std_logic; r_i, l_i : in std_logic_vector(1 to 32); c_i, d_i : in std_logic_vector(1 to 28); r_o, l_o : out std_logic_vector(1 to 32); c_o, d_o : out std_logic_vector(1 to 28) ); end; architecture structure of data_rund is signal extended_data : std_logic_vector(1 signal key_xored_data : std_logic_vector(1 signal sbox_out_data : std_logic_vector(1 signal permuted_data : std_logic_vector(1 signal c_shifted signal d_shifted signal sub_key Mariusz Rawski to to to to 48); 48); 32); 32); Lokalne sygnały do połączenia bloków : std_logic_vector(1 to 28); : std_logic_vector(1 to 28); : std_logic_vector(1 to 48); 32 Runda algorytmu DES – VHDL (2) begin with shift_i select c_shifted <= c_i(2 to 28) & c_i(1) when c_i(3 to 28) & c_i(1 to 2) when '0', others; with shift_i select d_shifted <= d_i(2 to 28) & d_i(1) when d_i(3 to 28) & d_i(1 to 2) when '0', others; b0 : pc2_perm port map( in_data => (c_shifted & d_shifted), out_data => sub_key ); Moduły przesuwające Permutacja PC-2 c_o <= c_shifted; d_o <= d_shifted; b1 : ext_perm port map( in_data => r_i, out_data => extended_data ); key_xored_data <= extended_data xor sub_key; Mariusz Rawski Permutacja rozszerzająca Połączenie z kluczem 33 Runda algorytmu DES – VHDL (2) b2 : s1 port map( in_data => key_xored_data(1 to 6), out_data => sbox_out_data(1 to 4) ); b3 : s2 port map( in_data => key_xored_data(7 to 12), out_data => sbox_out_data(5 to 8) ); Skrzynki podstawieniowe S-Box ●●● b9 : s8 port map( in_data => key_xored_data(43 to 48), out_data => sbox_out_data(29 to 32) ); b10: p_perm port map( in_data => sbox_out_data, out_data => permuted_data ); r_o <= permuted_data xor l_i; l_o <= r_i; end structure; Mariusz Rawski Permutacja P XOR z lewą częścia danych 34 Runda algorytmu DES – wyniki Fitter Summary Maksymalne opóźnienie 16,4 ns pozwala wykonać ok. 60 mln rund na sekundę! Mariusz Rawski Top-level Entity Name des_rund Family Stratix Device EP1S10F484C5 Total logic elements 298 / 10,570 ( 3 % ) Total pins 241 / 336 ( 72 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0/6(0%) Total DLLs 0/2(0%) Runda algorytmu DES wymaga 298 komórek logicznych. Algorytm składa się z 16 rund a to oznacza, ze realizacja całości wymaga sporo zasobów logicznych 35 Realizacja iteracyjna algorytmu DES • Podstawowym elementem składowym realizacji sprzętowe algorytmu DES jest przekształcenie zwane rundą. • Realizacja iteracyjna wykorzystuje fakt, że algorytm ten jest zbudowany z 16 identycznych rund. • Dzięki temu możliwe jest zaimplementowanie jednego bloku rundy algorytmu i wykorzystanie odpowiedniego sterowania do sekwencyjnej realizacji tego algorytmu. Mariusz Rawski 36 Koncepcja iteracyjnej realizacji algorytmu DES (1) • • • Głównym elementem jest blok des_rund, który realizuje pojedynczą rundę algorytmu. Rejestry R i L przechowują części danych poddawanych przekształceniom w rundzie algorytmu. Do tych rejestrów mogą być wpisane dane data_perm (dane wejściowe plain_data poddane permutacji początkowej init_perm) albo dane l_out i r_out stanowiące wynik działania rundy. Mariusz Rawski 37 Koncepcja iteracyjnej realizacji algorytmu DES (2) • • • Rejestry C i D przechowują dane niezbędne do generacji podkluczy rundowych. Mogą one zostać załadowane wartością key_perm (klucz key poddany permutacji pc1_perm) lub wartościami c_out i d_out stanowiące wynik przekształcenia klucza w rundzie. Sygnał shift wykorzystywany jest do kontrolowania o ile bitów należy przesunąć połówki klucza w czasie generacji podklucza dla danej rundy (0 – przesunięcie o 1 bit, 1 – przesunięcie o 2 bity). Mariusz Rawski 38 Koncepcja iteracyjnej realizacji algorytmu DES (3) • • Wyjścia rundy l_out i r_out podłączone są do permutacji końcowej której wynik data_final zapamiętywany jest w rejestrze result po całym procesie szyfrowania danego bloku. Zawartość tego rejestru podawana jest na wyjście ciphered_data. Mariusz Rawski 39 Schemat blokowy algorytmu iteracyjnego DES (1) • W momencie pojawienia się sygnału start do zmiennych C i D ładowane są 28 bitowe bloki wektora key_perm (klucza poddanego permutacji pc1_perm). • Następnie do zmiennych L i R ładowane są bloki wektora data_perm (tekst jawny poddanego permutacji początkowej init_perm). W tym samym czasie licznik rund cnt ustawiany jest na 1 zaś zmienna shift na 0 (w rundzie 1 przesuniecie przy generacji podklucza wynosi 1 bit). • Następnie w pętli wykonywanych jest 15 pozostałych rund. W każdej iteracji licznik rund zwiększany jest o jeden zmienne R, L, C i D ładowane są wartościami l_out, r_out, c_out i d_out będącymi wynikiem obliczeń wykonywanych w ramach rundy algorytmu. Mariusz Rawski 40 Schemat blokowy algorytmu iteracyjnego DES (2) • Wartość shift ustalana jest na 0 dla rund 2, 9 i 16 a w pozostałych przypadkach na 1. • W momencie, gdy wykonana zostanie ostatnia ruda (cnt = 16) sygnał ready ustawiany jest na 1, zaś do zmiennej result ładowany jest wynik permutacji końcowej data_final. • Jeśli sygnał start ma wartość 1 do zmiennych L i R ładowane są nowe bloki wektora data_perm i szyfrowanie kontynuowane jest przy użyci tego samego klucza jaki był użyty do szyfrowania poprzedniego bloku. W przeciwnym przypadku sterowanie przekazywane jest na początek algorytmu. • Pojawienie się wartości 1 na sygnale start ponownie uruchamia algorytm pozwalając wczytać nowy klucz i nowe dane do szyfrowania. Mariusz Rawski 41 Diagram ASM • • • • • • Do realizacji tego algorytmu można wykorzystać metodologię projektowania opartą na algorytmicznych układach sekwencyjnych ze ścieżką przepływu danych ASMD (Algorithmic State Machine with Data Path). Diagram ten składa się z 4 bloków ASM odpowiadających stanom automatu: idle, read, run, store. W stanie idle układ oczekuje na pojawienie się sygnału start. W stanie read do rejestrów L i R ładowane są dane z wektora data_perm, który przechowuje blok danych tekstu jawnego plain_data poddany permutacji początkowej init_perm. W stanie run wykonywane są kolejne rundy algorytmu. W stanie store wynik ostatniej rundy poddany permutacji inv_perm zapamiętany zostaje w rejestrze result zaś rejestr ready otrzymuje wartość 1. Mariusz Rawski 42 Iteracyjna realizacja algorytmu DES – VHDL (1) library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use work.des_design.all; entity des_seq is port( clk reset start plain_data key ready ciphered_data ); end; Nazwa clk reset start plain_data key ready ciphered_data Mariusz Rawski : : : : : : : in std_logic; in std_logic; in std_logic; in std_logic_vector(1 to 64); in std_logic_vector(1 to 64); out std_logic; out std_logic_vector(1 to 64) Typ in in in in in out out Rozmiar 1 1 1 64 64 1 64 Opis zegar systemowy reset systemowy sygnał rozpoczęcia szyfrowania blok danych do zaszyfrowania klucz wykorzystywany do szyfrowania sygnał końca procesu szyfrowania danego bloku szyfrogram danego bloku danych tekstu jawnego 43 Iteracyjna realizacja algorytmu DES – VHDL (2) architecture RTL of des_seq is signal data_perm signal data_final signal r_out signal l_out signal key_perm signal c_out signal d_out signal last_rund_res signal signal signal signal signal signal signal signal : : : : : : : : ready_reg, ready_next shift_reg, shift_next cnt_reg, cnt_next C_reg, C_next D_reg, D_next L_reg, L_next R_reg, R_next result_reg, result_next std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 : : : : : : : : to to to to to to to to std_logic; std_logic; unsigned(0 to 4); std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 std_logic_vector(1 64); 64); 32); 32); 56); 28); 28); 64); to to to to to 28); 28); 32); 32); 64); type STATE_TYPE is (idle, read, run, store); signal aut_reg, aut_next : STATE_TYPE; Mariusz Rawski 44 Iteracyjna realizacja algorytmu DES – VHDL (3) process(clk, reset) begin if reset = '1' then aut_reg <= idle; shift_reg <= '0'; ready_reg <= '0'; L_reg <= (others => '0'); R_reg <= (others => '0'); C_reg <= (others => '0'); D_reg <= (others => '0'); cnt_reg <= (others => '0'); result_reg <= (others => '0'); elsif rising_edge(clk) then aut_reg <= aut_next; ready_reg <= ready_next; L_reg <= L_next; R_reg <= R_next; C_reg <= C_next; D_reg <= D_next; shift_reg <= shift_next; cnt_reg <= cnt_next; result_reg <= result_next; end if; end process; Mariusz Rawski 45 Iteracyjna realizacja algorytmu DES – VHDL (4) process(aut_reg, start, cnt_next) begin ready_next <= '0'; case aut_reg is when idle => if start = '1' then aut_next <= read; else aut_next <= idle; end if; when read => aut_next <= run; when run => if cnt_next = 16 then aut_next <= store; else aut_next <= run; end if; when store => ready_next <= '1'; if start = '1' then aut_next <= run; else aut_next <= idle; end if; Mariusz Rawski when others => aut_next <= idle; end case; end process; 46 Iteracyjna realizacja algorytmu DES – VHDL (5) process( aut_reg, start,data_perm, key_perm, data_final, cnt_reg, cnt_next, L_reg, R_reg, C_reg, D_reg, shift_reg, result_reg, r_out, l_out, c_out, d_out) begin C_next <= C_reg; D_next <= D_reg; L_next <= L_reg; R_next <= R_reg; shift_next <= shift_reg; cnt_next <= cnt_reg; result_next <= result_reg; case aut_reg is when idle => if start = '1' C_next <= D_next <= end if; when read => cnt_next <= L_next <= R_next <= shift_next <= Mariusz Rawski then key_perm(1 to 28); key_perm(29 to 56); to_unsigned(1, 5); data_perm(1 to 32); data_perm(33 to 64); '0'; 47 Iteracyjna realizacja algorytmu DES – VHDL (6) when run => cnt_next L_next R_next C_next D_next <= <= <= <= <= cnt_reg + 1; l_out; r_out; c_out; d_out; if cnt_next = 16 then shift_next <= '0'; elsif (cnt_next = 2) or (cnt_next = 9) then shift_next <= '0'; else shift_next <= '1'; end if; when store => result_next <= data_final; if start = '1' then cnt_next <= to_unsigned(1, 5); L_next <= data_perm(1 to 32); R_next <= data_perm(33 to 64); shift_next <= '1'; end if; end case; end process; Mariusz Rawski 48 Iteracyjna realizacja algorytmu DES – VHDL (7) b1 : init_perm port map( in_data => plain_data, out_data => data_perm ); last_rund_res <= r_out & l_out; b2 : inv_perm port map( in_data => last_rund_res, out_data => data_final ); b3 : pc1_perm port map( in_data => key, out_data => key_perm ); Mariusz Rawski b4 : des_rund port map( shift_i => shift_reg, r_i => R_reg, l_i => L_reg, c_i => C_reg, d_i => D_reg, r_o => r_out, l_o => l_out, c_o => c_out, d_o => d_out ); ready ciphered_data end; <= ready_reg; <= result_reg; 49 Iteracyjna realizacja algorytmu DES – wyniki Fitter Summary Top-level Entity Name des_seq Family Stratix Device EP1S10F484C5 Total logic elements 449 / 10,570 ( 4 % ) Total pins 196 / 336 ( 58 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0/6(0%) Total DLLs 0/2(0%) Przepustowość dla wersji iteracyjnej : thruput iter = fMAX × data_size / 16 thruput iter = 604 Mbit/s wczytanie klucza wczytanie danych Mariusz Rawski szyfrogram gotowy 50 Realizacja kombinacyjna algorytmu DES • • • • Realizacja iteracyjna algorytmu DES ma niewątpliwą zaletę – niewielkie zapotrzebowanie na zasoby. Implementacja jednego bloku rundy, który jest wykorzystywany sekwencyjnie do obliczania 16 rund algorytmu DES, ma jednakże też wadę. Do zaszyfrowania jednego bloku danych wymaganych jest 16 cykli zegara systemowego. Wpływa to niekorzystnie na przepustowość zaprojektowanego układu. Jeśli podstawowym celem jest zaprojektowanie układu o jak największej szybkości szyfrowania lepszym rozwiązaniem jest implementacja 16 rund działających jako jeden blok kombinacyjny. Tego typu optymalizacja jest znana jako rozwijanie pętli (loop unroling). Rozwijanie pętli jest jedną z podstawowych technik optymalizacyjnych wykorzystywanych przez kompilatory. W przypadku realizacji w układach reprogramowalnych pozwala ona na zaprojektowanie systemu o dużym stopniu zrównoleglenia obliczeń. Jednakże rozwijanie pętli zwiększa rozmiar układu, co może mieć negatywny wpływ na częstotliwość taktowania układu. W praktyce istnieje pewna granica w rozwijaniu pętli po przekroczeniu, której nie uzyskuje się przyrostu szybkości działania. Mariusz Rawski 51 Schemat blokowy • Bloki REG na wejściach i wyjściu układu reprezentują rejestry. • Dla ułatwienia opisu wprowadzono sygnały l_slices, r_slices, c_slices, d_slices i shift_slices reprezentujące warstwy połączeń między kolejnymi blokami rund algorytmu. Mariusz Rawski 52 Iteracyjna realizacja algorytmu DES – VHDL (1) library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use work.des_design.all; entity des_unrolled port( clk : rst : plain_data : key : ciphered_data : ); end; is in std_logic; in std_logic; in std_logic_vector(1 to 64); in std_logic_vector(1 to 64); out std_logic_vector(1 to 64) architecture RTL of des_unrolled is type type type type type SHIFT_ARRAY C_ARRAY D_ARRAY R_ARRAY L_ARRAY Mariusz Rawski is is is is is array array array array array (1 (1 (1 (1 (1 to to to to to 16) 17) 17) 17) 17) of of of of of std_logic; std_logic_vector std_logic_vector std_logic_vector std_logic_vector (1 (1 (1 (1 to to to to 28); 28); 32); 32); 53 Iteracyjna realizacja algorytmu DES – VHDL (2) signal signal signal signal signal r_slices l_slices c_slices d_slices shift_slices : : : : : R_ARRAY; L_ARRAY; D_ARRAY; C_ARRAY; SHIFT_ARRAY; signal signal signal signal data_perm : std_logic_vector(1 key_perm : std_logic_vector(1 data_final : std_logic_vector(1 last_rund_res : std_logic_vector(1 to to to to 64); 56); 64); 64); signal plain_data_reg : std_logic_vector(1 to 64); signal key_reg : std_logic_vector(1 to 64); signal data_final_reg : std_logic_vector(1 to 64); component des_rund port( shift_i : in std_logic; r_i, l_i : in std_logic_vector(1 c_i, d_i : in std_logic_vector(1 r_o, l_o : out std_logic_vector(1 c_o, d_o : out std_logic_vector(1 ); end component; Mariusz Rawski to to to to 32); 28); 32); 28) 54 Iteracyjna realizacja algorytmu DES – VHDL (3) process(clk, rst) begin if rst = '1' then plain_data_reg <= (others => '0'); key_reg <= (others => '0'); data_final_reg <= (others => '0'); elsif rising_edge(clk) then plain_data_reg <= plain_data; key_reg <= key; data_final_reg <= data_final; end if; end process; b1 : init_perm port map( in_data => plain_data_reg, out_data => data_perm ); last_rund_res <= r_slices(17) & l_slices(17); b2 : inv_perm port map( in_data => last_rund_res, out_data => data_final ); b3 : pc1_perm port map( in_data => key_reg, out_data => key_perm ); Mariusz Rawski 55 Iteracyjna realizacja algorytmu DES – VHDL (4) l_slices(1) r_slices(1) c_slices(1) d_slices(1) <= <= <= <= data_perm(1 to 32); data_perm(33 to 64); key_perm(1 to 28); key_perm(29 to 56); rund_slices: for i in 1 to 16 generate bi : des_rund port map( shift_i => shift_slices(i), r_i => r_slices(i), l_i => l_slices(i), c_i => c_slices(i), d_i => d_slices(i), r_o => r_slices(i+1), l_o => l_slices(i+1), c_o => c_slices(i+1), d_o => d_slices(i+1) ); shift_by_1: if (i = 1) or (i = 2) or (i = 9) or (i = 16) generate shift_slices(i) <= '0'; end generate; shift_by_2: if ((i > 2) and (i < 9)) or ((i > 9) and (i < 16)) generate shift_slices(i) <= '1'; end generate; end generate; ciphered_data end; Mariusz Rawski <= data_final_reg; 56 Realizacja kombinacyjna algorytmu DES – wyniki Fitter Summary Top-level Entity Name des_unrolled Family Stratix Device EP1S10F484C5 Total logic elements 3,968 / 10,570 ( 38 % ) Total pins 194 / 336 ( 58 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0/6(0%) Total DLLs 0/2(0%) Przepustowość dla wersji kombinacyjnej: thruput unroll = fMAX × data_size thruput unroll = 940,8 Mbit/s wczytanie danych szyfrogram gotowy Mariusz Rawski wczytanie klucza szyfrogram gotowy 57 Realizacja potokowa • Rejestry oddzielające rundy algorytmu skracają ścieżkę krytyczną Mariusz Rawski 58 Realizacja potokowa algorytmu DES – VHDL (1) ●●● entity des_pipelined is port( clk : in std_logic; rst : in std_logic; plain_data : in std_logic_vector(1 to 64); key : in std_logic_vector(1 to 64); ciphered_data : out std_logic_vector(1 to 64) ); end; architecture RTL of des_pipelined is type SHIFT_ARRAY is array (1 to 16) of std_logic; type C_ARRAY is array (1 to 17) of std_logic_vector type D_ARRAY is array (1 to 17) of std_logic_vector type R_ARRAY is array (1 to 17) of std_logic_vector type L_ARRAY is array (1 to 17) of std_logic_vector signal signal signal signal signal signal signal signal signal shift_slices : r_slices : l_slices : c_slices : d_slices : r_slices_reg : l_slices_reg : c_slices_reg : d_slices_reg : SHIFT_ARRAY; R_ARRAY; L_ARRAY; D_ARRAY; C_ARRAY; R_ARRAY; L_ARRAY; D_ARRAY; C_ARRAY; (1 (1 (1 (1 to to to to 28); 28); 32); 32); Sygnały opisujące rejestry potoku ●●● Mariusz Rawski 59 Realizacja potokowa algorytmu DES – VHDL (2) begin process(clk, rst) begin if rst = '1' then r_slices_reg <= l_slices_reg <= c_slices_reg <= d_slices_reg <= (others (others (others (others => => => => elsif rising_edge(clk) then r_slices_reg <= r_slices; l_slices_reg <= l_slices; c_slices_reg <= c_slices; d_slices_reg <= d_slices; end if; end process; (others (others (others (others =>'0')); =>'0')); =>'0')); =>'0')); Proces modelujący rejestru potoku b1 : init_perm port map( in_data => plain_data, out_data => data_perm ); b3 : pc1_perm port map( in_data => key, out_data => key_perm ); Mariusz Rawski 60 Realizacja potokowa algorytmu DES – VHDL (3) last_rund_res <= r_slices_reg(17) & l_slices_reg(17); b2 : inv_perm port map( in_data => last_rund_res, out_data => data_final ); l_slices(1) c_slices(1) <= data_perm(1 to 32); r_slices(1) <= data_perm(33 to 64); <= key_perm(1 to 28); d_slices(1) <= key_perm(29 to 56); rund_slices: for i in 1 to 16 generate bi : des_rund port map( shift_i => shift_slices(i), r_i => r_slices_reg(i), l_i => l_slices_reg(i), c_i => c_slices_reg(i), d_i => d_slices_reg(i), r_o => r_slices(i+1), l_o => l_slices(i+1), c_o => c_slices(i+1), d_o => d_slices(i+1) ); shift_by_1: if (i = 1) or (i = 2) or (i = 9) or (i = 16) generate shift_slices(i) <= '0'; end generate; shift_by_2: if ((i > 2) and (i < 9)) or ((i > 9) and (i < 16)) generate shift_slices(i) <= '1'; end generate; end generate; ciphered_data <= data_final; end; Mariusz Rawski 61 Realizacja potokowa algorytmu DES – wyniki Fitter Summary Top-level Entity Name des_pipelined Family Stratix Device EP1S10F484C5 Total logic elements 4,566 / 10,570 ( 43 % ) Total pins 194 / 336 ( 58 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0/6(0%) Total DLLs 0/2(0%) Przepustowość dla wersji potokowej: thruput pip= fMAX × data_size thruput pip= 10 917,76 Mbit/s = 10, 91 Gbit/s wczytanie danych szyfrogram gotowy Napełnianie potoku Mariusz Rawski 62 Wyniki fMAX Zasoby Wydajność [MHz] [# LC] [Mbit/s] − − 183,91 DES iter 151,54 449 604 DES unroll 14,75 3 968 940,8 DES pip 170,59 4 566 10 917,76 DES soft Każda realizacja sprzętowa jest wydajniejsza od wersji programowej Projektant ma możliwość balansu pomiędzy wielkością wymaganych zasobów a wydajnością systemu sprzętowego Mariusz Rawski 63