VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ Fakulta elektrotechniky a komunikačních technologií BAKALÁŘSKÁ PRÁCE Brno, 2016 Michal Dufek VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION ÚSTAV TELEKOMUNIKACÍ DEPARTMENT OF TELECOMMUNICATIONS OPTIMALIZAČNÍ MOŽNOSTI PRO NÍZKO-VÝKONOVÉ MIKRO-KONTROLÉRY OPTIMIZATION OPTIONS FOR LOW-POWER MICROCONTROLLERS BAKALÁŘSKÁ PRÁCE BACHELOR'S THESIS AUTOR PRÁCE AUTHOR Michal Dufek VEDOUCÍ PRÁCE SUPERVISOR Ing. Radek Fujdiak BRNO 2016 Fakulta elektrotechniky a komunikačních technologií, Vysoké učení technické v Brně / Technická 3058/10 / 616 00 / Brno Bakalářská práce bakalářský studijní obor Teleinformatika Ústav telekomunikací Student: Michal Dufek ID: 158123 Ročník: 3 Akademický rok: 2015/16 NÁZEV TÉMATU: Optimalizační možnosti pro nízko-výkonové mikro-kontroléry POKYNY PRO VYPRACOVÁNÍ: V bakalářské práci student bude student analyzovat optimalizační možnosti pro nízko-výkonové mikro-kontroléry. Využívat bude mikro-kontrolér MSP430f5438A od firmy Texas Instruments. Analýza by měla být vyčerpávající a měla by zhodnotit jak možnosti samotného mikro-kontroléru, tak i vývojového prostředí a možnosti pro samotné programátory. Analýza bude dále podložena i samotným rozsáhlým měřením, které by mělo potvrdit výstup analýzy. Student se zaměří na optimalizaci z pohledu velikosti kódu, spotřeby elektrické energie, výkonu, rychlosti výpočtu, náročnosti na vnitřní paměť aj. Výstup práce tedy bude jednak analýza optimalizačních možností, s jejich následným praktickým ověřením ve formě měření. DOPORUČENÁ LITERATURA: [1] TEXAS INSTRUMENTS "MSP430 C/C++ Language Implementaion". Chapter 5, SLAU132C, November 2008. [2] TEXAS INSTRUMENTS "Code Composer Studio v6.1 for MSP430". User’s Guide, SLAU157AL. Januar, 2016. Termín zadání: 1.2.2016 Termín odevzdání: 1.6.2016 Vedoucí práce: Ing. Radek Fujdiak Konzultant bakalářské práce: doc. Ing. Jiří Mišurec, CSc., předseda oborové rady UPOZORNĚNÍ: Autor bakalářské práce nesmí při vytváření bakalářské práce porušit autorská práva třetích osob, zejména nesmí zasahovat nedovoleným způsobem do cizích autorských práv osobnostních a musí si být plně vědom následků porušení ustanovení § 11 a následujících autorského zákona č. 121/2000 Sb., včetně možných trestněprávních důsledků vyplývajících z ustanovení části druhé, hlavy VI. díl 4 Trestního zákoníku č.40/2009 Sb. ABSTRAKT Tato bakalářská práce se zabývá optimalizačními možnostmi pro mikro-kontroléry za použití programu CCS a mikro-kontroléru MSP430. Úvodní část obsahuje popis syme- trických a asymetrických algoritmů a jejich vzájemné srovnání. V další části je obsažen popis algoritmu AES a jeho provozní módy. Praktickou částí práce jsou optimalizační možnosti programu CCS, dosažené výsledky pro implementace VUT a TI a jejich vzá- jemné porovnání. Dále je provedena optimalizace kódu pro implementaci od VUT, jenž je zaměřená na redukci cyklů. KLÍČOVÁ SLOVA AES,CCS,MSP430,optimalizace,TI ABSTRACT This bachelor thesis is concerned with optimization options for microcontroller MSP430 using the program CCS. The introductory section contains description of symmetric and asymetric algorithms and their comparison. In another section there is description of AES algorithm and his operation modes. The practical part deals with optimization options of program CCS, there are also mentioned reached results of VUT and TI implementations and their comparison. In the end of practical part there is performed optimization code for implementation of VUT, which is focused to reduce cycles. KEYWORDS AES,CCS,MSP430,optimizing,TI DUFEK, Michal Optimalizační možnosti pro nízko-výkonové mikro-kontroléry: bakalářská práce. Brno: Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií, Ústav telekomunikací, 2016. 50 s. Vedoucí práce byl Ing. Radek Fujdiak, PROHLÁŠENÍ Prohlašuji, že svou bakalářskou práci na téma „Optimalizační možnosti pro nízko- výkonové mikro-kontroléry“ jsem vypracoval samostatně pod vedením vedoucího ba- kalářské práce a s použitím odborné literatury a dalších informačních zdrojů, které jsou všechny citovány v práci a uvedeny v seznamu literatury na konci práce. Jako autor uvedené bakalářské práce dále prohlašuji, že v souvislosti s vytvořením této bakalářské práce jsem neporušil autorská práva třetích osob, zejména jsem nezasáhl nedovoleným způsobem do cizích autorských práv osobnostních a/nebo majetkových a jsem si plně vědom následků porušení ustanovení S 11 a následujících autorského zá- kona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon), ve znění pozdějších předpisů, včetně možných trestněprávních důsledků vyplývajících z ustanovení části druhé, hlavy VI. díl 4 Trestního zákoníku č. 40/2009 Sb. Brno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (podpis autora) PODĚKOVÁNÍ Rád bych poděkoval vedoucímu bakalářské práce panu Ing. Radku Fujdiakovi, za odborné vedení, konzultace, trpělivost a podnětné návrhy k práci. Brno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (podpis autora) PODĚKOVÁNÍ Výzkum popsaný v této bakalářské práci byl realizován v laboratořích podpořených z pro- jektu SIX; registrační číslo CZ.1.05/2.1.00/03.0072, operační program Výzkum a vývoj pro inovace. Brno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (podpis autora) Faculty of Electrical Engineering and Communication Brno University of Technology Purkynova 118, CZ-61200 Brno Czech Republic http://www.six.feec.vutbr.cz OBSAH Úvod 11 1 Kryptografie 12 1.1 Symetrické šifry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.1.1 Proudové šifry . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.1.2 Blokové šifry . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.2 Asymetrické šifry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.2.1 RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.3 Porovnání symetrické a asymetrické šifry . . . . . . . . . . . . . . . . 15 2 Advanced Encryption Standard 16 2.1 Popis šifry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.2 Popis algoritmu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.2.1 Provozní módy blokových šifer . . . . . . . . . . . . . . . . . . 18 3 Experimentální měření 23 3.1 Základní informace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.1.1 Mikro-kontrolér MSP430 . . . . . . . . . . . . . . . . . . . . . 23 3.1.2 Prostředí CCS (Code Composer Studio) . . . . . . . . . . . . 23 3.2 Základní měření . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.2.1 VUT implementace . . . . . . . . . . . . . . . . . . . . . . . . 24 3.2.2 TI implementace . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.2.3 Srovnání implementací . . . . . . . . . . . . . . . . . . . . . . 25 4 Optimalizace 28 4.1 Optimalizace pomocí CCS . . . . . . . . . . . . . . . . . . . . . . . . 28 4.1.1 Úroveň optimalizace . . . . . . . . . . . . . . . . . . . . . . . 28 4.1.2 Optimalizace kódu vůči rychlosti (opt_for_speed) . . . . . . . 29 4.1.3 Pokročilá optimalizace . . . . . . . . . . . . . . . . . . . . . . 29 4.1.4 Vliv optimalizační úrovně . . . . . . . . . . . . . . . . . . . . 30 4.1.5 Vliv optimalizace kódu vůči rychlosti . . . . . . . . . . . . . . 31 4.1.6 Měření implementací s optimalizací . . . . . . . . . . . . . . . 32 4.2 Softwarová optimalizace . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.3 Shrnutí . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.3.1 VUT implementace . . . . . . . . . . . . . . . . . . . . . . . . 36 4.3.2 TI implementace . . . . . . . . . . . . . . . . . . . . . . . . . 39 5 Závěr 42 Literatura 43 Seznam symbolů, veličin a zkratek 44 Seznam příloh 45 A Obsah CD 46 B Upravené kódy 47 B.1 AddRoundKey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 B.2 SubBytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 B.3 InvSubBytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 B.4 MixColumns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 B.5 InvMixColumns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 B.6 RoundKey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 SEZNAM OBRÁZKŮ 2.1 Schéma šifrování a dešifrování AES [6]. . . . . . . . . . . . . . . . . . 17 2.2 Schéma šifrování a dešifrování módu ECB [5]. . . . . . . . . . . . . . 18 2.3 Schéma šifrování a dešifrování módu CBC [5]. . . . . . . . . . . . . . 19 2.4 Schéma šifrování a dešifrování módu CFB [5]. . . . . . . . . . . . . . 20 2.5 Schéma šifrování a dešifrování módu OFB [5]. . . . . . . . . . . . . . 21 2.6 Schéma šifrování a dešifrování módu CRT [5]. . . . . . . . . . . . . . 22 3.1 Srovnání výpočetní náročnosti šifrování implementací VUT a TI bez optimalizace. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.2 Srovnání výpočetní náročnosti dešifrování implementací VUT a TI bez optimalizace. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.3 Srovnání paměťové náročnosti implementací VUT a TI bez optima- lizace. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.1 Vliv optimalizační úrovně. . . . . . . . . . . . . . . . . . . . . . . . . 31 4.2 Vliv optimalizace kódu vůči rychlosti pro optimalizační úroveň = 4. . 32 4.3 Srovnání výpočetní náročnosti šifrování implementací VUT a TI s optimalizací. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.4 Srovnání výpočetní náročnosti dešifrování implementací VUT a TI s optimalizací. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.5 Srovnání paměťové náročnosti implementací VUT a TI s optimalizací. 35 4.6 Srovnání výpočetní náročnosti VUT implementace při šifrování. . . . 37 4.7 Srovnání výpočetní náročnosti VUT implementace při dešifrování. . . 38 4.8 Srovnání paměťové náročnosti VUT implementace. . . . . . . . . . . 39 4.9 Srovnání výpočetní náročnosti TI implementace při šifrování. . . . . . 40 4.10 Srovnání výpočetní náročnosti TI implementace při dešifrování. . . . 41 4.11 Srovnání paměťové náročnosti TI implementace. . . . . . . . . . . . . 41 SEZNAM TABULEK 3.1 Tabulka naměřených hodnot VUT implementace (vše v cyklech). . . . 24 3.2 Tabulka paměťové náročnosti a počet cyklů celé šifry VUT imple- mentace. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.3 Tabulka naměřených hodnot TI implementace (vše v cyklech). . . . . 25 3.4 Tabulka paměťové náročnosti a počet cyklů celé šifry TI implementace. 25 4.1 Vliv optimalizační úrovně. . . . . . . . . . . . . . . . . . . . . . . . . 30 4.2 Vliv optimalizace kódu vůči rychlosti pro optimalizační úroveň = 4. . 31 4.3 Tabulka naměřených hodnot implementací VUT a TI s optimalizace (vše v cyklech). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.4 Tabulka paměťové náročnosti a počet cyklů celé šifry implementací VUT a TI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.5 Tabulka naměřených hodnot implementace VUT bez optimalizace a s optimalizací (vše v cyklech). . . . . . . . . . . . . . . . . . . . . . . 37 4.6 Tabulka paměťové náročnosti a počet cyklů celé šifry implementace VUT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 4.7 Tabulka naměřených hodnot implementace TI bez optimalizace a s optimalizací (vše v cyklech). . . . . . . . . . . . . . . . . . . . . . . . 40 4.8 Tabulka paměťové náročnosti a počet cyklů celé šifry implementace TI. 41 ÚVOD Tato práce se zabývá možnostmi optimalizace implementace šifrovacího algoritmu AES od dvou různých institucí, Texas Instruments a VUT, na mikrokontroleru MSP430. Cílem bakalářské práce je zjištění možných optimalizací ve vývojovém prostředí Code Composer Studio(CCS), jenž je výtvorem Texas Instruments, a možnosti opti- malizace implementace samotných. Následně naměřené hodnoty obou implementací mezi sebou porovnat, jak mezi sebou, tak mezi původními a optimalizovanými hod- notami. Práce je rozdělena do čtyř kapitol. V první kapitole se popisují symetrické a asy- metrické algoritmy. Druhá kapitola se věnuje popisu algoritmu AES. V další kapitole se nachází základní popis mikrokontroleru s prostředím CCS. Dále obsahuje infor- mace o nastavení CCS a prvotní měření bez optimalizace. Poslední kapitola se za- obírá optimalizací implementací. V této kapitole se nachází i shrnutí naměřených výsledků. 11 1 KRYPTOGRAFIE Kryptografie je věda zabývající se převedením informace do podoby, kdy je obsah informace skryt. Úkolem kryptografie tedy je učinit výslednou zprávu nečitelnou i když je plně prozrazená. Základním prostředkem utajení zpráv je šifrování. Činnost šifrování spočívá v převedení otevřeného textu (zprávy) do nečitelného šifrovaného textu. Šifrovaný text je určen šifrovacím klíčem [2]. 1.1 Symetrické šifry Jedná se o šifrovací algoritmus využívající jediný klíč pro šifrování a dešifrování. Proto musí zůstat klíče utajeny, aby se zabránilo zneužití třetí stranou k dešifrování tajné zprávy. Symetrické algoritmy používají různé délky klíčů, přičemž delší klíč obvykle znamená větší bezpečnost [2]. Symetrické šifry se dělí na dvě skupiny: • Blokové šifry - otevřený text rozdělí na bloky stejné velikosti a vhodným způ- sobem doplní poslední blok na stejnou velikost. • Proudové šifry - zpracovávají otevřený text po jednotlivých bitech [2]. Hlavním nedostatkem symetrické šifry spočívá v tom, že odesílatel musí doručit tajný klíč příjemci a zaručit, že klíč nebude zachycen neautorizovanou osobou. Přednosti symetrické šifry jsou využívání krátkých klíčů a rychlost [2]. 1.1.1 Proudové šifry Pracují s bitovými nebo bajtovými proudy otevřeného textu a šifrovaného textu. Při každém šifrování transformuje jeden a týž bit nebo bajt veřejného textu do růz- ných bitů nebo bajtů šifrovaného textu. Proudové šifry transformují otevřený text do šifrovaného textu po jednom bitu za operaci. Obvykle se používá operace XOR. Vý- sledek šifrování nezáleží na již dříve proběhlém vstupním proudu. Proudové šifry jsou založeny na pseudonáhodných klíčových posloupnostech. Generátor proudu klíčů vy- tváří bitový proud, který je podobný na náhodný, ale ve skutečnosti je determinován a může být bezchybně obnoven při dešifrování. Používají se v systémech přenosu proudů informací, kdy přenos informace začíná a končí v libovolných časových oka- mžicích a může se náhodně přerušit. Jsou vhodné pro šifrování nepřetržitých proudů dat – hlasy, video atd [1]. Přednosti proudových šifer • možnost dosažení vysokých rychlostí šifrování, • koeficient rozmnožení chyby je rovný jedné, • proudovost šifrování a rozšifrování, • uchování velikosti textu při šifrování [1]. 12 Nedostatky proudových šifer • nestabilita šifry při opakovaném použití klíče, • posloupnost přístupu k informaci [1]. Šifra RC4 Jedním ze zástupců proudové šifry je algoritmus RC4. Je používán například pro šifrovaný přenos webových stránek (HTTPS) nebo pro zabezpečení přenosu v bez- drátových sítích (Wi-Fi). Hlavním faktorem úspěchu RC4 je široký rozsah použitel- nosti v aplikacích, jeho rychlost a jednoduchost: efektivní a snadná implementace v softwaru i hardwaru [3]. 1.1.2 Blokové šifry Pracují s bloky otevřeného textu nebo šifrovaného textu – obvykle o délce 64 bitů nebo delší. Výchozí otevřená zpráva se rozbíjí na bloky s fixovanou délkou, šifrování se uskutečňuje způsobem použití tabulky záměny (závislé na klíči) bloku za blok. Bloková šifra používající jeden a týž klíč vždy při šifrování transformuje jeden a týž blok otevřeného textu do jednoho a téhož šifrovaného textu. Výsledek šifrování záleží na všech výchozích bajtech tohoto bloku. Schéma se používá při paketovém přenosu informací a šifrování fajlů [1]. V závislosti na charakteru aplikací prováděných s daty se algoritmy dělí na: • Přestavující - Bloky informací se sami od sebe nemění, ale mění se pořadí jejich postupu. • Substituční - Samotné bloky informací se mění podle zákonů kryptoalgoritmu. Převážná většina současných algoritmů patří do této skupiny [1]. Substituční šifra Šifra, u které se každý symbol otevřeného textu v šifrovaném textu nahrazuje jiným symbolem. V klasické kryptografii existují 4 typy substituč- ních šifer: • Jednoduchá substituční šifra (monoabecední) - každý symbol otevřeného textu nahrazuje odpovídajícím symbolem šifrovaného textu. • Jednozvučná substituční šifra - podobná jak jednoduchá substituční šifra, ako- rát jeden symbol otevřeného textu se zobrazuje na několik symbolů šifrovaného textu. Jsou složitější pro otevření než jednoduché substituční šifry. Pomocí zná- mého otevřeného textu se dají lehce otevírat další. V případě otevření za po- moci šifrovaného textu je otevření složitější, ale počítači tahle operace zabere pár vteřin. • Polygramová substituční šifra - bloky symbolů šifruje podle skupin. • Polyabecední substituční šifra - sestává z několik jednoduchých substitučních šifer. V polyabecedních substitučních šifrách jsou množstevní jednopísmenné 13 klíče, každý z nich se používá pro šifrování jednoho symbolu otevřeného textu. Prvním klíčem se šifruje první symbol, druhým klíčem – druhý symbol atd. [1]. Přednosti blokových šifer • odolnost vůči opakovanému použití jednoho a téhož klíče, • libovolnost přístupu k šifrovanému textu, • možnost realizace na základě blokové šifry [1]. Nedostatky blokových šifer • koeficient rozmnožení chyby je rovný délce bloku. • Blokovost šifrování. Ze dvou stejných bloků otevřeného textu vycházejí stejné bloky šifrovaného textu. • Významně nízká rychlost práce ve srovnání s proudovou šifrou, • vysoká složitost realizace operací standardně používaných při vytváření blo- kové šifry, • relativně velký objem paměti vyžadovaný pro archivaci vnitřních dat používa- ných při šifrování [1]. 1.2 Asymetrické šifry Asymetrické šifry pro svojí činnost používají dva různé klíče pro šifrování a dešifro- vání. Procedura šifrování je zvolena tak, aby byla nevratná. To znamená, že i když známe šifrovací klíč, též jako "veřejný klíč", i zašifrovaný text, tak je nemožné obnovit původní zprávu. To je možné pouze s dešifrovacím klíčem, jenž se nazývá "soukromý klíč". Další vlastností asymetrické šifry je jednostranná funkce, která zajišťuje ne- možnost vypočítaní zavřeného klíče z klíče otevřeného. Díky tomu může majitel volně uveřejnit veřejný klíč a kdokoliv může pomocí něj šifrovat zprávy pro něj ur- čené. Nevýhodou asymetrických algoritmů je používání dlouhých klíčů a tím spjata výpočetní rychlost. Používají se zejména k přenosu klíčů, k vytváření digitálních podpisů [1] [2]. 1.2.1 RSA RSA je zástupcem asymetrické kryptografie. Jedná se o patentovaný algoritmus je- jímž vlastníkem je Public Key Partners. Bezpečnost je postavena na předpokladu, že rozložení velkého čísla na součin prvočísel je velmi obtížná úloha. Tedy v rozumném čase není možné určit činitele p a q z rovnice 𝑛 = 𝑝𝑞, závisí tedy na možnostech řešit úlohu faktorizace. RSA se používá pro šifrování a digitální podpisy. Algoritmus RSA je považován za bezpečný, avšak se musí aplikovat opatrně. RSA je zranitelný vůči útokům s otevřeným textem [2]. 14 1.3 Porovnání symetrické a asymetrické šifry Hlavním rozdílem mezi symetrickou a asymetrickou šifrou je jejich práce se šifrova- cími klíči. Symetrická šifra používá jeden jediný klíč, tzv. tajný klíč, který vždy spolu sdílí dvě mezi sebou komunikující strany. Z toho důvodu se pro každý komunikující pár musí vytvořit svůj tajný klíč. Další nevýhoda spočívá v tom, že tajný klíč musí být doručen příjemci, aniž by byl odhalen. Za to asymetrická šifra využívá pro svojí činnost dva klíče, tzv. veřejný a soukromý. Veřejný klíč používají vysílací strany pro zašifrování zprávy příjemci a tedy není potřeba tento klíč utajovat. Soukromý klíč je zase určen jen příjemci, který jej musí utajovat [1] [2]. 15 2 ADVANCED ENCRYPTION STANDARD Standard pokročilého šifrování, zkráceně AES, je standardizovaný algoritmus pou- žívaný k šifrování dat v informatice. Jedná se o symetrickou blokovou šifru, jenž šifruje a dešifruje data [4]. 2.1 Popis šifry Tento standard specifikuje Rijndaelův algoritmus, který zpracovává data o velikosti bloku 128 bitů a za použití šifrovacího klíče o velikostech 128, 192 a 256 bitů převádí informace do šifrované podoby. Základní jednotkou pro zpracování informace v al- goritmu AES je bajt. Interní operace v algoritmu jsou prováděny dvourozměrnou maticí bajtů, též nazývaný jako stav. Velikost matice je 4x4 [4]. 2.2 Popis algoritmu Velikost vstupních bloků, výstupních bloků a stavu je 128 bitů. Ty jsou rozděleny do 4 řad bajtů, z nichž každý obsahuje Nb bajt, který odráží počet 32-bitových slov (sloupců) ve stavu. Velikost klíče nabývá velikosti 128, 192 nebo 256 bitů. Velikost klíče je reprezentována bajtem Nk = 4, 6 nebo 8, která určuje počet 32-bitových slov (počet sloupců) v šifrovacím klíči. Počet iterací, které mají být provedeny, jsou závislé na velikosti klíče. Počet iterací je prezentován bajtem Nr, jenž nabývá hodnot 10, 12 a 14 při Nk = 4, 6 a 8. Algoritmus AES pro šifrování i dešifrování používá opakovací funkci složenou ze ze 4 různých bajtově orientovaných funkcí [4]. Záměna bajtů Jedná se o nelineární bajtovou substituci, která funguje nezávisle na každý bajt stavu za použití substituční tabulky S-box. Tato operace zajišťuje nelinearitu v šifře. S-box je konstruován tak, aby v něm nevznikaly pevné body a žádné jejich protějšky kvůli bezpečnosti [4]. Prohození řádků Tato operace probíhá na úrovních řádků, kde jednotlivě pro- hazuje bajty v každém řádku o určitý přesah. V případě AES je první řádek po- nechán beze změn. Každý bajt druhého řádku je posunut o jeden doleva. Stejným způsobem jsou bajty ve třetím a čtvrtým řádku posunuty o dvě, respektive o tři pozice doleva [4]. Kombinování sloupců V tomto kroku kombinujeme 4 bajty v každém sloupci. Tato funkce vezme čtyři bajty jako vstup a vrátí čtyřbajtový výstup, kde každý vstupní bajt ovlivní všechny výstupní bajty. Společně s předchozími kroky zajistí dostatečnou náhodnost v šifře [4]. Přidání pod-klíče Při přidání pod-klíče je každý bajt zkombinován s pod- klíčem. Pro každou iteraci je pod-klíč odvozen z hlavního klíče. Každý pod-klíč má 16 stejnou velikost a je přidán za pomoci kombinace každého bajtu stavu s odpovída- jícím bajtem pod-klíče užitím XORu [4]. Přidání podklíče Bajtová substituce Prohození v rádcích Kombinace sloupců Přidání podklíče Bajtová substituce Prohození v řádcích Přidání podklíče Z C K0 K1-9 K10 Přidání podklíče Inverzní bajtová substituce Inverzní prohození v rádcích Inverzní kombinace sloupců Přidání podklíče Inverzní bajtová substituce Inverzní prohození v řádcích Přidání podklíče Z C K0 K1-9 K10 Šifrování Dešifrování Obr. 2.1: Schéma šifrování a dešifrování AES [6]. 17 2.2.1 Provozní módy blokových šifer Mód elektronického kódového seznamu (The Electronic Codebook Mode - ECB) Jedná se o mód ochrany, který je k dispozici pro daný klíč přiřazením pevného bloku šifrovaného textu pro každý blok otevřeného textu s analogickým přiřazením kódových slov v kódovém seznamu [5]. Při šifrovaní pomocí ECB se vstupní blok šifruje přímo a nezávisle na každém bloku otevřeného textu. Výsledkem je sled výstupních bloků šifrovaného textu. De- šifrování se provádí aplikováním inverzní funkce šifry přímo a nezávisle na každý vstupní blok šifrovaného textu. Výsledný sled výstupních bloků je otevřený text [5]. Při vícenásobných předních funkcí šifry a inverzních funkcí šifry lze provádět výpočet šifrovaní a dešifrování ECB paralelně. V ECB režimu může být pod daným klíčem daný otevřený text zašifrován vždy do stejného šifrovaného textu. Pokud tato vlastnost nežádoucí v dané aplikaci, tak by neměl být režim ECB použit [5]. Vstupní blok Šifrovací funkce Výstupní blok Otevřený text Šifrování Dešifrování Vstupní blok Inverzní šifrovací funkce Výstupní blok Šifrovaný text Šifrovaný text Otevřený text Obr. 2.2: Schéma šifrování a dešifrování módu ECB [5]. Mód řetězení bloku šifry (The Cipher Block Chaining Mode - CBC) Jedná se o mód ochrany, jehož proces šifrování pracuje na kombinaci (řetězení) bloku otevřeného textu s předchozím blokem šifrovaného textu. Pro kombinaci prv- ního bloku otevřeného textu vyžaduje použití inicializačního vektoru, jenž nemusí být tajný, ale musí být nepředvídatelný [5]. První vstupní blok šifrování je tvořen XORem prvního bloku otevřeného textu s inicializačním vektorem a následně je podroben šifrovací funkcí. Výsledkem je první 18 blok šifrovaného textu. První výstupní blok z funkce je poté podroben operaci XOR s druhým blokem otevřeného textu a podroben šifrovací funkci a tím vznikne druhý blok šifrovaného textu [5]. Dešifrování probíhá vstupem prvního bloku šifrovaného text do inverzní šifrovací funkce a následně je blok dat s inicializačním vektorem podroben operaci XOR, pro obnovení prvního otevřeného textu. Druhý blok šifrovaného textu je podroben inverzní šifrovací funkcí a s prvním blokem šifrovaného textu přiveden na operaci XOR, pro obnovení druhého bloku otevřeného textu [5]. Vstupní blok 1 Šifrovací funkce Výstupní blok 1 Otevřený text 1 Šifrovaný text 1 Šifrování Inicializační vektor Dešifrování Vstupní blok n Šifrovací funkce Výstupní blok n Otevřený text n Šifrovaný text n Vstupní blok 1 Inverzní šifrovací funkce Výstupní blok 1 Šifrovaný text 1 Otevřený text 1 Vstupní blok n Inverzní šifrovací funkce Výstupní blok n Šifrovaný text n Otevřený text n Inicializační vektor Obr. 2.3: Schéma šifrování a dešifrování módu CBC [5]. Mód šifry se zpětnou vazbou (The Cipher Feedback Mode - CFB) Jedná se o mód ochrany, u kterého je následující segment šifrovaného textu zpětně vázán do vstupního bloku před šifrovací funkcí pro generování výstupních bloků, které jsou spojeny operací XOR s otevřeným textem [5]. Při šifrování je první vstupní blok inicializační vektor, jenž je podroben šifro- vací funkcí. První šifrovaný segment je tvořen XORem otevřeného textu s nejvíce 19 významnými bity (s bity) z prvního výstupního bloku a tím vznikne první blok šif- rovaného textu. Nejméně významné bity (b-s) bity z prvního výstupního bloku jsou zřetězeny s nejvíce významnými bity prvního šifrovaného bloku pro vytvoření dru- hého vstupního bloku, který je poté podroben šifrovací funkci. Tím vznikne druhý výstupní blok a jeho nejvíce významné bity jsou s druhým blokem otevřeného textu přivedeny na operaci XOR a tím vznikne druhý blok šifrovaného textu [5]. Pro dešifrování je první vstupní blok tvořen inicializačním vektorem a ostatní jsou vytvořeny zřetězením nejméně významnými bity z předchozího vstupního bloku s nejvíce významnými bity předchozího bloku šifrovaného text. Na vstupní bloky se poté aplikuje šifrovací funkce. Z výstupních bloku se poté použijí nejvíce významné bity, které jsou s odpovídajícím blokem šifrovaného textu přivedeny na opreci XOR, aby vznikl blok otevřeného textu [5]. Vstupní blok 1 Šifrovací funkce Výstupní blok 1 Vybrané | Zahozené s bity | (b-s) bity Otevřený text 1 s bity Šifrovaný text 1 s bity Šifrování Inicializační vektor Vstupní blok n (b-s) bity | s bity Šifrovací funkce Výstupní blok n Vybrané | Zahozené s bity | (b-s) bity Otevřený text n s bity Šifrovaný text n s bity Dešifrování Vstupní blok 1 Šifrovací funkce Výstupní blok 1 Vybrané | Zahozené s bity | (b-s) bity Šifrovaný text 1 s bity Otevřený text 1 s bity Inicializační vektor Vstupní blok n (b-s) bity | s bity Šifrovací funkce Výstupní blok n Vybrané | Zahozené s bity | (b-s) bity Šifrovaný text n s bity Otevřený text n s bity Obr. 2.4: Schéma šifrování a dešifrování módu CFB [5]. Mód výstupní zpětné vazby(The Output Feedback Mode - OFB) Mód ochrany, jenž opakováním vstupní šifry z inicializačního vektoru generuje sekvenci výstupních bloků, které jsou pomocí operace XOR s otevřeným textem 20 spojeny pro vytvoření šifrovaného textu. Inicializační vektor musí být pro každé provedení pro daný klíč unikátní [5]. Při šifrování je inicializační vektor podroben šifrovací funkci a následný výstupní blok je pomocí XORu spojen s prvním blokem otevřeného textu, čímž vznikne první blok šifrovaného textu. Následně je první výstupní blok z funkce použit na vstupu šifrovací funkce. Stejně jako v prvním kroku je výstup z šifrovací funkce podroben XORu s druhým blokem otevřeného bloku a tím vznikne druhý blok šifrovaného textu, jenž je použit na vstupu pro další blok [5]. Dešifrování probíhá podobným způsobem. V prvním kroku je inicializační vektor na vstupu šifrovací funkce. Jeho výstup je poté podroben XORu s prvním blokem šifrovaného textu pro vytvoření prvního bloku otevřeného textu. První výstupní blok z funkce je poté použit na vstupu šifrovací funkce a jeho výstup je poté spojen operací XOR s druhým blokem šifrovaného textu a použit zase na vstupu pro další blok [5]. Vstupní blok 1 Šifrovací funkce Výstupní blok 1 Otevřený text 1 Šifrovaný text 1 Šifrování Inicializační vektor Dešifrování Vstupní blok n Šifrovací funkce Výstupní blok n Otevřený text n Šifrovaný text n Vstupní blok 1 Šifrovací funkce Výstupní blok 1 Šifrovaný text 1 Otevřený text 1 Inicializační vektor Vstupní blok n Šifrovací funkce Výstupní blok n Šifrovaný text n Otevřený text n Obr. 2.5: Schéma šifrování a dešifrování módu OFB [5]. 21 Mód přepážek(The Counter Mode - CTR) Mód ochrany, který použitím vstupní šifry na sadu vstupních bloků, tzv. pře- pážky, vytvoří sekvenci výstupních bloků, které jsou operací XOR spojeny s ote- vřeným textem pro vytvoření šifrovaného textu. Sekvence přepážek musí mít tu vlastnost, že každý blok v pořadí se liší od všech ostatních bloků. Tato podmínka není omezena na jednu zprávu, ale na všechny zprávy, které jsou kódovány v rámci daného klíče [5]. Při šifrování je vstupní šifrovací funkce vyvolána v každém bloku přepážky a je- jich výsledný výstupní blok je pomocí XORu spojen s odpovídajícím otevřeným textem k vytvoření šifrovaného textu. Pro poslední blok, který může být částečný, jsou nejvýznamnější bity použity pro operace XOR, zbývající bity se zahodí [5]. Dešifrování probíhá voláním šifrovací funkce v každém bloku přepážky a jejich výstup je operací XOR spojen s odpovídajícím šifrovacím textem k získaní otevře- ného textu. Pro poslední blok, který může být částečný, jsou nejvýznamnější bity použity pro operace XOR, zbývající bity se zahodí [5]. Vstupní blok 1 Šifrovací funkce Výstupní blok 1 Otevřený text 1 Šifrovaný text 1 Šifrování Přepážka 1 Dešifrování Vstupní blok n Šifrovací funkce Výstupní blok n Otevřený text n Šifrovaný text n Vstupní blok 1 Šifrovací funkce Výstupní blok 1 Šifrovaný text 1 Otevřený text 1 Vstupní blok n Šifrovací funkce Výstupní blok n Šifrovaný text n Otevřený text n Přepážka n Přepážka 1 Přepážka n Obr. 2.6: Schéma šifrování a dešifrování módu CRT [5]. 22 3 EXPERIMENTÁLNÍ MĚŘENÍ 3.1 Základní informace 3.1.1 Mikro-kontrolér MSP430 Jedná se o jednočipový počítač z dílny Texas Instruments, které obsahují 16-bitové a 32-bitové procesory určené pro smíšené signály při velmi nízkém výkonu. Tyto mikro-kontroléry vykazuji nejnižší spotřebu energie a s kombinací integrovaných periférii je lze použít na různých místech. Jejich vlastností se využívá například v lékařských přístrojích, ve výrobě jako automatizace a řízení, v domácnosti jako termoregulace, detektory kouře ad. nebo pro různá měření v elektrotechnice aj. [9]. V téhle práci pro měření byl použit mikro-kontrolér MSP430f5438A. V tomto mikro-kontroléru se nachází digitální oscilátor, který může pracovat až na frekvenci 32 kHz a vnitřní krystal s frekvencí až 32 kHz. Tyhle vlastnosti mohou být použity jako generátor čísel pro kryptografické účely. Dalším důležitým aspektem je 16/32- bitová hardwarová násobička, jenž je potřebná pro složitější matematické operace. Ostatní vlastnosti mikro-kontroléru lze nalézt v datasheetu [10]. 3.1.2 Prostředí CCS (Code Composer Studio) CCS je integrované vývojové prostředí obsahující sadu nástrojů k vytvoření a la- dění vestavěných aplikací. To zahrnuje C/C++ překladač, editor zdrojového kódu, prostředí pro sestavení projektu, ladící program, mnoho dalších funkcí. Prostředí podporuje Texas Instrument mikro-kontroléry a Embedded Processors portfolio. CCS kombinuje výhody softwarového prostředí Eclipse s pokročilými ladícími schop- nostmi [7]. 3.2 Základní měření Pro všechna měření je nastaven model paměti kódu(code_mode) na hodnotu large, model paměti pro data(data_mode) na hodnotu small a indikace pro data (near_data), které musí být poblíž, na hodnotu globals. Hodnota frekvence není specifikována, neboť neovlivňuje počet cyklů, ale pouze rychlost provedení úkonů. Měření počtu cyklů se provádí zapnutím v nabídce Run→Clock→Enable a výsledná hodnota je zobrazena v pravém dolním rohu. Využití pamětí se po každém debugu, u kterého je provedena změna v kódu, ukládá do souboru s příponou .map, jenž se nachází ve složce Debug projektu. Pro základní měření bez optimalizace byla nastavena úroveň 23 optimalizace opt_level = off a optimalizace rychlosti opt_for_speed = 0. Tuhle optimalizaci umožňuje programovací prostředí CCS. 3.2.1 VUT implementace Výsledky měření implementace od VUT v cyklech je zapsána v Tab. 3.1. V Tab. 3.1 jsou uvedeny hodnoty pro jednotlivé operace a také celkový počet cyklů, jenž si vy- žádala operace šifrování a dešifrování. Z hodnot lze vyčíst, že nejnáročnější výpočet pro šifrování a dešifrování je kombinace sloupců. Operace dešifrování potřebovala pro svojí úlohu 8krát více cyklů než operace šifrování. Na následující Tab. 3.2 jsou uvedeny hodnoty použité paměti FLASH a RAM a celkový počet cyklů potřebných pro celou šifru. Z hlediska paměti celý kód programu využil 7586B paměti FLASH (z 41856B) a 2034B RAM (z 16384B). Tab. 3.1: Tabulka naměřených hodnot VUT implementace (vše v cyklech). Typ operace Šifrování Dešifrování Záměna bajtů 448 448 Prohození v řádcích 70 70 Kombinace sloupců 838 16259 Přidání pod-klíče 495 486 Iterace 1851 17263 Poslední iterace 1004 1003 Celkem 19035 157743 Tab. 3.2: Tabulka paměťové náročnosti a počet cyklů celé šifry VUT implementace. Celá šifra FLASH RAM Počet cyklů [B] [B] 207771 7586 2034 3.2.2 TI implementace Výsledky měření implementace od TI v cyklech je zapsána v Tab. 3.1. V Tab. 3.3 jsou uvedeny hodnoty pro jednotlivé operace a také celkový počet cyklů, jenž si vyžádala operace šifrování a dešifrování. Z hodnot je patrné, že jsou jednotlivé dílčí operace podobně náročné, až na kombinaci sloupců, která je z nich nejnáročnější. Operace dešifrování potřebovala pro svojí úlohu více cyklů než operace šifrování, přibližně o 9000 cyklů. V další Tab. 3.4 jsou uvedeny hodnoty použité paměti FLASH 24 a RAM a celkový počet cyklů potřebných pro celou šifru. Z hlediska paměti celý kód programu využil 2226B paměti FLASH (z 41856B) a 160B RAM (z 16384B). Tab. 3.3: Tabulka naměřených hodnot TI implementace (vše v cyklech). Typ operace Šifrování Dešifrování Záměna bajtů 368 375 Prohození v řádcích 80 80 Kombinace sloupců 999 1568 Přidání pod-klíče 338 333 Iterace 1806 2384 Poslední iterace 817 815 Celkem 17520 26161 Tab. 3.4: Tabulka paměťové náročnosti a počet cyklů celé šifry TI implementace. Celá šifra FLASH RAM Počet cyklů [B] [B] 44101 2226 160 3.2.3 Srovnání implementací V této části jsou porovnány výsledky z měření obou implementací. Na prvním Obr. 3.1 je zobrazeno srovnání jednotlivých operací šifrování bez optimalizace pro VUT a TI implementace. Na dalším Obr. 3.2 můžeme sledovat srovnání jednotlivých operací šifrování bez optimalizace pro VUT a TI implementace. Z výsledků lze vyčíst, že u šifrování u operací Kombinace sloupců a Proho- zení v řádcích je rychlejší implementace od VUT. V ostatních případech je na tom lépe implementace od TI. Největší rozdíly jsou u operací Kombinace sloupců, 161 cyklů, a Přidání pod-klíče, 157 cyklů. Celkově je implementace od TI rychlejší a to o 1515 cyklů. Největší rozdíly jsou dešifrování a to zejména u operace Kombinace sloupců, kde je implementace od TI mnohonásobně rychlejší. To je nejspíš zapříčiněno funkcí Multiply v implementaci VUT, jenž provádí násobení hodnoty z matice Rinjdael’s Galois field a matice state. U ostatních operací je taktéž implementace TI rychlejší, až na operaci Prohození v řádcích, kde je implementace od VUT o 10 cyklů rychlejší. Celkově je implementace od TI rychlejší o 131582 cyklů. 25 02000 4000 6000 8000 10000 12000 14000 16000 18000 20000 Záměna bajtů Prohození v řadcích Kombinace sloupců Přidání podklíče Iterace Poslední iterace Celkem P o če t cy kl ů Typ operace VUT TI Obr. 3.1: Srovnání výpočetní náročnosti šifrování implementací VUT a TI bez op- timalizace. 0 20000 40000 60000 80000 100000 120000 140000 160000 180000 Záměna bajtů Prohození v řadcích Kombinace sloupců Přidání podklíče Iterace Poslední iterace Celkem P o če t cy kl ů Typ operace VUT TI Obr. 3.2: Srovnání výpočetní náročnosti dešifrování implementací VUT a TI bez optimalizace. 26 Následně je zobrazen Obr. 3.3 s paměťovou náročností obou implementací. V pří- padě paměťové náročnosti je na tom implementace TI opět lépe, jelikož pro svojí činnost využila přibližně o 70% méně bajtů paměti FLASH a přibližně 93% méně paměti RAM. 0 1000 2000 3000 4000 5000 6000 7000 8000 Flash RAM B aj ty Typ paměti VUT TI Obr. 3.3: Srovnání paměťové náročnosti implementací VUT a TI bez optimalizace. 27 4 OPTIMALIZACE 4.1 Optimalizace pomocí CCS Prostředí CCS umožňuje použití optimalizačního nastavení pro mikro-kontroléry. Mezi základní optimalizační nastavení patří úroveň optimalizace (–opt_level), jenž má 5 úrovní, a optimalizace kódu vůči rychlosti. Hodnoty lze nastavit po kliknutí pravým tlačítkem na projekt a volba Properties→Build→MSP430 Compiler→Optimazation. 4.1.1 Úroveň optimalizace opt_level = 0 • Provádí zjednodušený graf řízení toku, • přidělení proměnných do registru, • eliminuje nepoužitý kód, • zjednodušuje výrazy a příkazy, • expanduje volání funkcí deklarovaných vložení, • provádí rotaci smyčky [8]. opt_level = 1 Provádí všechny optimalizace jako opt_level = 0 plus navíc: • Odstraňuje nepoužívané úkoly, • eliminuje lokální běžné výrazy, • provádí místní kopírování / neustálé množení [8]. opt_level = 2 Provádí všechny optimalizace jako opt_level = 1 plus navíc: • Provádí optimalizace smyčky, • odstranění globálních nevyužitých přiřazení, • provádí rozbalování smyček, • eliminuje globální běžné podvýrazy [8]. opt_level = 3 Provádí všechny optimalizace jako opt_level = 2 plus navíc: • Odstraní funkce, které nejsou nikdy volané, • zjednodušuje funkce s návratovou hodnotou, které nejsou nikdy použity, • vložená(Inlines) volání na malé funkce, 28 • změní pořadí deklarací funkce, • propaguje argumenty do funkčních orgánů, kdy všechny volání procházejí stej- nou hodnotou ve stejné pozici argumentu, • identifikuje proměnné vlastnosti na úrovni souborů [8]. opt_level = 4 Provádí všechny optimalizace jako opt_level = 3 plus navíc: Provádí optimalizaci link-time [8]. 4.1.2 Optimalizace kódu vůči rychlosti (opt_for_speed) Hodnota 5 označuje plnou optimalizace na rychlost s potenciálně velkým kódem, zatímco hodnota 0 označuje plnou optimalizace na velikost kódu. Hodnoty mezi 0 a 5 označuje kompromisy mezi oběma extrémy [8]. 4.1.3 Pokročilá optimalizace Tohle nastavení lze najít při kliknutí pravým tlačítkem na projekt a volba Proper- ties→Build→MSP430 Compiler→Advanced Options→Advanced Optimazation. optimizer_interlist, -os Generuje optimalizovaný zdroj interlist sestavy [8]. call_assumptions, -op Indikuje, zda může funkce volat v ostatních modulech externí funkce modulu nebo upravovat externí proměnné modulu. Je možné nastavit 4 hodnoty: • –call_assumptions=0 – Pokud má modul funkce, které jsou volány jiným mo- dulem a globální proměnnou, tak jsou upraveny jiným modulem, • –call_assumptions=1 – pokud nemá modul funkce, které jsou volány jiným modulem, ale má globální proměnou, tak jsou upraveny jiným modulem, • –call_assumptions=2 – pokud nemá modul funkce, které jsou volány jiným modulem nebo globální proměnnou, tak jsou upraveny jiným modulem, • –call_assumptions=3 - Pokud má modul funkce, které jsou volány jiným mo- dulem, ale nemá globální proměnou, tak jsou upraveny jiným modulem [8]. auto_inline Specifikuje hranici velikosti funkce. Pokud je funkce větší než zadaná hranice, tak není automaticky vložena. Existují 2 možnosti nastavení: 29 • pokud je nastavena velikost na 0, tak automatická expanze vložení je zakázaná, • pokud je velikost nenulová, tak kompilátor použije tuhle velikost jako limit pro velikost funkce automatického vložení [8]. single_inline Vložení funkce, které jsou volány jen jednou [8]. remove_hooks_when_inlining Odstraňuje vstupní/výstupní svorky z vložených funkcí [8]. gen_opt_info Tohle nastavení slouží k vytvoření souboru s optimalizačními informacemi. • –gen_opt_info=0 – nevytvoří informační soubor optimalizace, • –gen_opt_info=1 – vytvoří informační soubor optimalizace, • –gen_opt_info=2 – vytvoří podrobnější informační soubor optimalizace [8]. aliased_variables, -ma Předpokládá, že proměnné jsou přezdívány(pojmenovány) [8]. 4.1.4 Vliv optimalizační úrovně V této části bylo testováno jak moc ovlivní optimalizační úroveň počet cyklů, při kterém bylo nastavena hodnota pro opt_for_speed na 0. Z Obr. 4.1 lze vidět, že nej- lepší výsledek je dosažen při použití úrovně 3 a 4. Počet cyklů na těchto úrovní je skoro 5krát nižší než při vypnuté optimalizace. V Tab. 4.1 je vidět, že došlo i ke sní- žení náročnosti na FLASH paměť. Nejmenší náročnost na paměť FLASH vykazuje na optimalizační úrovni 1, kdy došlo k zlepšení o 43,84%. V případě využití pamětí RAM došlo k zlepšení o 8 bajtů, což je skoro zanedbatelné. Tab. 4.1: Vliv optimalizační úrovně. Optimalizační úroveň Počet cyklů FLASH[B] RAM[B] off 207771 7586 2034 0 106001 6978 2034 1 58420 4260 2034 2 60528 4514 2034 3 41997 4320 2030 4 41991 4318 2030 30 01000 2000 3000 4000 5000 6000 7000 8000 0 50000 100000 150000 200000 250000 off 0 1 2 3 4 Fl as h [B aj ty ] P o če t cy kl ů Optimalizační úroveň Počet cyklů Flash Obr. 4.1: Vliv optimalizační úrovně. 4.1.5 Vliv optimalizace kódu vůči rychlosti Při vypnuté optimalizační úrovni(opt_level=off) nedošlo k žádnému zlepšení. Proto bylo provedeno měření, při kterém byla optimalizační úroveň na hodnotu 4 a vý- sledky jsou zobrazeny Tab. 4.2. Při prvním extrému, kdy je kladen důraz na co nejmenší zatížení paměti FLASH, bylo potřeba celkem 41991 cyklů při zaplnění 4318B paměti FLASH. Při druhém extrému, který zase naopak klade důraz na co nejmenší počet cyklů, bylo potřeba 36147 cyklů při použití 5284B paměti. Rozdíl mezi extrémy je tedy 5844 cyklů a 966B paměti FLASH. Tab. 4.2: Vliv optimalizace kódu vůči rychlosti pro optimalizační úroveň = 4. –opt_for_speed Počet cyklů FLASH[B] RAM[B] 0 41991 4318 2030 1 41943 4322 2030 2 40215 4350 2030 3 38327 4620 2030 4 36147 5284 2030 5 36147 5284 2030 31 01000 2000 3000 4000 5000 6000 33000 34000 35000 36000 37000 38000 39000 40000 41000 42000 43000 0 1 2 3 4 5 Fl as h [b aj ty ] P o če t cy kl ů --opt_for_speed Počet cyklů Flash Obr. 4.2: Vliv optimalizace kódu vůči rychlosti pro optimalizační úroveň = 4. 4.1.6 Měření implementací s optimalizací Na základě předchozích výsledků bylo zvoleno nastavení pro měření s optimalizací, tak že hodnota optimalizační úrovně(opt_level) byla rovna 4 a hodnota optimalizace kódu vůči rychlosti (opt_for_speed) byla rovna 5. Tohle nastavení bylo zvoleno z důvodů získání co nejlepších výsledků v rámci rychlosti, tedy získání co nejmenšího počtu cyklů. Výsledky měření implementací s optimalizací jsou zobrazeny v Tab. 4.3, ve které jsou zobrazeny hodnoty pro jednotlivé operace a také celkový počet cyklů, jenž si vyžádala operace šifrování a dešifrování. Srovnání výsledků je zobrazeno na následu- jících obrázcích. Na prvním Obr. 4.3 je vyobrazena náročnost jednotlivých operací pro šifrování a druhý Obr. 4.4 pro dešifrování. Z výsledku je patrné, že po provedení softwarové optimalizace pomocí programu CCS je rychlostně na tom lépe implementace společnosti TI. Největší rozdíl mezi oběma implementacemi je opět při dešifrování, kde implementace TI je o polovinu rychlejší, což je zapříčiněno velkým počtem cyklů potřebných u operace Kombi- nování sloupců u implementace od VUT. Při operaci Poslední iterace u šifrování vykazuje implementace VUT o něco lepší výsledek než implementace TI, ale celkově je implementace TI rychlejší. 32 Tab. 4.3: Tabulka naměřených hodnot implementací VUT a TI s optimalizace (vše v cyklech). Šifrování Dešifrování VUT TI VUT TI Záměna bajtů 124 111 124 111 Prohození v řádcích 56 48 56 50 Kombinace sloupců 591 344 1980 574 Přidání pod-klíče 99 105 99 91 Iterace 870 659 2259 869 Poslední iterace 279 410 279 283 Celkem 8561 6460 20912 9357 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 Záměna bajtů Prohození v řadcích Kombinace sloupců Přidání podklíče Iterace Poslední iterace Celkem P o če t cy kl ů Typ operace VUT TI Obr. 4.3: Srovnání výpočetní náročnosti šifrování implementací VUT a TI s opti- malizací. 33 05000 10000 15000 20000 25000 Záměna bajtů Prohození v řadcích Kombinace sloupců Přidání podklíče Iterace Poslední iterace Celkem P o če t cy kl ů Typ operace VUT TI Obr. 4.4: Srovnání výpočetní náročnosti dešifrování implementací VUT a TI s opti- malizací. Následující Tab. 4.4 obsahuje výsledky naměřených hodnot paměťové náročnosti a počet cyklů potřebných pro celou šifru. Obr. 4.5 zobrazuje paměťovou náročnost obou implementací. Taktéž v paměťové náročnosti má lepší výsledky implementace TI, která použila 2628B (z 41856B) paměti FLASH a 160B (z 16384B) paměti RAM, což je přibližně 7% v případě FLASH a necelé 1%v případě RAM z celko- vého prostoru, zatímco implementace VUT využila 5284B FLASH paměti a 2030B paměti RAM, respektive 13% a 12,5% paměti FLASH a RAM z celkového pamě- ťového prostoru. Tab. 4.4: Tabulka paměťové náročnosti a počet cyklů celé šifry implementací VUT a TI. VUT TI Celá šifra Počet cyklů 36147 16213 FLASH [B] 5284 2628 RAM [B] 2030 160 34 01000 2000 3000 4000 5000 6000 Flash RAM B aj ty Typ paměti VUT TI Obr. 4.5: Srovnání paměťové náročnosti implementací VUT a TI s optimalizací. 4.2 Softwarová optimalizace V této části práce se prováděla úprava kódu pro získaní dalšího zlepšení v rámci rych- losti a paměťové náročnosti. Úprava kódu se prováděla u implementace od VUT. Na- stavení optimalizace zůstalo stejné jako v předchozí kapitole, tedy hodnota optima- lizační úrovně(–opt_level)) byla rovna 4 a hodnota optimalizace kódu vůči rychlosti (–opt_for_speed) byla rovna 5. Všechny upravené kódy jsou přiloženy v příloze. Prvním upravenou částí je operace AddRoundKey, jenž je rozepsán bez použití cyklu for. Tím bylo dosaženo zlepšení výsledku ze 99 cyklů na 90 a snížení pamě- ťové náročnosti paměti FLASH o 32B. Jelikož je tahle operace volána 11krát jak u šifrování i dešifrování, tak celkově úprava snížila počet cyklů o 198. Upraven kód byl i pro operace SubBytes a InvSubBytes. Obdobně jako u operace AddRoundKey je kód rozepsán bez použití cyklu for. Tahle úprava snížila počet cyklů ze 124 na hodnotu 120 a paměťovou náročnost paměti FLASH o 30B pro oba případy. Jak SubBytes, tak i InvSubBytes jsou volány celkem 10krát, což dohromady celkem snížilo počet cyklů o 80. Dále byla upravena operace MixColumn. Její úprava spočívala v překopírování kódu pro InvMixColumns a následnou úpravu matice Rinjdael’s Galois field, jenž je použita pro výpočet. V prvním průchodu si operace vyžádala 430 cyklů, tedy o 161 cyklů méně, a následující průchody potřebovali 460 cyklů, tedy o 131 cyklů méně. Operace je volána celkem 9krát, takže celkem se snížil počet cyklů přibližně o 1400 cyklů. Oproti tomu se zvýšila paměťová náročnost paměti FLASH o 50B. 35 Upravena byla i operací InvMixColumn. Kód byl vyhledán na internetu [11] a následně upraven pro VUT implementaci. Tento kód používá matice Rinjdael’s Galois field a funkci GMul, jenž provádí násobení dvou bajtů, v tomto případě se jedná o konstantu z matice a hodnotu z matice state. Úpravou kódu došlo ke snížení paměťová náročnost paměti FLASH o 700B, ale oproti tomu došlo k razantnímu nárůstu počtu cyklů a to na hodnotu 9534, což je o 7554 cyklů více oproti původní verzi. Poslední úpravou bylo vložení před vypočítaného pod-klíče RoundKey. Ten byl odvozen z funkce generovaniKlice. Pokud by bylo možné použít tuto úpravu i v reál- ném nasazení, tak by došlo ke snížení celkového počtu cyklů pro celou šifru o 6442 cyklů a ke snížení paměťové náročnosti paměti FLASH o 758B a paměti RAM o 526B. 4.3 Shrnutí V této části práce je obsaženo porovnání dosažených výsledků bez optimalizace a s optimalizací. 4.3.1 VUT implementace Na Obr. 4.6 a 4.7 je znázorněno srovnání výpočetní náročnosti šifrování, respektive dešifrování. V Tab. 4.5 jsou zapsané naměřené hodnoty pro VUT implementaci jak bez optimalizace, tak s optimalizací. Z výsledků je patrné, že optimalizací pomocí programu CCS došlo k razantnímu zrychlení. V obou případech došlo k redukci cyklů u operací Záměna bajtů a Prohození v řádcích o stejný počet, tedy o 324 cyklů respektive o 14 cyklů. Největší zlepšení je patrné u dešifrování, kdy se snížil celkový počet cyklů ze 157743 na pouhých 20912. Hlavním důvodem tohoto skoku je, že opti- malizace si lépe poradila s operací Kombinace sloupů, kde se snížil počet potřebných cyklů o 15004 cyklů. U šifrování došlo taktéž ke zlepšení, kdy celkový počet cyklů byl zredukován o více jak polovinu. 36 Tab. 4.5: Tabulka naměřených hodnot implementace VUT bez optimalizace a s op- timalizací (vše v cyklech). Šifrování Dešifrování bez opt. s opt. bez opt. s opt. Záměna bajtů 448 124 448 124 Prohození v řádcích 70 56 70 56 Kombinace sloupců 838 591 16259 1980 Přidání pod-klíče 495 99 486 99 Iterace 1851 870 17263 2259 Poslední iterace 1004 279 1003 279 Celkem 19035 8561 157743 20912 0 200 400 600 800 1000 1200 1400 1600 1800 2000 Záměna bajtů Prohození v řadcích Kombinace sloupců Přidání podklíče Iterace Poslední iterace P o če t cy kl ů Typ operace bez opt. s opt. Obr. 4.6: Srovnání výpočetní náročnosti VUT implementace při šifrování. 37 02000 4000 6000 8000 10000 12000 14000 16000 18000 20000 Záměna bajtů Prohození v řadcích Kombinace sloupců Přidání podklíče Iterace Poslední iterace P o če t cy kl ů Typ operace bez opt. s opt. Obr. 4.7: Srovnání výpočetní náročnosti VUT implementace při dešifrování. V následující Tab. 4.6 jsou zapsané hodnoty paměťové náročnosti a počet cyklů potřebných pro celou šifru. Na Obr. 4.8 je zobrazena paměťová náročnost. V rámci optimalizace došlo i ke zlepšení paměťové náročnosti a to zejména pro paměť FLASH, kde se zredukoval potřebný prostor 2302B. V případě paměti RAM došlo ke zlepšení pouze o 4B. Celá šifra po optimalizaci potřebovala pro svojí funkci 36147 cyklů, což je o 171624 cyklů méně. Tab. 4.6: Tabulka paměťové náročnosti a počet cyklů celé šifry implementace VUT. bez opt. s opt. Celá šifra Počet cyklů 207771 36147 FLASH [B] 7586 5284 RAM [B] 2034 2030 38 01000 2000 3000 4000 5000 6000 7000 8000 Flash RAM B aj ty Typ paměti bez opt. s opt. Obr. 4.8: Srovnání paměťové náročnosti VUT implementace. 4.3.2 TI implementace V Tab. 4.7 jsou zobrazeny hodnoty pro jednotlivé operace pro šifrování a dešif- rování, jak s optimalizací, tak i bez ní. Porovnání je zobrazeno i na následujících obrázcích. První Obr. 4.9 zobrazuje porovnání jednotlivých operací pro šifrování bez optimalizace a s optimalizací a na druhém Obr. 4.10 je zobrazeno to samé, ale pro dešifrování. Z tabulky lze vyčíst, že optimalizací pomocí CCS došlo ke zlepšení u všech typů operace. U operací Záměna bajtů,Kombinace sloupců a Přidání pod-klíče došlo k redukci cyklů přibližně o jednu třetinu. U operace Prohození v řádcích k tak velké redukci nedošlo, ale byla snížena potřeba o 30 cyklů. 39 Tab. 4.7: Tabulka naměřených hodnot implementace TI bez optimalizace a s opti- malizací (vše v cyklech). Šifrování Dešifrování bez opt. s opt. bez opt. s opt. Záměna bajtů 368 111 375 111 Prohození v řádcích 80 48 80 50 Kombinace sloupců 999 344 1568 574 Přidání pod-klíče 338 105 333 91 Iterace 1806 659 2384 869 Poslední iterace 817 410 815 283 Celkem 17520 6460 26161 9357 0 200 400 600 800 1000 1200 1400 1600 1800 2000 Záměna bajtů Prohození v řadcích Kombinace sloupců Přidání podklíče Iterace Poslední iterace P o če t cy kl ů Typ operace bez opt. s opt. Obr. 4.9: Srovnání výpočetní náročnosti TI implementace při šifrování. V následující Tab. 4.8 jsou zapsané naměřené hodnoty paměťové náročnosti a počet cyklů potřebných pro celou šifru bez optimalizace a s optimalizací. Na Obr. 4.11 je prezentována paměťová náročnost. U paměťové náročnosti došlo ke zhoršení, jelikož po optimalizaci si implementace vyžádala o 402B paměti FLASH více než bez optimalizace. V případě paměti RAM nedošlo k žádné změně a tak zůstala na hod- notě 160 bajtů. Celkový počet cyklů potřebných pro implementaci byl optimalizací zredukován ze 44101 cyklů na 16213 cyklů. 40 0500 1000 1500 2000 2500 3000 Záměna bajtů Prohození v řadcích Kombinace sloupců Přidání podklíče Iterace Poslední iterace P o če t cy kl ů Typ operace bez opt. s opt. Obr. 4.10: Srovnání výpočetní náročnosti TI implementace při dešifrování. Tab. 4.8: Tabulka paměťové náročnosti a počet cyklů celé šifry implementace TI. bez opt. s opt. Celá šifra Počet cyklů 44101 16213 FLASH [B] 2226 2628 RAM [B] 160 160 0 500 1000 1500 2000 2500 3000 Flash RAM B aj ty Typ paměti bez opt. s opt. Obr. 4.11: Srovnání paměťové náročnosti TI implementace. 41 5 ZÁVĚR V této bakalářské práci byl kladen důraz na optimalizaci kódu pomocí optimalizace, jenž umožňuje prostředí CCS a případnou úpravou stávajícího kódu. Hlavním pa- rametrem optimalizace byl počet cyklů potřebných pro provedení různých operací, tedy na rychlost provedení dané operace, a také snížení paměťové náročnosti. Použitím optimalizace programu CCS došlo v případě implementace od VUT k redukci potřebných cyklů téměř o 83%. Nejvíce se optimalizace projevila v de- šifrování, kde u operace InvMixColumn došlo k razantní redukci cyklů. Potřebný prostor v paměti Flash byl zredukován přibližně o 30%, zatímco u paměti typu RAM došlo ke snížení pouze o 4B. V případě implementace od TI optimalizace programem CCS snížila potřebný počet cyklů přibližně o 63%, ale potřebný prostor v paměti Flash byl navýšen o 18%. Počet cyklů u všech operací byl zredukován na jednu třetinu původní hodnoty, až na operaci SubBytes, kde zlepšení představovalo 30B. Porovnáním obou implementací vychází implementace od TI lépe, jenž má lépe zpracován kód v případě dešifrování, kde je největší rozdíl mezi těmito implementacemi (11555 cyklů). Při šifrování rozdíl není až tak markantní, přibližně 2100 cyklů. Hlavním nedostatkem implementace VUT je operace InvMixColumns, který 4x náročnější než u TI. Implementace od VUT byla podrobena softwarové optimalizaci kódu. Úpravou kódu pro operace SubBytes a InvSubBytes došlo jen k malému zlepšení a to 4 cykly, ale tyto operace jsou volány 10krát, což vede k celkové redukci o 160B. Úpravou operace AddRoundKey se dosáhlo snížení o 9 cyklu a tato operace je volána cel- kem 22krát, jenž vede k celkovému snížení o 198 cyklů. Další upravenou operací byla MixColumn, kdy byla použita stejná syntaxe původní operace InvMixColumn a byla pozměněna matice Rinjdael’s Galois field. Touhle úpravou došlo ke snížení o 131 cyklů a tedy celkově přibližně o 1400 cyklů. Úprava pro operaci InvMixCo- lumn vedla ke zvýšení počtu cyklů o 7554, ale povedlo se snížit snížit paměťovou náročnost pro paměť Flash o 700B. Byl proveden i pokus, kdy byl před vypočítán pod-klíč a vložen jako pole. Pokud by se v reálném nasazení dokázalo předejít po- čítaní pod-klíče v kódu, došlo by k redukci o 6442 cyklů pro celou šifru a snížení paměťové náročnosti o 758B paměti FLASH a o 526B paměti RAM. Pro nejnáročnější operaci InvMixColumn se nepovedlo vytvořit softwarovou opti- malizaci kódu, jenž by vedla ke snížení počtu cyklů. Řešením by mohlo být upravení definice funkceMultiply nebo jejího úplného nahrazení, jelikož se zda jako výpočetně nejvíce náročná. 42 LITERATURA [1] Kamilla Amirová Úvod do kryptografie [online]. [cit. 28. 4. 2016]. Dostupné z URL: . [2] Jaroslav Pinkava Úvod do kryptografie [cit. 28. 4. 2016]. [3] Wikipedia Foundation RC4 [online]. [cit. 28. 4. 2016]. Dostupné z URL: . [4] Federal Information Processing Standards ADVANCED ENCRYPTION STANDARD (AES) [online]. [cit. 28. 4. 2016]. Dostupné z URL: . [5] National Institute of Standards and Technology Recommendation for Block Ci- pher Modes of Operation [online]. [cit. 28. 4. 2016]. Dostupné z URL: . [6] Radek Fujdiak, Petr Mlýnek Advanced Encryption Standard v Nízko- výkonových Zařízeních [online]. [cit. 28. 4. 2016]. Dostupné z URL: . [7] Texas Instruments Code Composer Studio (CCS) Integrated Development En- vironment (IDE) [online]. [cit. 28. 4. 2016]. Dostupné z URL: . [8] Texas Instruments MSP430 Optimizing C/C++ Compiler v15.12.0.LTS [online]. [cit. 28. 4. 2016]. Dostupné z URL: . [9] Texas Instruments MSP Low-Power Microcontrollers [online]. [cit. 28. 4. 2016]. Dostupné z URL: . [10] Texas Instruments MSP430F543xA, MSP430F541xA Mixed-Signal Microcont- rollers [online]. [cit. 28. 4. 2016]. Dostupné z URL: . [11] Sam Trenholme’s webpage Rijndael’s mix column stage [online]. [cit. 28. 4. 2016]. Dostupné z URL: . 43 SEZNAM SYMBOLŮ, VELIČIN A ZKRATEK AES Advanced Encryption Standard - Standard pokročilého šifrování CBC The Cipher Block Chaining Mode CCS Code Composer Studio CFB The Cipher Feedback Mode CTR The Counter Mode ECB The Electronic Codebook Mode FLASH Elektricky programovatelná paměť s libovolným přístupem HTTPS Hypertext Transfer Protocol Secure Nb Počet 32-bitových slov ve stavu Nk Velikost klíče Nr Počet iterací OFB The Output Feedback Mode TI Texas Instruments VUT Vysoké učení technické XOR Exkluzivní disjunkce RAM Random-access Memory 44 SEZNAM PŘÍLOH A Obsah CD 46 B Upravené kódy 47 B.1 AddRoundKey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 B.2 SubBytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 B.3 InvSubBytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 B.4 MixColumns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 B.5 InvMixColumns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 B.6 RoundKey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 45 A OBSAH CD • Bakalářská práce v elektronické podobě. • Projekt s implementací VUT. • Projekt s implementací TI. • Návod na spuštění projektu. 46 B UPRAVENÉ KÓDY B.1 AddRoundKey state[0][0] ˆ= RoundKey[round * Nb * 4 + 0 * Nb + 0]; state[1][0] ˆ= RoundKey[round * Nb * 4 + 0 * Nb + 1]; state[2][0] ˆ= RoundKey[round * Nb * 4 + 0 * Nb + 2]; state[3][0] ˆ= RoundKey[round * Nb * 4 + 0 * Nb + 3]; state[0][1] ˆ= RoundKey[round * Nb * 4 + 1 * Nb + 0]; state[1][1] ˆ= RoundKey[round * Nb * 4 + 1 * Nb + 1]; state[2][1] ˆ= RoundKey[round * Nb * 4 + 1 * Nb + 2]; state[3][1] ˆ= RoundKey[round * Nb * 4 + 1 * Nb + 3]; state[0][2] ˆ= RoundKey[round * Nb * 4 + 2 * Nb + 0]; state[1][2] ˆ= RoundKey[round * Nb * 4 + 2 * Nb + 1]; state[2][2] ˆ= RoundKey[round * Nb * 4 + 2 * Nb + 2]; state[3][2] ˆ= RoundKey[round * Nb * 4 + 2 * Nb + 3]; state[0][3] ˆ= RoundKey[round * Nb * 4 + 3 * Nb + 0]; state[1][3] ˆ= RoundKey[round * Nb * 4 + 3 * Nb + 1]; state[2][3] ˆ= RoundKey[round * Nb * 4 + 3 * Nb + 2]; state[3][3] ˆ= RoundKey[round * Nb * 4 + 3 * Nb + 3]; B.2 SubBytes state[0][0] = (int )sbox2[state[0][0]]; state[0][1] = (int )sbox2[state[0][1]]; state[0][2] = (int )sbox2[state[0][2]]; state[0][3] = (int )sbox2[state[0][3]]; state[1][0] = (int )sbox2[state[1][0]]; state[1][1] = (int )sbox2[state[1][1]]; state[1][2] = (int )sbox2[state[1][2]]; state[1][3] = (int )sbox2[state[1][3]]; state[2][0] = (int )sbox2[state[2][0]]; state[2][1] = (int )sbox2[state[2][1]]; state[2][2] = (int )sbox2[state[2][2]]; state[2][3] = (int )sbox2[state[2][3]]; state[3][0] = (int )sbox2[state[3][0]]; state[3][1] = (int )sbox2[state[3][1]]; state[3][2] = (int )sbox2[state[3][2]]; 47 state[3][3] = (int )sbox2[state[3][3]]; B.3 InvSubBytes state[0][0] = (int )rsbox[state[0][0]]; state[0][1] = (int )rsbox[state[0][1]]; state[0][2] = (int )rsbox[state[0][2]]; state[0][3] = (int )rsbox[state[0][3]]; state[1][0] = (int )rsbox[state[1][0]]; state[1][1] = (int )rsbox[state[1][1]]; state[1][2] = (int )rsbox[state[1][2]]; state[1][3] = (int )rsbox[state[1][3]]; state[2][0] = (int )rsbox[state[2][0]]; state[2][1] = (int )rsbox[state[2][1]]; state[2][2] = (int )rsbox[state[2][2]]; state[2][3] = (int )rsbox[state[2][3]]; state[3][0] = (int )rsbox[state[3][0]]; state[3][1] = (int )rsbox[state[3][1]]; state[3][2] = (int )rsbox[state[3][2]]; state[3][3] = (int )rsbox[state[3][3]]; B.4 MixColumns int i; unsigned char a,b,c,d; for(i=0;i<4;i++) { a = state[0][i]; b = state[1][i]; c = state[2][i]; d = state[3][i]; state[0][i] = Multiply(a, 0x02) ˆ Multiply(b, 0x03) ˆ Multiply(c, 0x01) ˆ Mul- tiply(d, 0x01); state[1][i] = Multiply(a, 0x01) ˆ Multiply(b, 0x02) ˆ Multiply(c, 0x03) ˆ Mul- tiply(d, 0x01); state[2][i] = Multiply(a, 0x01) ˆ Multiply(b, 0x01) ˆ Multiply(c, 0x02) ˆ Mul- tiply(d, 0x03); state[3][i] = Multiply(a, 0x03) ˆ Multiply(b, 0x01) ˆ Multiply(c, 0x01) ˆ Mul- tiply(d, 0x02); } 48 B.5 InvMixColumns unsigned char GMul(unsigned char a,unsigned char b) { // Galois Field (256) Mul- tiplication of two Bytes char p = 0; char counter; char hi_bit_set; for (counter = 0; counter < 8; counter++) { if ((b & 1) != 0) { p ˆ= a; } hi_bit_set = (char) (a & 0x80); a «= 1; if (hi_bit_set != 0) { a ˆ= 0x1b; /* xˆ8 + xˆ4 + xˆ3 + x + 1 */ } b »= 1; } return p; } void InvMixColumns(){ int i; unsigned char a,b,c,d; for (i = 0; i < 4; i++) { a = state[0][i]; b = state[1][i]; c = state[2][i]; d = state[3][i]; state[0][i] = GMul(0x0e, a) ˆ GMul(0x0b, b) ˆ GMul(0x0d, c) ˆ GMul(0x09, d); state[1][i] = GMul(0x09, a) ˆ GMul(0x0e, b) ˆ GMul(0x0b, c) ˆ GMul(0x0d, d); state[2][i] = GMul(0x0d, a) ˆ GMul(0x09, b) ˆ GMul(0x0e, c) ˆ GMul(0x0b, d); state[3][i] = GMul(0x0b, a) ˆ GMul(0x0d, b) ˆ GMul(0x09, c) ˆ GMul(0x0e, d); } } 49 B.6 RoundKey unsigned char RoundKey[240]={ 0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, 0xd7,0xaa,0x74,0xfd,0xd3,0xaf,0x72,0xfa,0xdb,0xa6,0x78,0xf1,0xd7,0xab,0x76,0xfe, 0xb7,0x92,0xcf,0xf3,0x64,0x3d,0xbd,0x09,0xbf,0x9b,0xc5,0xf8,0x68,0x30,0xb3,0x06, 0xb7,0xff,0xa0,0xb6,0xd3,0xc2,0x1d,0xbf,0x6c,0x59,0xd8,0x47,0x04,0x69,0x6b,0x41, 0x46,0x80,0x23,0x44,0x95,0x42,0x3e,0xfb,0xf9,0x1b,0xe6,0xbc,0xfd,0x72,0x8d,0xfd, 0x16,0xdd,0x77,0x10,0x83,0x9f,0x49,0xeb,0x7a,0x84,0xaf,0x57,0x87,0xf6,0x22,0xaa, 0x74,0x4e,0xdb,0x07,0xf7,0xd1,0x92,0xec,0x8d,0x55,0x3d,0xbb,0x0a,0xa3,0x1f,0x11, 0x3e,0x8e,0x59,0x60,0xc9,0x5f,0xcb,0x8c,0x44,0x0a,0xf6,0x37,0x4e,0xa9,0xe9,0x26, 0x6d,0x90,0xae,0x4f,0xa4,0xcf,0x65,0xc3,0xe0,0xc5,0x93,0xf4,0xae,0x6c,0x7a,0xd2, 0x26,0x4a,0x1b,0xab,0x82,0x85,0x7e,0x68,0x62,0x40,0xed,0x9c,0xcc,0x2c,0x97,0x4e, 0x61,0xc2,0x34,0xe0,0xe3,0x47,0x4a,0x88,0x81,0x07,0xa7,0x14,0x4d,0x2b,0x30,0x5a, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; 50