UNICORN COLLEGE BAKALÁŘSKÁ PRÁCE 2017 Marek ŠMÍD
UNICORN COLLEGE Katedra informačních technologií BAKALÁŘSKÁ PRÁCE Možnosti prolomení RSA pomocí celočíselného programování: empirická studie Autor BP: Marek Šmíd Vedoucí BP: doc. RNDr. Ing. Michal Černý, Ph.D. 2017 Praha
Čestné prohlášení Prohlašuji, že jsem svou bakalářskou práci na téma Možnosti prolomení RSA pomocí celočíselného programování: empirická studie vypracoval samostatně pod vedením vedoucího bakalářské práce a s použitím výhradně odborné literatury a dalších informačních zdrojů, které jsou v práci citovány a jsou také uvedeny v seznamu literatury a použitých zdrojů. Jako autor této bakalářské práce dále prohlašuji, že v souvislosti s jejím vytvořením jsem neporušil autorská práva třetích osob a jsem si plně vědom následků porušení ustanovení 11 a následujících autorského zákona č. 121/2000 Sb. V Praze dne 3. srpna 2017 (Marek Šmíd)
Poděkování Děkuji vedoucímu mé bakalářské práce panu doc. RNDr. Ing. Michalu Černému, Ph.D. za účinnou metodickou, pedagogickou a odbornou pomoc a další cenné rady, které mi pomohly tuto práci zkompletovat.
Možnosti prolomení RSA pomocí celočíselného programování: empirická studie Possibilities for cracking RSA with integer programming: An empirical study 6
Abstrakt Tato bakalářská práce se zabývá zejména empirickým studiem možnosti faktorizovat RSA moduly pomocí SAT a ILP solvery. Cílem této bakalářské práce je zjištění, jak efektivní jsou vybrané open source solvery typu ILP a SAT při faktorizování klíčů RSA. Další zjišťování je zaměřeno na to, jestli jsou solvery typu ILP a SAT stejně výkonné, nebo jestli je některý z nich efektivnější. Efektivita jednotlivých solverů byla zjišťováva pomocí empirické studie. Z empirické studie vyšel závěr, že solvery typu SAT jsou řádově efektivnější při faktorizaci klíčů RSA, než solvery typu ILP. Pomocí ILP solverů se podařilo efektivně faktorizovat pouze klíče velikosti 10 bitů respektive 12 bitů, kdežto pomocí SAT solverů bylo možno efektivně faktorizovat klíče velikosti 32 bitů. SAT solvery byly také efektivnější oproti ILP solverům ve spotřebě času na daný problém. Klíčová slova: RSA, celočíselné programování, faktorizační algoritmus, SAT, ILP, booleovský obvod, soukromý klíč, veřejný klíč 7
Abstract The empirical study presented in this bachelor thesis addresses the possibility to factorize RSA modules using ILP and SAT solvers. The goal of the bachelor thesis has been to find out how efficient were selected open source solvers ILP and SAT in the factorization of RSA keys. Further investigation focused on whether ILP and SAT solvers have the same efficiency or whether they vary. The efficiency of each solver has been tested empirically. The conclusion drawn from this empirical study is that SAT solvers are more efficient at factorizing RSA keys than ILP solvers. Using ILP solvers, only 10-bit and 12-bit keys could be efficiently factorized, whereas using SAT solvers, I have been able to efficiently factorize 32-bit keys. SAT solvers were also more efficient than ILP solvers with regard to time needed to solve the issue. Keywords: RSA, integer programming, factoring algorithm, SAT, ILP, boolean circuit, private key, public key 8
Obsah Úvod... 12 Nejdůležitější výsledky... 14 1 Úvod do kryptografie RSA... 15 1.1 Koncept RSA... 15 1.2 Tvorba páru soukromého a veřejného klíče... 16 1.3 Šifrování... 17 1.4 Dešifrování... 18 1.5 Podepisování... 19 2 Metody prolamování RSA... 21 2.1 Útoky na podstatu bezpečnosti RSA... 21 2.1.1 Integer Factoring Attack... 21 2.2 Útoky využívající nevhodnou volbu parametrů klíče... 22 2.2.1 Håstad's Broadcast Attack... 22 2.2.2 Wiener s Attack... 23 2.3 Útoky využívající kompromitaci části klíče... 24 2.3.1 Partial Key Exposure Attack... 24 2.4 Útoky na RSA s triviálním paddingem... 24 2.4.1 Common Modulus Attack... 24 2.4.2 Coppersmith s Short Pad Attack... 25 3 Vybrané open source solvery... 26 3.1 Způsoby faktorizace... 26 3.1.1 Intuitivní postup... 26 3.1.2 GNFS (The General Number Field Sieve)... 26 3.2 Boolean Satisfiability Problem... 27 3.3 Integer Linear Programming... 27 3.4 Algoritmy SAT a ILP solverů... 28 3.4.1 SAT solvery... 28 3.4.2 ILP solvery... 29 3.5 Problematika faktorizace pomocí SAT a ILP solverů... 29 4 Empirická studie... 30 4.1 Cíle empirické studie... 30 9
4.2 Faktorizační obvod... 30 4.2.1 Sčítačka... 30 4.2.2 Násobička... 31 4.3 Příprava dat... 32 4.3.1 Příprava dat pro faktorizační obvod... 32 4.3.2 Příprava dat pro solvery... 32 4.4 Výstupní data... 35 4.5 Průběh testování... 36 4.5.1 Zpracování vstupních dat pomocí scriptů... 36 4.5.2 Shromažďování výstupů... 36 4.6 Informace pro zopakování měření... 37 4.6.1 Použitá data... 37 4.6.2 Testovací prostředí... 37 5 Dosažené výsledky... 38 5.1 Faktorizační obvody... 38 5.1.1 Závislost počtu proměnných na typu obvodu... 39 5.1.2 Závislost počtu klauzulí na typu obvodu... 40 5.2 SAT solvery... 41 5.2.1 MiniSat... 41 5.2.2 PicoSAT... 44 5.2.3 MiniSat vs. PicoSAT... 47 5.3 ILP solvery... 48 5.3.1 GLPK vs. lp_solve... 48 5.4 SAT vs. ILP solvery... 49 6 Diskuze nad naměřenými hodnotami... 50 6.1 Faktorizační obvody... 50 6.2 SAT solvery... 51 6.2.1 Naměřené hodnoty... 51 6.2.2 MiniSat vs. PicoSAT... 51 6.3 ILP solvery... 52 6.3.1 Naměřené hodnoty... 52 6.4 SAT vs. ILP solvery... 53 6.4.1 Faktorizační obvod... 54 6.4.2 Celková spotřeba času... 54 10
Závěr... 55 Conclusion... 56 Seznam použitých zdrojů... 57 Seznam obrázků... 59 Seznam tabulek... 60 Seznam grafů... 61 Seznam příloh... 62 Příloha A Zdrojové kódy... 63 Příloha B Použitá data... 64 Extended Summary 11
Úvod Algoritmus RSA je druh asymetrické šifry. Asymetrické šifry jsou postaveny na využití dvou rozdílných klíčů (veřejný, soukromý), které jsou spolu provázané. S tímto algoritmem se nejčastěji setkáme, pokud chceme šifrovat, dešifrovat nebo podepsat důvěrná data. Podstata bezpečnosti základního algoritmu RSA je založena na předpokladu, že vynásobení dvou čísel je výpočetně snadná až triviální operace. Naproti tomu, zpětné získání dvou původních čísel (faktorizace) je výpočetně velmi obtížná až takřka nerealizovatelná operace. Existuje mnoho nástrojů a postupů, které je možné použít při prolamování algoritmu RSA. V této práci jsem se zaměřil na open source solvery typu integer linear programming, zkráceně ILP, a boolean satisfiability problém, zkráceně SAT. SAT i ILP jsou druhy problémů, které spadají do kategorie NP-úplných problémů. Cílem této práce je získat informace o tom, jestli jsou tyto solvery schopné si poradit s faktorizací modulu N šifrovacího algoritmu RSA. Pokud si vybrané solvery budou schopné poradit s faktorizací modulu N algoritmu RSA, bude nás zajímat jejich efektivita. Další oblast, které se tato práce věnuje, je porovnání SAT a ILP solverů. Z výsledků měření byly získány informace o tom, který z těchto solverů je efektivnější. Dále bylo zajímavé pozorovat, jak se na celkové efektivitě projevil typ rozdílného algoritmu, který tyto solvery využívají. Práce je rozčleněna do tří částí (teoretická, praktická, závěr). V teoretické části je popsán princip, jakým se algoritmus RSA používá k šifrování, dešifrování a podepisování dokumentů a co je zapotřebí, abychom mohli tyto operace provést. Následuje popis některých útoků, které tvoří základ útoků, které se používají v dnešní době. Tyto útoky jsou rozčleněny do skupin podle toho, na co při prolamování cílí, respektive jestli využívají chyb při implementaci, nebo jestli útočí přímo na samotný princip bezpečnosti algoritmu RSA. V závěru teoretické části je popsáno, co jsou to vlastně problémy typu SAT, ILP a jak se od sebe odlišují vybrané solvery. Na úvod praktické části je představeno vše, co je zapotřebí pro vykonání empirické studie. Nejprve je představen faktorizační obvod a jeho komponenty, následně je popsáno, jak byla získána potřebná testovací data a jak se musela tato data upravit, aby se s nimi mohlo dále pracovat. Praktická část je zakončena grafickou prezentací naměřených dat, která mají pro práci zásadní význam a diskusí nad dosaženými výsledky. 12
Závěrečná část je věnována shrnutí celé práce a vyhodnocení empirické studie. Vyhodnocení je převážně zaměřeno na to, jestli se podařilo dosáhnout vytyčených cílů, nebo zda byly během empirické studie získány předem neočekávané výstupy. 13
Nejdůležitější výsledky Volba typu sčítačky má s rostoucí velikostí klíče velký vliv na počet proměnných o kapitola 5.1.1 Volba typu sčítačky má s rostoucí velikostí klíče velký vliv na počet klauzulí o kapitola 5.1.2 Volba typu obvodu má velký vliv na to, jak velkou spotřebu zdrojů budou mít solvery o kapitola 5.2.1 o kapitola 5.2.2 MiniSat (SAT) je výrazně rychlejší při řešení problémů než PicoSAT (SAT) o kapitola 5.2.3 lp_solve (ILP) je výrazně rychlejší při řešení problémů než GLPK (ILP) o kapitola 5.3.1 SAT solvery jsou výrazně rychlejší při řešení problémů než ILP solvery o kapitola 5.4 14
1 Úvod do kryptografie RSA 1.1 Koncept RSA Koncept algoritmu RSA, který je pojmenovaný podle svých tvůrců (Rivest, Shamir, Adleman), byl poprvé publikován v roce 1978 ve článku [13]. Algoritmus RSA je založen na principu asymetrické kryptografie, která byla popsána v roce 1976 ve článku [10], jehož autory jsou Diffie a Hellman. Princip asymetrické kryptografie je založen na využití dvou rozdílných klíčů pro šifrování a dešifrování, které tvoří jedinečný pár. První klíč se označuje jako veřejný a slouží k šifrování dat. Druhý klíč se označuje jako soukromý a používá se k dešifrování dat. Data, která byla zašifrována veřejným klíčem, mohou být dešifrována pouze korespondujícím soukromým klíčem. Podstata bezpečnosti základního algoritmu RSA je založena na zdánlivě jednoduché myšlence. Myšlenka tohoto principu je založena na tom, že vynásobení dvou čísel (v případě algoritmu RSA dvou značně velkých prvočísel) a získání výsledného součinu je výpočetně snadná operace. Pokud však budeme chtít získat zpět ona dvě původní prvočísla, ze kterých se tento součin skládá, jedná se o výpočetně velmi obtížnou operaci. Tato operace se označuje slovem faktorizace. Pokud budeme chtít algoritmus RSA používat, musíme nejprve vygenerovat dvojici veřejného a soukromého klíče. Jak se tato dvojice klíčů generuje, je popsáno v kapitole 1.2. Pokud máme oba dva klíče vygenerované, soukromý klíč si ponecháme a udržujeme ho v tajnosti, naproti tomu veřejný klíč poskytneme druhé straně, se kterou chceme bezpečně komunikovat. Pokud bude druhá strana s námi chtít bezpečně komunikovat, zprávu zašifruje pomocí námi poskytnutého veřejného klíče a zprávu nám odešle. Protože jsme jedinými vlastníky odpovídajícího soukromého klíče, nikdo jiný kromě nás by neměl být schopen tuto zprávu dešifrovat a přečíst si ji. Třetí strana se může teoreticky dostat k obsahu této zprávy a přečíst si její text, pokud se jí podaří tuto zprávu zachytit a dešifrovat. Vybrané přístupy, které lze použít k prolomení algoritmu RSA, jsou popsány v kapitole 2. Další oblast, ve které se algoritmus RSA používá, je podepisování dokumentů. Tato operace se provádí proto, abychom mohli obdrženou zprávu přiřadit ke konkrétní osobě. Pokud by se vyskytl problém s přiřazením zprávy ke konkrétní osobě, víme, že nemůžeme tuto zprávu nadále považovat za důvěryhodnou. 15
Pro vyšší bezpečnost se základní algoritmus RSA rozšiřuje o různá šifrovací schémata. Pomocí šifrovacího schématu jsou vstupní data upravena ještě předtím, než jsou zašifrována pomocí samotného algoritmu RSA. Pro šifrování se používá např. schéma Optimal Asymmetric Encryption Padding (RSA-OAEP), pro podepisování se používá např. schéma Probabilistic Signature Scheme (RSA-PSS). 1.2 Tvorba páru soukromého a veřejného klíče Při tvorbě dvojice soukromého a veřejného klíče bychom měli postupovat systematicky a zároveň dodržovat předem daná doporučení. Pokud při tvorbě klíčů nebudeme dodržovat doporučení, zvýšíme tím riziko, že třetí strana bude schopna po odchycení dešifrovat a přečíst si zašifrovanou zprávu jen s vynaložením minimálního úsilí. Při tvorbě klíčů vycházíme z [10]. Tvorba dvojice soukromého a veřejného klíče se skládá z těchto kroků: 1. Nejprve náhodně vygenerujeme dvě dostatečně velká prvočísla. 1.1. Vygenerujeme náhodné číslo odpovídající délky. 1.2. Vygenerované číslo otestujeme na prvočíselnost. 1.3. Pokud vygenerované číslo nesplňuje požadavek na prvočíselnost, musíme k němu přičíst hodnotu 2 a opakujeme bod 1.2. 1.4. Bod 1.3. opakujeme do té doby, dokud se nepodaří vytvořit prvočíslo. Při generaci druhého prvočísla postupujeme stejně jako při tvorbě prvního prvočísla. Protože oba dva vstupy pro vygenerování prvočísla jsou náhodné, nemusíme provádět kontrolu na rozdílnost prvočísel. Toto máme s vysokou pravděpodobností zaručeno náhodnými vstupy. 2. Pokud máme vygenerovaná prvočísla, vypočteme jejich součin N = pq, (1) kde N je modul, p a q jsou vygenerovaná prvočísla. 3. Pokračujeme tím, že si spočteme hodnotu Eulerovy funkce φ(n) = (p 1)(q 1). (2) 16
4. Zvolíme si hodnotu čísla e (veřejný exponent). Hodnota veřejného exponentu musí splňovat e {2,, φ(n)}. Hodnotu veřejného exponentu volíme dostatečně velikou, jinak se vystavíme nebezpečí, že naše šifra půjde snáze prolomit. Pro veřejný exponent e musí platit, že je nesoudělný s hodnotou φ(n). 5. Nakonec si dopočítáme hodnotu čísla d (soukromý exponent). Hodnotu soukromého exponentu dopočteme z rovnice ed 1(mod φ(n)). (3) Po splnění všech výše uvedených kroků máme vše potřebné, abychom mohli vytvořit odpovídající dvojici soukromého a veřejného klíče. Soukromý klíč se skládá ze soukromého exponentu d a modulu N. Veřejný klíč se skládá z veřejného exponentu e a z modulu N. 1.3 Šifrování Šifrování je proces, který se skládá z několika kroků. Podstatnou podmínkou pro šifrování je mít odpovídající veřejný klíč, který se použije pro zašifrování dané zprávy [13]. Předtím než budeme danou zprávu šifrovat, musíme ji upravit pomocí tzv. paddingu (schéma formátování vstupních dat). Na tom, jaké šifrovací schéma se použije, se musí komunikující strany předem domluvit. Šifrovací schéma je tvořeno dvojicí paddingu (formátování vstupních dat) a samotného zašifrování výstupu z tohoto formátování algoritmem RSA. Pro šifrování se používá následující rovnice c = m e mod N, (4) kde c je výsledný šifrový text, m je číslo, které je výstupem zvoleného šifrovacího schématu, kterému jsme jako vstup dali naši originální zprávu M. Zbývajícími prvky rovnice jsou veřejný exponent e, který určíme dle kroku 4 v 1.2 a modul N, který vypočteme dle (1). Pro zašifrování zprávy budeme postupovat takto: 1. Převedeme zprávu M na číslo m (padding). 2. Vytvoříme šifrovou zprávu c podle (4) se znalostí veřejného klíče. Nyní máme originální zprávu M zašifrovanou do podoby šifrové zprávy c. Zašifrovanou zprávu můžeme odeslat druhé straně. 17
Obrázek 1: Proces šifrování Zdroj: Vlastní zpracování Formátování úprava otevřeného textu na vstup do RSA (padding) RSA šifrovací RSA transformace 1.4 Dešifrování Stejně jako šifrování, i dešifrování se skládá z několika kroků. Abychom byli schopni přijatou zašifrovanou zprávu c dešifrovat, musíme vlastnit odpovídající soukromý klíč [13]. Pro dešifrování se používá rovnice m = c d mod N, (5) kde m je číslo, ze kterého získáme původní zprávu M, c je obdržený šifrový text. Soukromý exponent d a modul N tvoří soukromý klíč. Důležitou součástí dešifrování je dešifrovací schéma. Dešifrovacím schématem se rozumí zřetězení procesů dešifrování algoritmem RSA, kontrola správnosti paddingu a dekódování (výpočet zprávy M z čísla m). Pro dešifrování budeme postupovat takto: 1. Vypočítáme číselnou hodnotu m podle (5). 2. Ověříme správnost použitého paddingu. 3. Původní zprávu M získáme tak, že nad číslem m provedeme inverzní operace oproti šifrování, a to v opačném pořadí. Výstupem procesu dešifrování je buď původní zpráva M, nebo informace o chybném paddingu. 18
Obrázek 2: Proces dešifrování Zdroj: Vlastní zpracování - neplatný šifrový text; šifrový text odmítnut chybný padding Inv(f) inverze funkce f Inv(Formátování) kromě inverze formátování obsahuje navíc i kontrolu správnosti padding 1.5 Podepisování Další oblast, kde se algoritmus RSA využívá, je podepisování dokumentů a ověření identity toho, kdo přijatou datovou zprávu vytvořil. Podepisování a zpětné ověření totožnosti odesilatele funguje na podobném principu jako šifrování a dešifrování [10]. Pokud chceme odeslat podepsanou zprávu M druhé straně, postupujeme takto: 1. Zvolíme si hashovací funkci. 2. Zvolenou hashovací funkci aplikujeme na zprávu M. Výstupem této operace je číslo m (hash), které reprezentuje zprávu M. 3. Číslo získané v bodě 2 nyní zašifrujeme naším soukromým klíčem a tím vytvoříme digitální podpis. 4. Nyní odešleme zprávu M s odpovídajícím digitálním podpisem. Druhá strana po obdržení zprávy ověří, že odesilatelem této zprávy jsme skutečně my. Toto ověření provede tímto způsobem: 1. Na obdrženou zprávu M aplikuje stejnou hashovací funkci, která byla použita při vytváření digitálního podpisu a získá číslo n (hash) reprezentující zprávu M. 2. Obdržený digitální podpis dešifruje pomocí našeho veřejného klíče. Výsledkem dešifrování je rovněž číslo m (hash). 19
3. Nyní porovná obě získaná čísla m a n (hashe). Pokud jsou čísla (hashe) naprosto shodná, tak má jistotu, že odesilatelem zprávy M jsme my. V opačném případě to znamená, že se zprávou bylo nějakým způsobem manipulováno poté, co byla opatřena digitálním podpisem. Obrázek 3: Digitální podpis Zdroj: Vlastní zpracování 20
2 Metody prolamování RSA Algoritmus RSA je tady s námi již řadu let a za tu dobu prošel vývojem, aby se stal odolnějším vůči útokům různého druhu. Útoky, které lze použít k prolomení algoritmu RSA, se pohybují od jednoduchých přes více sofistikované až po ty, které cílí na samotnou implementaci algoritmu. Níže popsané typy útoků představují základní přehled, který slouží k uvedení do problematiky prolamování RSA. Popsané útoky lze dnes považovat za již zastaralé, protože cílí na použití algoritmu RSA bez paddingu nebo na algoritmus RSA s triviálním paddingem. 2.1 Útoky na podstatu bezpečnosti RSA V empirické studii jsou využity solvery, které využívají metody, které patří do kategorie útoků na podstatu bezpečnosti RSA. 2.1.1 Integer Factoring Attack Jedná se o jeden z prvních útoků, kterým se podařilo úspěšně zaútočit na algoritmus RSA. Tento typ útoku se zaměřuje na samotný modul N, který je součástí soukromého i veřejného klíče. Výsledkem úspěšně provedeného útoku jsou prvočísla p a q, ze kterých se skládá modul N. Pomocí těchto dvou prvočísel dopočítáme hodnotu Eulerovy funkce φ(n). Tato hodnota nám umožní získat hodnotu soukromého exponentu d [4]. V tuto chvíli máme již vše potřebné, co potřebujeme k rozšifrování šifrové zprávy c a k získání původní zprávy M. 21
2.2 Útoky využívající nevhodnou volbu parametrů klíče 2.2.1 Håstad's Broadcast Attack Teorém 1 Mějme moduly N 1,, N i, které jsou tvořeny dvojící prvočísel, a následně přiřaďme N min = min i (N i ). Mějme g i Z Ni [x] představující k polynomů maximálního stupně d. Předpokládejme, že existuje hodnota M < N min pro kterou dále platí pro i {1,.., k}. g i (M) = 0 mod N i (6) Za předpokladu k > d, jsme schopni efektivně najít M, které je dané předpisem N i, g i k i=1. 1 Tento útok můžeme úspěšně použít k získání původní zprávy M, pokud tato zpráva M byla zaslána více koncovým osobám a při šifrování této zprávy došlo k chybnému použití veřejného exponentu e. Tento útok může být úspěšný, pokud vysílající strana odeslala šifrovou zprávu c, kterou vytvořila podle (4) více osobám. Pro šifrovou zprávu c platí postup, který byl popsán v 1.3. Pro jednotlivé šifrové zprávy c ale platí, že pro každou osobu je vygenerován unikátní modul N, ale pro všechny šifrové zprávy c je použit stejný veřejný exponent e. Pro tento veřejný exponent e musí platit, že nabývá malé hodnoty např. e = 5. Předpokládejme, že se nám podařilo zachytit k zpráv. Pokud k e, tak jsem schopni získat původní zprávu M [4]. Jako další krok musíme ověřit gcd(n i, N j ) = 1 pro každé i j. Pokud by výše zmíněná rovnost neplatila, tak bychom byly schopni faktorizovat libovolné N. Tyto zachycené šifrové zprávy zpracujeme podle čínské věty o zbytcích (CRT). Jako výstup obdržíme šifrovou zprávu c,, pro kterou platí c, Z N1 N 2 N 3 N 4 N 5. Pro tuto šifrovou zprávu c, platí c, = m 5 mod N 1 N 2 N 3 N 4 N 5. (7) Pokud platí m < N i pro i {1,, k} tak pro k = 5 dostaneme m 5 < N 1 N 2 N 3 N 4 N 5. Po dopočtení kořenů c,, jsme schopni zrekonstruovat původní zprávu M protože c, = m 5. 1 D. BONEH, Twenty years of attacks on the RSA cryptosystem, 1999, s 208 22
2.2.2 Wiener s Attack Teorém 2 Mějme N = pq, kde q < p < 2q. Dále mějme hodnotu d, pro kterou platí d < 1 3 N1 4. Se znalostí hodnot N, e veřejného klíče algoritmu RSA a (3) jsme schopni efektivně získat hodnotu d. 2 Tento útok můžeme efektivně použít k získání zprávy M pokud soukromý exponent d nabývá malé hodnoty. Když soukromý exponent d nabývá malé hodnoty tak je proces dešifrování rychlejší, ale pouze za cenu snížené bezpečnosti. Z definice (3) víme, že musí existovat takové číslo k pro které platí ed kφ(n) = 1 (8) a zároveň gcd(k, d) = 1. Podle důkazu 3 víme, že jsme schopni nalézt k mezi zlomky, které d konvergují k e N. Tyto konvergující zlomky se nacházejí v rozmezí od 0,, e N. Koeficienty těchto zlomků jsou velmi podobné koeficientu e. Koeficienty získáme výpočtem řetězového N zlomku, který je založen na Euklidově algoritmu. To, že se nám podařilo nalézt odpovídající hodnoty pro k a d si ověříme dosazením a vyřešením rovnic. Nejprve vypočteme φ(n) = ed 1 k. (9) Pokud se nám podle [4] podařilo najít odpovídající zlomek k zjistíme tak, že po dosazení k a d d do (7) je splněna daná rovnost. Pokud je rovnost splněna, jsem schopni získat původní zprávu M. V opačném případě musíme vyzkoušet jiný konvergující zlomek. 2 D. BONEH, Twenty years of attacks on the RSA cryptosystem, 1999, s. 206 3 D. BONEH, Twenty years of attacks on the RSA cryptosystem, 1999, s. 4-5 23
2.3 Útoky využívající kompromitaci části klíče 2.3.1 Partial Key Exposure Attack Teorém 3 Nechť hodnoty N, d jsou hodnoty soukromého klíče algoritmu RSA, kde modul N má délku n bitů. Za předpokladu, že známe [n 4] nejméně významných bitů hodnoty d, tak jsme schopni zrekonstruovat celou hodnotu d. Rekonstrukce hodnoty d jsme schopni provést v čase e log 2 e. 4 Při tomto útoku jsme schopni získat část bitů soukromého exponentu d ale pouze za předpokladu, že hodnota veřejného exponentu e je malé číslo [15]. Podle teorému 3 je postačující podmínkou k tomu abychom byli schopni faktorizovat modul N získat pouze N 4 nejméně významných bitů. Pro další použití si musíme definovat s = p + q [5]. Z výše uvedeného teorému 3 vyplývá existence čísla k, pro které platí ed k(n s + 1) = 1. (10) Za předpokladu d < φ(n) platí k {1,, e}. Po vyřešení (10) dosadíme hodnotu s do rovnice p 2 sp + N = 0 (mod 2 n 4 ). (11) Po vypočtení (10) dostaneme e log 2 e kandidátů, kteří řeší p mod 2 n 4 [15]. Z předcházející věty vyplývá závěr, že po skončení maximálně e log 2 e kroků budeme schopni faktorizovat modul N. 2.4 Útoky na RSA s triviálním paddingem 2.4.1 Common Modulus Attack Tento druh útoku využívá stejného faktu jako dříve zmíněný Håstad's Broadcast Attack a to, že je stejná zašifrovaná zpráva zaslána více osobám. Rozdíl mezi těmito útoky je v tom, že při tomto útoku se pro všechny zprávy použije stejný modul N. 4 D. BONEH, Twenty years of attacks on the RSA cryptosystem, 1999, s. 210 24
Mějme zprávu M ze které vytvoříme dva šifrové texty c 1 a c 2 podle (4). Pro každý šifrový text použijeme rozdílný veřejný exponent e ale modul N je pro obě zprávy stejný. Pro veřejné exponenty e 1 a e 2, které byly použity při šifrování, platí gcd(e 1, e 2 ) = 1 [4]. Pro získání původní zprávy M použijme rovnici m = c a b 1 c 2 mod N. (12) Zbývající hodnoty a a b použité v (11) dopočteme z e 1 a + e 2 b = 1. (13) 2.4.2 Coppersmith s Short Pad Attack Teorém 4 Nechť hodnoty N, e jsou hodnoty veřejného klíče algoritmu RSA, kde modul N má délku n bitů. Dále máme hodnotu m = [n e 2 ]. Hodnota M ε Z N je zpráva, pro kterou platí, že dosahuje maximálně délky n-m bitů. Definujme si zprávy M 1 = 2 m M + r 1 a M 2 = 2 m M + r 2. Hodnoty r 1 a r 2 jsou dvě odlišné celočíselné hodnoty, pro které platí 0 r 1, r 2 < 2 m. Pokud známe hodnoty N, e šifrové texty C 1 a C 2, které odpovídají původním zprávám M 1 a M 2, tak jsme schopni efektivně zrekonstruovat původní zprávu M. 5 Tento útok využívá faktu, že veřejnému exponentu e byla přiřazena malá hodnota. Další podmínka, pro úspěšné provedení útoku je ta, že daná zpráva M je rozšířena o malý počet náhodných bitů z jednoho či druhého konce. Komunikující strana chce odeslat zprávu M. Před samotným zašifrováním doplní zprávu M o malý počet bitů z jednoho či druhého konce. My tuto šifrovou zprávu c 1 zachytíme, což znamená, že komunikující strana neobdrží informaci o doručení této šifrové zprávy. Komunikující strana opět zašle stejnou zašifrovanou zprávu M ale s tím rozdílem, že jí doplní o jiný malý počet náhodných bitů. My tuto novu šifrovou zprávu c 2 znovu zachytíme, ale nyní již komunikující strana obdrží informaci o úspěšném doručení [4]. Nyní máme dva šifrové texty c 1 a c 2, které odpovídají zprávám m 1 a m 2. Podle teorému 4 jsme nyní schopni zrekonstruovat původní zprávu M. 5 D. BONEH, Twenty years of attacks on the RSA cryptosystem, 1999, s. 209 25
3 Vybrané open source solvery Při vypracovávání empirické studie byly použity dva druhy open source solverů, kde každý z nich využívá odlišného druhu problému. První skupina solverů využívá problém typu Boolean Satisfiability Problem zkráceně SAT. Druhá skupina solverů využívá odlišného typu problému, a to Integer Linear Programming zkráceně ILP. Oba zmíněné problémy patří do skupiny tzv. NP-úplných problémů. Oba zmíněné typy solverů použijeme k faktorizaci čísla N, které se označuje, jako modul a je součástí veřejného i soukromého klíče RSA. 3.1 Způsoby faktorizace Existuje mnoho způsobů faktorizace, které se od sebe odlišují tím, jak k danému problému přistupují. Náplň této práce sice není přímo zaměřena na představení faktorizace jako takové, ale použité solvery jsou použité k faktorizaci modulu N algoritmu RSA. Použité solvery řeší daný problém pomocí upraveného vstupu, který je reprezentován pomocí množiny CNF klauzulí. Z tohoto důvodu bude dobré, když si zde představíme dva odlišné a asi nejznámější přístupy k problému zvanému faktorizace. 3.1.1 Intuitivní postup Tento způsob faktorizace je nejvíce intuitivní a jsme schopni s ním do jisté míry efektivně faktorizovat malá čísla. Myšlenka tohoto postupu spočívá v nalezení jednotlivých faktorů m i známého čísla n podle n mod m i = 0, (14) kde n je číslo, které chceme faktorizovat, m i je hodnota, která může reprezentovat faktor čísla n za předpokladu (14). Pro hodnotu m i platí m i {2,.., n} za předpokladu, že n není prvočíslo. Pokud víme, že n je prvočíslo a podařilo se nám najít m i pro které platí (14), tak dopočítání druhého faktoru je již triviální. Tento způsob se dá označit jako brute force (hrubou silou), protože postupně procházíme všechny povolené možnosti, dokud nenajdeme všechny odpovídající. 3.1.2 GNFS (The General Number Field Sieve) Jedná se nejrychlejší známý algoritmus k faktorizaci velikých čísel. Tento algoritmus je zde zmíněn, protože pomocí něj byl faktorizován klíč RSA velikosti 768 bitů v rámci RSA 26
Challange 6. Běžně se s tímto algoritmem můžeme setkat při faktorizaci RSA klíčů velikosti 512 bitů. Podrobný popis, jak GNFS funguje je k nahlédnutí v [6]. 3.2 Boolean Satisfiability Problem Jedná se o typ problému, pomocí kterého jsme schopni rozhodnou, zdali existuje nějaké ohodnocení, pro které by byla daná Booleovská formule splnitelná či nikoliv [9]. SAT pracuje s instancemi, které mají následující CNF tvar (x 1 x 9 x 14 ) ( x 5 x 20 ), (15) kde (14) je Booleovská formule v konjunktivní normální formě (CNF). Instance se skládá z proměnných a klauzulí. Proměnné mohou nabývat hodnotu true (x 1 ) nebo hodnoty false ( x 1 ). Výstupem SAT je rozhodnutí, zdali je daná instance řešitelná nebo není řešitelná. Pokud je instance řešitelná, obdržíme kolekci proměnných, které nabývají hodnot true nebo false. Při vypracování této práce byly použity tyto SAT solvery PicoSAT ver. 960c MiniSat ver. 2.2.0 3.3 Integer Linear Programming Stejně jako u výše zmíněného SAT problému, tak se i zde snažíme zjistit, zda existuje nějaké řešení pro náš problém. V případě tohoto problému zjišťuje, zda existuje nějaký vektor x, který by splňoval Ax b, (16) kde A je matice, b je zadaný vektor. Jednotlivé hodnoty vektoru x mohou nabývat pouze hodnot 0 a 1. Pokud nalezneme takový vektor x, který splňuje (16) vypíšeme kolekci těchto parametrů, jinak oznámíme, že pro daný problém neexistuje řešení [9]. Při vypracování této práce byly použity tyto ILP solvery lp_solve ver. 5.5.2.5 GLPK (GNU Linear Programming Kit) ver. 4.32 6 https://www.emc.com/emc-plus/rsa-labs/historical/rsa-768-factored.htm 27
3.4 Algoritmy SAT a ILP solverů Ať už se jedná o SAT či ILP solver, existuje mnoho různých algoritmů, které tyto solvery využívají. My si zde stručně popíšeme ty, které využívají námi vybrané SAT a ILP solvery. 3.4.1 SAT solvery Moderní SAT solvery jsou nejčastěji postavené na dvou algoritmech. Prvním z nich je Conflict-Driven Clause Learning (CDCL), druhým je Davis Putnam Logemann Loveland (DPLL). Popis těchto algoritmů je nad rámec této práce. Solver PicoSAT využívá algoritmus DPLL a solver MiniSat využívá algoritmus CDCL. DPLL Jedná se o druh vyhledávacího algoritmu, pomocí kterého jsme schopni rozhodnou, zda je daná formule výrokové logiky řešitelná nebo není. Výroková formule musí být ve tvaru CNF. Tento algoritmus je založen na principu algoritmu, který se označuje jako backtracking. Tento algoritmus používá chronologický backtacking. Princip tohoto algoritmu je založen na tom, že se snažím najít pro všechny proměnné takové ohodnocení, při kterém budou všechny klauzule splnitelné. V případě, že se použije pro proměnou takové ohodnocení, při kterém nebude nějaká klauzule splnitelná, tak se vrátí a proměnné přiřadí opačné ohodnocení. Takto postupuje chronologicky do té doby, dokud nenajde správné ohodnocení pro všechny proměnné. Pokud by nebyl schopen nalézt takové ohodnocení proměnných, při kterém by byly všechny klauzule splnitelné, dané řešení není splnitelné. Detailnější princip tohoto algoritmu je popsán v [3]. CDCL Jedná se o modernější algoritmus, který vychází z algoritmu DPLL. Na rozdíl od DPLL používá algoritmus CDCL nechronologický backtacking. Navíc je schopný se ze vzniklých konfliktů poučit. Toto učení spočívá ve vygenerování dodatečných klauzulí, které by mohli způsobit problémy při dalším vyhodnocování. Protože tento algoritmus má více informací o klauzulích, které způsobují konflikty, tak ví, že je nemusí procházet a tím zvyšuje celkovou efektivitu. Detailnější princip tohoto algoritmu je popsán v [3]. 28
3.4.2 ILP solvery Stejně jako SAT tak i vybrané ILP solvery využívají rozdílné algoritmy. Zde si zmíníme dva nejpoužívanější. Prvním je Branch-and-Bound (BB) [7], druhým z nich je Interior Point (IP) [14]. Solver lp_solver je postaven na algoritmu BB a solver GLPK využívá algoritmus IP. BB Jedná se o algoritmus, pomocí kterého se snažíme nalézt optimální řešení našeho problému. Princip tohoto algoritmu je založen na tom, že množinu možných řešení rozdělíme na menší části. Tuto operaci nazýváme větvení. Předtím než se pustíme do řešení každé menší části (větve), ověříme, že jsme schopni v této větvi nalézt lepší řešení, než je doposud nalezené řešení. Pokud bychom nebyli schopni v této větvi nalézt lepší řešení, tuto větev přeskočíme a pokračujeme v řešení další větve. Detailnější princip tohoto algoritmu je popsán v [7]. IP Jedná se o metodu, která využívá simplexových algoritmů. Simplexové algoritmy jsou takové algoritmy, které postupně prohledávají množinu řešení. V každém kroku se snaží pozměnit nalezené řešení, aby bylo co nejoptimálnější. Tato metoda používá konkrétně simplexové algoritmy primal a dual. Detailnější princip tohoto algoritmu je popsán v [14]. 3.5 Problematika faktorizace pomocí SAT a ILP solverů Myšlenka faktorizace modulů N algoritmu RSA pomocí SAT a ILP solverů není moc rozšířená, ale přesto se dá najít několik publikací a článků [1,2,12,16], které se věnují této problematice. Dosažené výsledy v těchto pracích pracují s tím, že efektivnost jednotlivých solverů je možné ovlivnit několika faktory. Mezi tyto faktory patří především volba typu faktorizačního obvodu, který představuje jakýsi předpis, pro zjednodušení řešeného problému do CNF formulí. Další faktor ovlivňující celkovou efektivitu je typ algoritmu, který je v daném solveru použit. Naměřené hodnoty při empirických studiích v uvedených pracích jsou si docela podobné. Bude zajímavé porovnat, jestli výsledky dosažené v naší empirické studii budou korespondovat s výsledky, které byly dosažené v uvedených pracích. 29
4 Empirická studie Tato kapitola je věnována představení samotné empirické studie. Popisuje se zde, co vše bylo potřeba pro samotné provedení studie připravit, a to včetně konfigurace testovacího stroje, použitých nástrojů, programů, scriptů atd. Dále zde je stručně popsán samotný postup vypracovávání celé studie včetně přípravy testovacích dat pro jednotlivé fáze. 4.1 Cíle empirické studie Cílem empirické studie je získání dostatečného množství dat, ze kterých je možné vyvodit relevantní závěr ohledně efektivnosti jednotlivých vybraných solverů. V rámci empirické studii bylo zkoumáno, jak efektivní jsou vybrané open source solvery typu SAT a ILP. U vybraných solverů bylo posuzováno, jakou mají spotřebu času a paměti a jak se na celkové spotřebě promítl rozdíl v použitých algoritmech těchto solverů. 4.2 Faktorizační obvod Jeden z nejdůležitějších faktorů, který měl vliv na získané hodnoty v empirické studii, byl faktorizační obvod. Jedná se o typ logického obvodu, který je složen ze sčítačky a násobičky. Sčítačka a násobička jsou druhy logického kombinačního obvodu. Logický kombinační obvod se skládá z logických členů tzv. hradel typu AND, OR a NOT. Hradlo může mít více vstupu x i, kde i {1,, n} a pouze jeden výstup y. Hodnoty na vstupu mohou nabývat pouze hodnot 0 (false) a 1 (true). Hodnota, která je výstupem z daného hradla, je závislá na logické funkci, kterou dané hradlo představuje. Hodnota, která z hradla vystupuje, může rovněž nabývat pouze hodnot 0 (false) a 1 (true). 4.2.1 Sčítačka Jak bylo zmíněno výše, sčítačka je logický kombinační obvod. Sčítačka nám umožňuje sčítat dvojici čísel, která musí být reprezentována ve dvojkové soustavě. Použité typy sčítaček v této práci N-bit Fast 30
N-bit Jedná se sčítačku označovanou jako Ripple-Carry Adder. Jedná se o obvod, který se skládá z několika úplných sčítaček, které jsou zapojené za sebou do série. Nevýhoda tohoto zapojení je v tom, že signál carry (příznak přenosu) musí projít skrze všechny úplné sčítačky. Teprve potom co signál carry projde všemi sčítačkami, dostaneme finální součet. Fast Tato sčítačka se označovaná jako Carry-Lookahead Adder se skládá ze série zapojených úplných sčítaček ale na rozdíl od sčítačky typu Ripple-Carry Adder je doplněna o další logický obvod. Tento dodatečný logický obvod se označuje jako Carry-Lookahead Logic. Tento dodatečný logický obvod řeší problém s přenosem signálu carry. Všechny přenosy signálu carry jsou v tomto logickém obvodu vypočítány pro všechny úplné sčítačky najednou. 4.2.2 Násobička Násobička je druhý typ logického kombinačního obvodu, který je použit ve faktorizačním obvodu. Násobička umožňuje vynásobit dvojici čísel, která jsou reprezentovaná ve dvojkové soustavě. Použité typy násobiček v této práci Carry-save Wallace Recursive Carry-save Jedná se o typ násobičky založené na principu násobícího pole, které pracuje na principu sčítačky s uchováním přenosu 7. Wallace Jedná se o typ paralelní násobičky, která zpracovává data pomocí stromové struktury 8. Recursive Jedná se typ násobičky, která je postavena na principu algoritmu Karatsuba 9. 7 https://core.ac.uk/download/pdf/30279893.pdf 8 http://ieeemilestones.ethw.org/images/2/2a/a_suggestion_for_a_fast_multiplier.pdf 9 https://courses.csail.mit.edu/6.006/spring11/exams/notes3-karatsuba 31
V této práci bylo použito šesti rozdílných faktorizačních obvodů. Každý faktorizační obvod se skládá z jedné sčítačky a jedné násobičky. Jednotlivé obvody se od sebe odlišovaly použitou kombinací sčítačky a násobičky. Pro vytvoření jednotlivých faktorizačních obvodů byl použit program 10, který byl vyvinut Paulem Pudromem a Amrim Sabrym. Podstata tohoto programu je v tom, že problém řešený faktorizačním obvodem převede na soustavu CNF klauzulí (14). 4.3 Příprava dat Pro generování a úpravu vstupních dat jsem vytvořil program v jazyce C Sharp. Detaily o tomto programu jsou součástí přílohy A. Pro potřeby zpracování dat jednotlivými solvery jsem vytvořil skripty, které umožňovaly hromadné zpracování vstupních dat vybranými solvery. Popisy jednotlivých scriptů jsou také součástí přílohy A. Pro různé fáze empirické studie se musela připravit odlišná sada dat. V následujících podkapitolách si detailně popíšeme, jak se tato testovací dat připravovala. 4.3.1 Příprava dat pro faktorizační obvod Vstupem každého faktorizačního obvodu byl modul (číslo) N, který byl vytvořen podle (1). K vygenerování všech modulů N byl použit program napsaný v jazyce C#, který je součástí přílohy A. Prvočísla p a q, ze kterých je složen výsledný modul N byla vygenerována pomocí generátoru 11. Pro účely této práce byla použita prvočísla ve velikosti od 5 do 16 bitů. Pro výslednou velikost modulu N platí bit(p) = bit(q) = x (17) bit(n) = 2x (18) Každý modul N byl vygenerován tak, aby byl unikátní. Pro účel této práce bylo celkem vygenerováno 8249 rozdílných modulů N napříč všemi velikostmi klíčů (18). Protože každý modul N je výsledkem součinu prvočísel p a q, máme zaručeno, že každý náš problém je jednoznačně řešitelný. Z tohoto důvodu by neměla nastat situace, že by kterýkoliv z vybraných solverů prohlásil, že daný problém není řešitelný. 4.3.2 Příprava dat pro solvery Zde musíme od sebe odlišit, jestli připravujeme vstupní data pro solvery typy SAT nebo pro solvery typu ILP. Každý uvedený typ solveru pracuje s odlišným formátem vstupních dat. 10 https://www.cs.indiana.edu/cgi-pub/sabry/cnf1.hs 11 http://www.free-online-calculator-use.com/prime-number-generator.html 32
Jako výstup z faktorizačního obvodu obdržíme soubor typu dimacs, který obsahuje data ve formátu CNF. Tento soubor obsahuje soustavu klauzulí a proměnných, které řeší náš problém (faktorizaci modulu N). Kromě klauzulí a proměnných tento soubor ještě obsahuje doplňující informace, které se k danému problému vážou. Mezi těmito doplňujícími informacemi nalezneme typ použitého faktorizačního obvodu (typ použité sčítačky a násobičky) a proměnné, které zastupují námi hledaná prvočísla p a q. Poslední informativní řádek ukazuje celkový počet proměnných a klauzulí, které řeší náš problém a v jakém formátu jsou data v tomto souboru uložena. Struktura dat souboru dimacs c Problem generated from carry-save[fast] multiplication circuit c by Paul Purdom and Amr Sabry c c Circuit for product = 493 [True,True,True,True,False,True,True,False,True] c Variables for output [msb,...,lsb]:[235,234,233,232,219,218,194,173,134,91,48,24,14] c Variables for first input [msb,...,lsb]: [8,7,6,5,4,3,2,1] c Variables for second input [msb,...,lsb]: [13,12,11,10,9] c c p cnf 239 917 1 9-14 0 1-9 -14 0-1 9-14 0. Řádky začínající písmenem c jsou řádky představující komentáře s doplňujícími informacemi. Řádky, které za znakem c obsahují text Variables for obsahují v hranatých závorkách číselné hodnoty. Tyto číselné hodnoty reprezentují proměnné, které jako celek reprezentují číslo. Toto číslo může být buďto výsledný modul N (output) nebo námi hledaná prvočísla p a q (first/second input). Řádek začínající písmenem p má tři složky. První složka nám říká, že následující řádky obsahují instance ve formátu CNF (14). První číselná hodnota nám říká, kolik daný obvod obsahuje proměnných. Druhá číselná hodnota nám říká, kolik klauzulí obsahuje daný obvod 33
řešící náš problém. Další řádky až do konce souboru představují jednotlivé klauzule reprezentující obvod, který řeší námi zadaný problém. Nyní jsme se dostali do bodu, kdy musíme řešit formát vstupních dat pro jednotlivé typy solverů. Pokud chceme pracovat se solvery typu SAT, nemusíme tento soubor nijak upravovat a použijeme přímo tento soubor bez jakékoliv změny. V případě, že použijme ILP solver, se situace komplikuje. ILP solvery pracují s odlišným typem souborů a formátem vstupních dat. Námi vybrané ILP solvery pracují se soubory typu lp respektive mod. Tyto dva soubory se od sebe odlišují rozdílnou strukturou dat, jak bude ukázáno níže. Struktura dat souboru lp max: x1 + x2 + x3 + x4 + x5 + + x236 + x237 + x238 + x239; r1: x1 + x9 + 1 - x14 >= 1; r2: x1 + 1 - x9 + 1 - x14 >= 1;... r916: 1 - x234 >= 1; r917: 1 - x235 >= 1; bin x1,x2,x3,x4,,x237,x238,x239; První řádek začínající max: říká, že hledáme takové parametry, za kterých bude daný problém maximalizován. Následují řádky začínající rn: představují jednotlivé klauzule, kde je hodnota n {1,, m}. Hodnota m reprezentuje celkový počet klauzulí. Hodnoty xi reprezentují jednotlivé proměnné, kde je hodnota i {1,, j}. Hodnota j reprezentuje celkový počet proměnných. Poslední řádek, který začíná slovem bin, nám říká, že všechny proměnné mohou nabývat pouze hodnot 1 (true) nebo 0 (false). 34
Struktura dat souboru mod var x1, binary; var x2, binary; var x3, binary; maximize obj: x1 + x2 + x3 + x4 ; s.t. r1: x1 + x9 + 1 - x14 >= 1; s.t. r2: x1 + 1 - x9 + 1 - x14 >= 1; s.t. r3: 1 - x1 + x9 + 1 - x14 >= 1; s.t. r4: 1 - x1 + 1 - x9 + x14 >= 1; s.t. r5: x2 + x9 + 1 - x15 >= 1; solve; display x1, x2, x3, x4, ; end; Řádky ve tvaru var x i, binary; představují definice jednotlivých proměnných. Hodnoty ri reprezentují jednotlivé proměnné, kde je hodnota i {1,, j}. Hodnota j reprezentuje celkový počet proměnných. Klíčovým slovem Binary říkáme, že proměnné mohou nabývat pouze hodnot 1 (true) a 0 (false). Řádkem maximize obj: x1+ říkáme, že hledáme maximalizaci této funkce. Následující řádky začínající s.t. rn: představují jednotlivé klauzule, kde je hodnota n {1,, m}. Hodnota m reprezentuje celkový počet klauzulí. Slovem solve říkáme solveru, že chceme daný problém řešit. Řádek začínající slovem display nám zajistí, že po vyřešení daného problému obdržíme ohodnocení jednotlivých proměnných na standardní výstup. Poslední řádek se slovem end nám ukončuje zadání řešeného problému. Soubor dimacs byl do formátů souborů lp a mod převeden pomocí programu, který byl napsán v jazyce C#. Program je součástí přílohy A. 4.4 Výstupní data Výstupní data ze solverů můžeme rozdělit do dvou částí. První část výstupních dat představuje data, která jsou specifická pro daný druh a typ solveru. Druhá část výstupních dat je shodná jak pro solvery typu SAT, tak i pro solvery typu ILP. Druhá část výstupních dat obsahuje proměnné, které řeší náš problém. V této fázi mají již všechny proměnné přiřazené 35
ohodnocením. Pokud byla proměnné přiřazena hodnota true, je zapsána ve formátu např. 1 nebo pokud byla proměnné přiřazena hodnota false, je zapsána ve formátu např. -1. Pokud propojíme tento soubor obsahující proměnné a jejich ohodnocení z výše zmíněným souborem dimacs, už jsme schopni získat hodnoty prvočísel p a q. Hodnoty, na kterých budeme zkoumat efektivnost jednotlivých solverů, jsou součástí první části výstupních dat vybraných solverů. Jedná se o data, která představují spotřebu použitých zdrojů. Mezi tyto data patří čas a paměť, které byli spotřebované pro vyřešení daného problému. Dalším zdrojem informací pro vypracování empirické studie byla data obsažená v souboru dimacs. V těchto souborech nás budou zajímat údaje o celkovém počtu proměnných a klauzulí, které řeší námi zadaný problém. Tyto hodnoty najdeme na řádku, který začíná písmenem p. 4.5 Průběh testování Před samotným testováním bylo potřeba připravit základní testovací data a testovací prostředí. Příprava testovacích dat je popsána v kapitole 4.3.1. Tato data posloužila jako vstup do faktorizačních obvodů. Výstupem je již několikrát zmíněný soubor dimacs, který je potřebný jako zdroj vstupních dat do solverů. 4.5.1 Zpracování vstupních dat pomocí scriptů V testovacím prostředí byl spuštěn pro každý typ solveru odpovídající script. Jednotlivé scripty jsou součástí přílohy A. Vstupem těchto scriptů byly soubory odpovídajícího formátu. Formát byl zvolen podle použitého typu solveru. Příprava a typ odpovídajících souborů je popsána v kapitole 4.3. Výstupy ze všech solverů byly ukládány do jednotlivých souborů, jak bylo popsáno v kapitole 4.4. Pořadí, v jakém byly jednotlivé scripty spouštěny, nemělo žádný vliv na kvalitu výstupních data z těchto solverů. 4.5.2 Shromažďování výstupů Data získaná jako výstup ze solverů byla dále zpracována programem, který je součástí přílohy A. Výhodou tohoto předzpracování bylo to, že jsem měl stejné sledované hodnoty pro každý typ solveru a faktorizačního obvodu uloženy ve stejném souboru. Tento způsob ukládání naměřených hodnot se projevil jako výhodný při následném zpracování a vynášení hodnot do grafů a tabulek. 36
4.6 Informace pro zopakování měření Aby se daly informace považovat za relevantní, musí existovat způsob, jak tato data získat znovu, tím, že zopakujeme postup jejich získávání. V opačném případě by se tyto dosažené informace nedali považovat za věrohodné. V níže uvedených podkapitolách bude uvedeno, co je zapotřebí, aby mohlo být provedené měření zopakováno. 4.6.1 Použitá data Aby bylo možné měření zopakovat, potřebujeme soubor se stejnými daty, která byla použita při zkoumaném měření. Data použitá při vypracovávání této studie jsou součástí přílohy B. 4.6.2 Testovací prostředí Pokud chceme zopakovat provedené měření co možná nejpřesněji, potřebujeme k tomu odpovídající prostředí. Toto nové prostředí by se mělo co nejvíce podobat tomu, na kterém bylo provedeno původní měření, které chceme zopakovat. Mezi komponenty, které jsou důležité pro zopakování měření, patří jak SW, tak i použitý HW. Popis testovacího prostředí K testování byla použita nová čistá instalace operačního systému, aby se minimalizovala možnost ovlivnění provedených měření. Jediným dodatečně doinstalovaným softwarem byly solvery, které byly použity pro účely měření v této empirické studii. Testovací prostředí bylo používáno výhradně jen pro účely provedení série měření. Aby bylo testování co nejpřesnější, bylo vypnuto vše, co nebylo nutné pro běh operačního systému a testovacího procesu. Konfigurace testovacího stroje Testovací stroj Toshiba Portege R700-15H Operační systém Ubuntu 16.04 LTS, 32-bit Procesor Intel 1 x Core i5 CPU M450 @ 2.40GHz Paměť 1x 4096 MB DDR3, 1066 MHz 37
5 Dosažené výsledky Prezentaci výsledků, které byly dosaženy během měření, jsem rozdělil do několika částí Faktorizační obvody SAT solvery ILP solvery Porovnání SAT a ILP solverů Toto rozdělení bylo zvoleno proto, že tímto způsobem bylo možno co nejlépe prezentovat a porovnat naměřené hodnoty jednotlivými solvery. 5.1 Faktorizační obvody V této části je zobrazeno, jak velký vliv má na počet proměnných a klauzulí volba faktorizačního obvodu. Můžeme pozorovat, jak a kdy se projevuje změna typu násobičky a sčítačky, ze kterých se faktorizační obvod skládá. 38
Počet proměnných Počet proměnných 5.1.1 Závislost počtu proměnných na typu obvodu Graf 1: Závislost počtu proměnných na velikosti klíče (Fast) Fast_CarrySave Fast_Recursive Fast_Wallace 5000 4500 4000 3500 3000 2500 2000 1500 1000 500 0 8 10 12 14 16 18 20 22 24 26 28 30 32 34 Velikost klíče (bit) Zdroj: Vlastní zpracování Graf 2: Závislost počtu proměnných na velikosti klíče (N-bit) N-bit_CarrySave N-bit_Recursive N-bit_Wallace 5000 4500 4000 3500 3000 2500 2000 1500 1000 500 0 8 10 12 14 16 18 20 22 24 26 28 30 32 34 Velikost klíče (bit) Zdroj: Vlastní zpracování 39
Počet klauzulí Počet klauzulí 5.1.2 Závislost počtu klauzulí na typu obvodu Graf 3: Závislost počtu klauzulí na velikosti klíče (Fast) Fast_CarrySave Fast_Recursive Fast_Wallace 20000 18000 16000 14000 12000 10000 8000 6000 4000 2000 0 8 10 12 14 16 18 20 22 24 26 28 30 32 34 Velikost klíče (bit) Zdroj: Vlastní zpracování Graf 4: Závislost počtu klauzulí na velikosti klíče (N-bit) N-bit_CarrySave N-bit_Recursive N-bit_Wallace 20000 18000 16000 14000 12000 10000 8000 6000 4000 2000 0 8 10 12 14 16 18 20 22 24 26 28 30 32 34 Velikost klíče (bit) Zdroj: Vlastní zpracování 40
Spotřebovaná paměť (MB) Spotřebovaný čas (ms) Spotřebovaná paměť (MB) Spotřebovaný čas (ms) 5.2 SAT solvery V této kapitole je pro vybrané SAT solvery zobrazeno, jak se mění spotřeba času a paměti v závislosti na velikosti klíče řešeného problému. Jednotlivé body, které jsou vynesené v grafech, představují jeden konkrétní řešený problém. 5.2.1 MiniSat Graf 5: MiniSat Fast CarrySave 15 40000 14 13 12 11 10 9 35000 30000 25000 20000 15000 10000 5000 8 8 10 12 14 16 18 20 22 24 26 28 30 32 34 0 8 10121416182022242628303234 Velikost klíče (bit) Velikost kíče (bit) Zdroj: Vlastní zpracování Graf 6: MiniSat Fast Recursive 15 40000 14 13 12 11 10 9 35000 30000 25000 20000 15000 10000 5000 8 8 10 12 14 16 18 20 22 24 26 28 30 32 34 0 8 10121416182022242628303234 Velikost klíče (bit) Velikost klíče (bit) Zdroj: Vlastní zpracování 41
Spotřebovaná paměť (MB) Spotřebovaný čas (ms) Spotřebovaná paměť (MB) Spotřebovaný čas (ms) Graf 7: Minista Fast Wallace 15 40000 14 13 12 11 10 9 35000 30000 25000 20000 15000 10000 5000 8 8 10 12 14 16 18 20 22 24 26 28 30 32 34 0 8 10121416182022242628303234 Velikost klíče (bit) Velikost klíče (bit) Zdroj: Vlastní zpracování Graf 8: MiniSat N-Bit Carry-Save 15 40000 14 13 12 11 10 9 35000 30000 25000 20000 15000 10000 5000 8 8 10 12 14 16 18 20 22 24 26 28 30 32 34 0 8 10121416182022242628303234 Velikost klíče (bit) Velikost klíče (bit) Zdroj: Vlastní zpracování 42