Generování náhodných čísel na mikrokontrolérech AVR i
České vysoké učení technické v Praze Fakulta elektrotechnická Katedra počítačů Bakalářská práce Generování náhodných čísel na mikrokontrolérech AVR Martin Hadáček Vedoucí práce: Ing. Josef Hlaváč Studijní program: Elektrotechnika a informatika, strukturovaný, Bakalářský Obor: Výpočetní technika 27. května 2010
iv Poděkování V první řadě bych chtěl poděkovat panu Ing. Josefu Hlaváčovi za vedení Bakalářské práce a udělené rady. Dále bych chtěl poděkovat své manželce, synovi, rodičům a bratrovi za pomoc a trpělivost při nedostatku času.
v Prohlášení Prohlašuji, že jsem práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu 60 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). V Praze dne 27. 5. 2010.............................................................
Abstract The thesis focuses on the problem of generating random and pseudorandom numbers. Several algorithmic generators as well as several generators based on physical phenomena are shown. One generator is then selected and implemented using the AVR Butterfly demo board. The implementation is then gradually improved for faster random number generation. In order to check the quality of the generator, the thesis furher deals with randomness testing. We describe the approaches to randomness testing as well as individual tests from a test suite that is applicable to pseudorandom and truly random number generators. Individual modifications of the random number generator implementation are tested and the corresponding results are discussed. Abstrakt V práci se zaměřujeme na problematiku náhodného a pseudonáhodného generování čísel. Ukážeme některé algoritmické a fyzikální generátory náhodných čísel. Jeden z generátorů vybereme a implementujeme na vývojové desce AVR Butterfly. Implementaci generátoru budeme postupně upravovat pro rychlejší získávání náhodných čísel. Pro ověření kvality našeho generátoru se zaměříme také na testování náhodnosti. Popíšeme možnosti testování náhodnosti a jednotlivé testy ze sady testů použitelné pro generátory náhodných a pseudonáhodných čísel. Postupně budeme testovat a vyhodnocovat výsledky pro jednotlivé úpravy implementace našeho generátoru. vi
Obsah 1 Úvod 1 2 Vymezení cílů BP 3 3 Generátory náhodných čísel 4 3.1 Generátory pseudonáhoných čísel......................... 4 3.1.1 Lineární kongruenční generátor...................... 4 3.1.2 LFG generátor............................... 5 3.1.3 LFSR generátor............................... 5 3.2 Fyzikální generátory náhodných čísel....................... 6 3.2.1 Generátor náhodného procesu GENAP-2................. 6 3.2.2 HotBits................................... 8 3.2.3 Zdroje náhodnosti na mikrokontroléru AVR ATmega164P....... 9 3.2.3.1 Vnitřní EEPROM........................ 9 3.2.3.2 Watchdog reset.......................... 10 3.2.3.3 Watchdog přerušení....................... 10 3.2.3.4 Nízkofrekvenční krystal..................... 11 3.2.3.5 Rozhraní RS-232......................... 11 3.2.3.6 SPI................................ 11 3.2.3.7 ADC............................... 11 3.2.3.8 Časovač ISR........................... 12 3.2.3.9 Vstupní zachytávací jednotka.................. 13 3.2.4 Náš generátor náhodných čísel na mikrokontroléru Atmel AVR.... 13 3.2.4.1 Generování náhodných čísel................... 13 3.2.4.2 Testování náhodnosti...................... 13 4 Testování náhodnosti 15 4.1 Popis jednotlivých testů.............................. 16 4.1.1 Frequency (Monobit) Test (frekvenční test)............... 16 4.1.1.1 Popis testu............................ 16 4.1.1.2 Definice.............................. 16 4.1.1.3 Příklad.............................. 17 4.1.2 Frequency Test within a Block (frekvenční blokový test)........ 17 4.1.2.1 Popis testu............................ 17 4.1.2.2 Definice.............................. 17 vii
OBSAH viii 4.1.2.3 Příklad.............................. 18 4.1.3 Runs Test (test identických skupin).................... 18 4.1.3.1 Popis testu............................ 18 4.1.3.2 Definice.............................. 18 4.1.3.3 Příklad.............................. 19 4.1.4 Test for the Longest Run of Ones in a Block (test nejdelší posloupnosti jedniček uvnitř bloku)........................... 19 4.1.4.1 Popis testu............................ 19 4.1.4.2 Definice.............................. 19 4.1.5 Binary Matrix Rank Test (test hodnosti binární matice)........ 20 4.1.5.1 Popis testu............................ 20 4.1.6 Discrete Fourier Transform (spectral) Test (diskrétní test pomocí Fourierovi transformace)............................ 20 4.1.7 Non-overlapping Template Matching Test (test na nepřekrývající se vzory).................................... 20 4.1.7.1 Popis testu............................ 20 4.1.8 Overlapping Template Matching Test (test na překrývající se vzory). 20 4.1.8.1 Popis testu............................ 21 4.1.9 Maurer s Universal Statistical Test (Maererův statistický univerzální test)..................................... 21 4.1.9.1 Popis testu............................ 21 4.1.10 Linear Complexity Test (test lineární složitosti)............. 21 4.1.10.1 Popis testu............................ 22 4.1.11 Serial Test (sériový test).......................... 22 4.1.11.1 Popis testu............................ 22 4.1.12 Approximate Entropy Test (aproximační test entropie)......... 22 4.1.12.1 Popis testu............................ 22 4.1.13 Cumulative Sums (Cusum) Test (test kumulativní sumy)........ 23 4.1.13.1 Popis testu............................ 23 4.1.14 Random Excursions Test (test náhodných odchylek).......... 23 4.1.14.1 Popis testu............................ 23 4.1.15 Random Excursions Variant Test (variace testu náhodných odchylek). 23 4.1.15.1 Popis testu............................ 23 4.2 Vyhodnocení výsledků............................... 24 4.2.1 Proportion of Sequences Passing a Test (poměr úspěšných sekvencí). 24 4.2.2 Uniform Distribution of P values (rovnoměrnost rozložení hodnot P value).................................. 24 4.2.3 Konečné vyhodnocení výsledků...................... 25 5 Návrh řešení 26 5.1 Pseudonáhodné generátory versus fyzikální generátory............. 26 6 Implementace a testování 27 6.1 Předpřipravení dat................................. 27 6.2 Použitelné testy................................... 27 6.3 Náhodná hodnota každou sekundu........................ 28
OBSAH ix 6.3.1 První test.................................. 28 6.3.2 Druhý test................................. 29 6.3.3 Vyhodnocení................................ 30 6.4 Generování 16 hodnot za sekundu......................... 31 6.4.1 První test.................................. 32 6.4.2 Druhý test................................. 32 6.4.3 Testování teplotní závislosti........................ 32 6.5 Generování 128 hodnot za sekundu........................ 34 6.5.1 První test.................................. 34 6.5.2 Druhý test................................. 35 6.6 Vylepšené generování 128 hodnot za sekundu.................. 35 6.6.1 První test.................................. 35 6.7 Vylepšené generování 512 hodnot za sekundu................. 35 6.7.1 První test.................................. 35 6.7.2 Vyhodnocení................................ 36 7 Závěr 37 Literatura 38 A Seznam použitých zkratek 39 B Obsah přiloženého DVD 40
Seznam obrázků 3.1 Vznik časově náhodných impulsů ze šumu převzato z [6]........... 6 3.2 Princip činnosti generátoru převzato z [6]................... 7 3.3 Schéma hodinových zdrojů u ATmega164P převzato z [11].......... 9 3.4 Schéma ADC u ATmega164P převzato z [11]................. 12 3.5 Princip generování náhodných čísel na AVR Butterfly převzato z [7].... 14 4.1 Histogram hodnot P value převzato z [3]................... 24 4.2 Final Analysis Report převzato z [3]...................... 25 6.1 Četnost neupravených 16bitových hodnot z našeho generátoru......... 30 6.2 Četnost náhodných 8bitových hodnot z našeho generátoru........... 31 6.3 Hodnoty generované při měření teploty...................... 33 6.4 Teploty ve C k jednotlivým naměřeným hodnotám............... 34 6.5 Četnost náhodných 16bitových hodnot z našeho generátoru.......... 36 x
Seznam tabulek 3.1 Výpočet hodnoty ɛ u generátoru GENAP-2................... 8 6.1 Požadovaná délka vstupní sekvence pro jednotlivé testy............. 28 6.2 Výsledky prvního testu............................... 29 6.3 Výsledky druhého testu.............................. 30 xi
Kapitola 1 Úvod Generování náhodných čísel není triviální záležitost. Počítače a mikrokontroléry jsou všeobecně konstruovány tak, aby se chovaly deterministicky. Když se nějaký počítač nebo mikrokontrolér začne chovat nedeterministicky, označíme ho za rozbitý a buď ho opravíme nebo vyřadíme. Vzniká nám problém, jak generovat náhodná čísla na deterministickém stroji. V našem případě by se nám více hodily počítače respektive mikrokontroléry, které se chovají náhodně. Tímto by nám vznikl jiný problém. Jak bychom naprogramovaly mikrokontrolér, aby nám generoval náhodná čísla, když se nebude chovat podle programu? I na deterministickém stroji se ale dají generovat náhodná čísla. Když někdo nerozumí nějaké matematické funkci, může pro něj vypočítávat zdánlivě náhodné výsledky. Proto lze pomocí programu generovat náhodná čísla. Když však člověk zná zmíněnou funkci, dokáže výsledky s jistotou vypočítat. Jestliže nechceme, aby se náhodná čísla nedala nikým předvídat, ani tím kdo ví, jak se generují, pak je třeba použít předem nezjistitelný zdroj náhody. Například počasí. Vědci se snaží předvídat počasí po stovky let, ale nikdy nemají jistotu, jaké bude. Všeobecně jsou fyzikální jevy dobrými náhodnými generátory, které se velice špatně předpovídají. Abychom získali z fyzikálních jevů náhodná čísla, musíme je nejdříve změřit. Většinou je potřeba ještě výsledek upravit. Když budeme například měřit rychlost větru v intervalu jedné setiny sekundy, bude jednou naměřená hodnota 30,6 km/h a podruhé 30,8 km/h. Tyto veličiny se mění spojitě. Proto dokážeme odhadnout další naměřenou hodnotu, bude přibližně 31 km/h. Mění se pouze malá část z naměřené hodnoty a tak nelze celý výsledek považovat za náhodný. Za náhodný výsledek by se daly považovat tisíciny z naměřené hodnoty rychlosti větru. V práci řešíme, jaké jsou zdroje náhody a jak lze pomocí nich generovat náhodná čísla. Vybereme jednu metodu, kterou implementujeme na vývojové desce AVR Butterfly. Další problém nastane získáním vygenerovaných čísel. Musíme určit, zda jsou opravdu náhodná. Kritérium náhodnosti je: známe-li libovolné množství předešlých čísel, nemůžeme být schopni určit, jaké číslo bude následovat. Možností testování náhodnosti čísel je více. Jedním z nich je analýza. Výsledky se porovnávají s hodnotami, kterých by pravděpodobně dosáhla náhodná čísla. Můžeme také vytvořit statistiku pozorování posloupností čísel, které považujeme za náhodné, a tu srovnávat s výsledky testovaných posloupností. 1
KAPITOLA 1. ÚVOD 2 V práci popíšeme jednotlivé testy ze sady testů, kterou budeme používat. Ukážeme, jak vyhodnocovat výsledky. Postupně se budeme snažit náš generátor zrychlovat. Při každé implementační změně budeme testovat vygenerovaná čísla, jestli jsou stále náhodná.
Kapitola 2 Vymezení cílů BP Cílem práce je seznámit se s pseudonáhodnými a fyzikálními generátory náhodných čísel. Vybrat jeden generátor náhodných čísel vhodný k implementaci na vývojové desce AVR Butterfly a implementovat jej. Dále se seznámit s testováním náhodnosti, zlepšovat implementaci generátoru a postupně ji testovat. 3
Kapitola 3 Generátory náhodných čísel Generátory náhodných čísel mají dnes velké využití, ať už je to v počítačových hrách, například jako kostka či chování umělé inteligence, nebo při různých simulacích a výzkumech. Téměř každý programovací jazyk dnes obsahuje alespoň jeden generátor náhodných čísel. Další velkou oblastí, která by se bez náhodných čísel téměř neobešla, je kryptografie. Generátory náhodných čísel se snaží vygenerovat posloupnost hodnot se stejnými vlastnostmi, jakých by dosáhla opravdu náhodná sekvence čísel. Dosahují při tom různých kvalit v závislosti na principu generování čísel. Jejich kvalita se testuje pomocí statistických testů náhodnosti. Generátory můžeme rozdělit do dvou základních skupin: na fyzikální generátory náhodných čísel, v literatuře označovány zkratkou RNG (Random Numbers Generator), a na generátory pseudonáhodných čísel (PRNG Pseudorandom Numbers Generator). 3.1 Generátory pseudonáhoných čísel Generátory pseudonáhodných čísel jsou založené na algoritmech. Pokud je znám algoritmus, na němž pracují, lze každý jejich výstup předem vypočítat. V opačném případě je to velice obtížné. U pseudonáhodných generátorů je složité zajistit generování hodnot v celém rozsahu požadovaného intervalu a s rovnoměrným rozložením. Jednodušší algoritmy trpí velkými nedostatky v tomto směru. Složitější pseudonáhodné generátory mohou generovat kvalitní náhodná čísla. Neodbouratelnou nevýhodou všech generátorů pseudonáhodných čísel je periodicita generované sekvence. Pro svůj běh všechny PRNG potřebují tzv. semínko. Semínko musí být náhodné a nepředvídatelné. Z těchto důvodů se ke generování semínka používají obvykle RNG. Pseudonáhodné generátory jsou levné a velice rychlé. Dají se použít v mnoha oblastech: počítačové hry, náhodné vstupy k testování programů, proudové šifry a další. V této sekci se zmíníme o generátorech pseudonáhodných čísel popsaných v [8]. 3.1.1 Lineární kongruenční generátor Lineární kongruenční generátor (LCG Linear Congruential Generator) je jedním z nejstarších pseudonáhodných generátorů. LCG je jednoduchý, snadný na implementaci a rychlý. 4
KAPITOLA 3. GENERÁTORY NÁHODNÝCH ČÍSEL 5 Bohužel je hodně vzdálený od ideálního. Rovnice pro generování náhodných čísel pomocí LGC je: V j+1 A V j + B (mod M), kde V n je sekvence náhodných čísel, A, B a M jsou specifické konstanty generátoru. Perioda LCG je maximálně M, ale velice často je menší. Generátor má nedostatky. Například, pokud je LCG používán ke generování bodů v n-dimenzionálním prostoru, body leží nanejvýše v M 1/n nadrovinách. Tento jev je důsledkem periodické korelace mezi následujícími hodnotami sekvence V n. Pokud M je nastaveno jako mocnina 2, mají nižší bity generované sekvence výrazně kratší periodu, než je perioda celé sekvence. Abychom tento nedostatek alespoň z části redukovali, je doporučeno volit hodnotu M = 2 n 1. LCG se nemůže používat pro účely vyžadující kvalitní náhodná čísla. Dá se použít například v počítačových hrách. 3.1.2 LFG generátor Generátor LFG (Lagged Fibonacci Generator) je vylepšený standardní lineární kongruenční generátor. Je založen na zobecněné Fibonacciho posloupnosti. Fibonacciho posloupnost je popsána rekurentní rovnicí S n = S n 1 + S n 2. LFG zobecňuje Fibonacciho posloupnost na S n = S n j ( ) S n k (mod M), 0 < j < k. Nové číslo je generováno kombinací dvou různých čísel v sekvenci. Operátor ( ) je některá ze základních binárních operací. Může to být například sčítání, odčítání, násobení nebo bitová aritmetická operace XOR. Teorie LFG je poněkud komplexní a není jednoduché vybrat správné hodnoty pro j a k. LFG generátor je také citlivý na počáteční hodnoty. LFG má maximální periodu ( 2 k 1 ) 2 M 1, pokud je použit operátor sčítání a nebo xor. Při použití násobícího operátoru je perioda ( 2 k 1 ) 2 M 3, což je 1/4 periody použité u sčítacího a xor operátoru. Aby generátor dosáhl maximální periody, musí být polynom y = x k + x j + 1 primitivní nad okruhem celých čísel mod 2. Použitelné hodnoty j a k jsou například: {j = 7, k = 10}, {j = 5, k = 17}, {j = 24, k = 55}, {j = 65, k = 71}, {j = 128, k = 159}. LFG má několik nevýhod: počáteční podmínky pro generování jsou velice složité, maximální perioda může obsahovat cykly a matematická teorie pro LFG není kompletní. 3.1.3 LFSR generátor LFSR (Linear Feadback Shift Register posuvný registr s lineární zpětnou vazbou) je posuvný registr, jehož vstup je výsledek funkce xor z některých jeho výstupů. Generátor funguje do té doby, dokud posuvný registr neobsahuje samé nuly. Výstupní sekvence LFSR může být reprezentována polynomem mod 2. Jestliže generátor pracuje s pozicemi 17 a 15, polynom je x17 + x15 + 1. Aby byl LFSR maximální, musí být tento polynom primitivní. LFSR generátor může být implementován hardwarově. To je jeho největší výhoda. Velice rychle generuje posloupnost pseudonáhodných čísel. LFSR generátor má dlouhou periodu a rovnoměrně rozložený výstup. Používá se pro proudové šifry, obzvláště ve vojenské kryptografii.
KAPITOLA 3. GENERÁTORY NÁHODNÝCH ČÍSEL 6 3.2 Fyzikální generátory náhodných čísel Tyto generátory jsou založeny na fyzikálních jevech. Odbourávají největší nevýhodu generátorů pseudonáhodných čísel. Nelze u nich zjistit následující generované číslo ani v případě, že máme příslušný generátor k dispozici a známe celou generovanou sekvenci. Na druhou stranu nemusejí být tak rychlé a mohou být drahé. Kvalitní RNG můžeme použít téměř všude. Jediné místo, kde se použít nedají, je generování proudových šifer. 3.2.1 Generátor náhodného procesu GENAP-2 Tento hardwarový generátor, popsaný v [6], slouží k vytváření posloupností impulsů dvou typů (0 a 1). Ve spojení s dalšími zařízeními umožňuje také vytvářet náhodné procesy a náhodný telegrafní signál symetrický kolem nuly. V této práci nás bude zajímat jeho první funkce, o dalších se nebudeme dále zmiňovat. Jako fyzikální model náhodného procesu je využíván šum polovodičové diody. Šum je zesílen, vhodně ztvarován a dále jsou indikovány průchody šumu pouze z kladné polarity do záporné. Polarita se vztahuje k referenční hladině. Vznik časově náhodných impulsů ze šumu je znázorněn na obrázku 3.1. Obrázek 3.1: Vznik časově náhodných impulsů ze šumu převzato z [6] Časově náhodné impulsy jsou přiváděny na sčítací obvod (klopný bistabilní obvod), kde je během tzv. počítacího intervalu zjišťováno, jestli počet impulsů byl sudý nebo lichý. Podle toho se na konci počítacího intervalu objeví na výstupu generátoru 1 (byl-li počet impulsů sudý) nebo 0 (byl-li počet impulsů lichý). Princip činnosti generátoru je vidět na obrázku 3.2. Aby mohl být sčítací obvod spolehlivě vyhodnocen, jsou mezi počítacími intervaly zařazeny tzv. blokovací intervaly, ve kterých je prováděno vyhodnocení a nulování.
KAPITOLA 3. GENERÁTORY NÁHODNÝCH ČÍSEL 7 Obrázek 3.2: Princip činnosti generátoru převzato z [6] U takto vytvořené posloupnosti je pravděpodobnost výskytu nuly P (0) = 0,5+ɛ, kde ɛ je odchylka pravděpodobnosti od ideální hodnoty 0,5. Jestliže pravděpodobnost výskytu nuly je dle výše uvedené rovnice, pak pravděpodobnost výskytu jedničky je P (1) = 0, 5 ɛ. Vyšší přesnosti statistických parametrů výstupní náhodné posloupnosti lze dosáhnout použitím sčítačky mod 2, o kterou je přístroj GENAP-2 doplněn. Sčítačka mod 2 provádí sčítání výstupní posloupnosti buď po dvojicích a nebo po čtveřicích. Při sčítání po dvojicích získáme ze vstupních kombinací impulsů 00, 11 na výstupu impuls 0 a při vstupech 01, 10 získáme impuls 1. Sčítáním po dvojicích klesne opakovací frekvence výsledné výstupní posloupnosti na polovinu, ale zlepší se konvergence relativních četností nul a jedniček k ideální hodnotě 0,5 tak, že hodnota ɛ se nám změní na 2ɛ 2. V případě, že použijeme sčítání po čtveřicích, klesne opakovací frekvence na čtvrtinu, ale opět nám také klesne odchylka pravděpodobnosti ɛ tentokrát na hodnotu 8ɛ 4. GENAP-2 není ideální generátor. Hodnota ɛ se pohybuje řádově v hodnotách 10 3. V tabulce 3.1 můžeme vidět hodnotu ɛ vypočtenou pro velký počet generovaných impulsů.
KAPITOLA 3. GENERÁTORY NÁHODNÝCH ČÍSEL 8 měř. č. 0 1 D = 1 0 ɛ = D/ ( 1 + 0 ) 1 30 095 299 30 096 749 1 450 1 10 5 2 30 105 175 30 085 591 19 584 16 10 5 Tabulka 3.1: Výpočet hodnoty ɛ u generátoru GENAP-2 3.2.2 HotBits HotBits je internetový zdroj náhodných čísel popsaný v [5]. Počítač, ke kterému je připojena Geiger Műlerova roura, zaznamenává intervaly mezi rozpady radioaktivních jader (kliknutími) radioaktivního zdroje. Náhodná čísla jsou generována z intervalů mezi kliknutími. Radioaktivní rozpad je zcela náhodný. Jestliže k rozpadu nedojde v jednom momentu, šance, že k němu dojde v dalším momentu je naprosto stejná. Za milión let budou šance pořád stejné. Tento princip nestárne. V danou dobu existují dvě možnosti, buď k rozpadu dojde a nebo ne. Proto nemůžeme měřit životnost radioaktivního materiálu, namísto toho měříme poločas rozpadu, což je doba, za kterou se rozpadne polovina jader v daném vzorku. Jestliže je radioaktivní zdroj dostatečně velký a má velký poločas rozpadu, můžeme ignorovat pomalý rozpad a prohlásit každý klik za nezávislou událost. Pravděpodobnost kliknutí v dané milisekundě je stejná a nezávisí na minulých hodnotách. Je to jako nezávislý hod mincí každou milisekundu. Nicméně, tato mince může být asymetrická. Jestliže je zdroj chladný, bude častěji padat orel (bez kliku) než panna (klik). Naštěstí můžeme vyměnit asymetrickou minci za symetrickou. Hody sdružíme do dvojic a páry, ve kterých jsou oba hody stejné, zahodíme. Na získané páry použijeme pravidlo, že dvojice (panna, orel) = 0 a (orel, panna) = 1. Jestliže jsou hody nezávislé, každý z těchto párů má stejnou pravděpodobnost nezávisle na asymetričnosti mince. Jako výsledek dostaneme neovlivněný bit. Toto je známé jako Von Neumannova strategie. Když použijeme důmyslnější strategii, můžeme získat větší množství neovlivněných bitů. Tento princip je téměř dokonalý pro popsané okolnosti. Radioaktivní materiál může pracovat téměř jako dokonalý zdroj náhodnosti. Ale Geigerův počítač je nedokonalá cesta k detekování této náhodnosti. Reálnému Geigerovu počítači trvá určitou dobu, než se zotaví po detekci každé částice. Pravděpodobnost, že dojde ke kliknutí v dané milisekundě není konstantní, závisí na uplynulé době od posledního kliknutí. Z těchto důvodů budeme měřit intervaly mezi kliknutími. HotBits používá jednodušší strategii. Počítá s intervaly v párech. Když T 0 < T 1, výstup je 0, když T 0 > T 1 tak výstup je 1. Jestliže se intervaly rovnají T 0 = T 1, zahodí se. Když se první pár intervalů vyhodnotí, zahodí se a přejde se na následující pár intervalů. Tento postup garantuje generování skutečně náhodných bitů, ale produkuje o něco méně než 0,5 bitů/vzorek. Kdybychom znali medián intervalů M, mohli bychom počet generovaných bitů zvýšit na 1 bit/vzorek. Pro každý interval bychom generovali výstup a to takto: jestliže T < M výstup bude 0, v opačném případě bude výstup 1. Medián použít nemůžeme, protože stejně jako všechna statistická měření je nepřesný a kdybychom udělali v mediánu chybu, byl by výstup zkreslený. Tento problém vyřešil Yuval Peres strategií Advanced Multi-Level Strategy [9, 10] zkráceně AMLS.
KAPITOLA 3. GENERÁTORY NÁHODNÝCH ČÍSEL 9 3.2.3 Zdroje náhodnosti na mikrokontroléru AVR ATmega164P V této sekci se podíváme na metody generování náhodných čísel na mikrokontroléru AVR ATmega164P, které jsou popsané v publikaci [11]. Některé metody používají k získání náhodnosti dva zdroje hodinového signálu. Zdroje hodinového signálu nesmí být na sobě závislé. Jeden z časových zdrojů udává hlavní interval (obvykle ten pomalejší). Po uplynutí tohoto hlavního intervalu se vždy přečte hodnota z rychlejšího zdroje času. Tato hodnota se mění, jelikož se mění jak hlavní inerval, tak rychlost, s jakou čítá rychlejší čítač díky jejich nepřesnostem. Schéma hodinových zdrojů je vidět na obrázku 3.3. Další metody pracují například se šumem u zenerovy diody nebo V/V rozhraními. Obrázek 3.3: Schéma hodinových zdrojů u ATmega164P převzato z [11] 3.2.3.1 Vnitřní EEPROM Obrázek 3.3 ukazuje, že EEPROM používá dva různé časové zdroje časovou řídící jednotku AVR (AVR Clock Control Unit) a kalibrovaný RC oscilátor (Calibrated RC Oscillator). Zapisovací operace paměti EEPROM je vždy časována kalibrovaným interním oscilátorem, zatímco všechny další časové operace používají řídící časovou jednotku AVR. Jestliže nejsou hlavní hodiny kalibrovány interním oscilátorem, pak EEPROM používá dva nezávislé časové zdroje. Dva časové nezávislé zdroje nejsou nikdy ve fázi, proto čas mezi hranami jednoho
KAPITOLA 3. GENERÁTORY NÁHODNÝCH ČÍSEL 10 a druhého zdroje je náhodný. Vždy zde bude časový rozdíl několika málo hlavních cyklů, mezi dvěma EEPROM zapisovacími cykly. Zde je vybrán 9,216 MHz krystalový oscilátor jako základní hodinový zdroj pro tento test. Časovač je použitý pro změření doby zapisovací operace EEPROM. Výsledek je posílán přes rozhraní RS-232 do počítače. Algoritmus vypadá následovně: 1. Start zapisovací operace do paměti EEPROM 2. Spuštění časovače (Timer1) 3. Čekání na přerušení od paměti EEPROM, že je opět připravena 4. Přečtení hodnoty z časovače 5. Odeslání hodnoty do PC 3.2.3.2 Watchdog reset ATmega164P má v sobě zabudovaný watchdog (Watchdog Timer, Watchdog Oscillator, Reset Logic), jejž můžete vidět na obrázku 3.3. Tento watchdog je časován vnitřním samostatným zdrojem 128 khz hodinového zdroje. A jestliže nepoužijeme jako hlavní hodiny interní 128 khz oscilátor, máme opět dva nezávislé časové zdroje. Díky tomu získáme rozdílné časové intervaly opět několika hlavních cyklů mezi dvěma resety vyvolanými watchdogem. Když watchdog přeteče, resetuje mikrokontrolér. Reset ovlivní všechny speciální funkční registry, které jsou nově nastaveny na jejich defaultní hodnoty. Časovač tedy nemůže být použit pro měření času přetečení watchdogu. Co není ovlivněno resetem, je 32 univerzálních registrů a interní SRAM. Proměnná může být inkrementována namísto čítače v univerzálním registru. Jádro AVR umí inkrementovat 16bitovou proměnnou velice rychle. V nekonečném cyklu to zabere pouze 4 hlavní takty. Poté, co je watchdog zapnutý, registrová proměnná je opakovaně inkrementována do doby, než watchdog resetuje mikrokontrolér. Po resetu je přečtena hodnota 16bitové registrové proměnné a je odeslána přes rozhraní RS-232 do počítače. U watchdogu ATmega164P lze nastavit nejkratší přetečení na 16 ms. Se zapnutým brownout detektorem lze nakonfigurovat řadič na přímé vykonání restartu, které zabere pouze 14 taktů po resetu watchdogem. Díky tomu je možné, získat náhodnou hodnotu téměř každých 16 ms. 3.2.3.3 Watchdog přerušení Tato metoda využívá časovou řídící jednotku AVR (AVR Clock Control Unit) a watchdog. Schéma je vidět na obrázku 3.3. Watchdog u ATmega164P má speciální vlastnost. Může pracovat v módu přerušení. V tomto módu watchdog neresetuje mikrokontrolér a nejsou proto žádné speciální registry nastavovány na defaultní hodnoty, jako u metody watchdog reset. Watchdog stále používá vnitřní 128 khz oscilátor, který je nezávislý na hlavních hodinách (9,216 MHz krystalový oscilátor). Časovač s frekvencí 9,216 MHz a watchdog začínají čítat naráz respektive těsně po sobě. Když watchdog přeteče, je vyvoláno přerušení a přečte se hodnota z časovače. Tato hodnota je pak přes rozhraní RS-232 odeslána do počítače.
KAPITOLA 3. GENERÁTORY NÁHODNÝCH ČÍSEL 11 3.2.3.4 Nízkofrekvenční krystal Tato metoda využívá časovou řídící jednotku AVR (AVR Clock Control Unit) a nízkofrekvenčí krystalový oscilátor (Low-frequency Crystal Oscillator), jež jsou na obrázku 3.3. Časovač Timer2 na ATmega164P může běžet v asynchronním módu. Časovač 2 používá nízkofrekvenční krystalový oscilátor o frekvenci 32 khz. Můžeme tedy použít dva nezávislé časovače běžící na různých frekvencích Timer1: 9,216 MHz, Timer2: 32 khz. Přetečení časovače 2 nám způsobí přerušení. V obsluze přerušení pak pošleme hodnotu časovače 1 přes rozhraní RS-232. 3.2.3.5 Rozhraní RS-232 Pro komunikaci přes rozhraní RS-232 byl jako hlavní hodinový zdroj vybrán 9,216 MHz oscilátor. Tato frekvence umožňuje komunikaci standardní přenosovou rychlostí s chybovostí 0,0%. Šestnácti bitový čítač na ATmega164P může být nastaven tak, aby čítal také s rychlostí 9,216 MHz. Pokaždé, když jsou data příjata, je aktuální hodnota čítače přečtena a odeslána přes rozhraní RS-232 do počítače. Rozhraní RS-232 pracuje asynchronně, proto hodnotu časovače nelze předpovědět. Čtení hodnoty čítače může být spouštěno také přes jiná rozhraní, například digitální a analogový vstup, LIN/CAN rozhraní a další. 3.2.3.6 SPI ATmega164P obsahuje sériové periferní rozhraní (SPI Serial Peripheral Interface). SPI pracuje jako jednoduchý posuvný register a je standardní periferií pro většinu mikrokontrolérů. Ke generování náhodných čísel přes SPI, byl připojen přibližně 1,2 MHz externí zdroj hodin na vstup SPI. SPI bylo konfigurováno jako master. Dále byly použity externí hodiny na frekvenci 2,25 khz. Externí a SPI hodiny musí být nezávislé. To zaručí, že hodnota, kterou bude SPI číst je nepředvídatelná. Při generování čísel touto metodou bylo zjištěno, že SPI čte data se stejnou hodnotou v sériích. Kvůli tomu byla přijata podmínka, že data budou akceptována jako náhodná až tehdy, když se nebudou shodovat s předešlými. I přes to byl však ve vygenerovaných hodnotách nalezen opakující se vzor. Proto tato metoda není takto použitelná pro generování náhodných čísel. 3.2.3.7 ADC ATmega164P obsahuje 10bitový analogově digitální převodník (ADC Analog to Digital Cenverter) s volitelnou 200 násobnou zesilující částí. Zesilovací část je dostupná v diferenčním vstupním módu. Zenerova dioda na obrázku 3.4 vždy generuje malé µv šumu. Šum je zesílen přes 200 násobnou zesilovací část a měřen analogově digitálním převodníkem. Sto kω odpor a dva kondenzátory eliminují šum na jednom vstupním pinu analogově digitálního převodníku (dolní propust) převádíme tedy pouze zenerovo napětí. Nefiltrované zenerovo napětí je připojeno k druhému pinu ADC. ADC měří pouze rozdíl napětí mezi
KAPITOLA 3. GENERÁTORY NÁHODNÝCH ČÍSEL 12 Obrázek 3.4: Schéma ADC u ATmega164P převzato z [11] těmito dvěma piny. Hodnota takto změřeného zesíleného napětí je odeslána do počítače. Nicméně, zesilovací část analogově digitálního převodníku nemá perfektní vstup s nekonečným vstupním odporem a tak vtéká malý proud do zesilovací části. To způsobí, že je přidáno napětí k napětí šumu. Tento jev nám nevadí v případě, že přidané napětí nedosáhne maximálního napětí, které je schopen změřit ADC. 3.2.3.8 Časovač ISR Většina instrukcí se v jádře AVR provádí v jednom nebo dvou taktech. Některé instrukce ale zabírají 3, 4 nebo dokonce 5 taktů. Jestliže je vyvoláno přerušení v instrukci, jejíž provádění zabírá více taktů než jeden, je tato instrukce nejprve dokončena a až poté je přerušení obslouženo. To znamená, že čas od vyvolání přerušení do jeho provedení není pevný, ale mění se. Závisí to na právě prováděné instrukci. Jestliže je přerušení vyvoláno po prvním taktu pěti-taktové instrukce, skok do obsluhy přerušení (ISR Interrupt Service Routine) je zpožděn o 4 takty. Jestliže je časovač nastaven tak, aby dokola vyvolával přerušení, zpoždění obsluhy přerušení se bude lišit v závislosti na instrukci, která je prováděna v době zavolání přerušení. Toto zpoždění může být změřeno a použito ke generování náhodných čísel. Algoritmus pro tuto metodu je následující: 1. Spuštění časovače 2. Provádění nějakého programu 3. Při přerušení od časovače 1 je přečtena jeho hodnota 4. Odeslání hodnoty do počítače V této metodě je důležité, aby prováděný program obsahoval instrukce s různým počtem taktů. Jestliže program bude například pouze inkrementovat hodnotu v registru a nebo by byl mikrokontrolér v režimu spánku, tato metoda fungovat nebude, jelikož zpoždění obsluhy přerušení bude pořád stejné.
KAPITOLA 3. GENERÁTORY NÁHODNÝCH ČÍSEL 13 3.2.3.9 Vstupní zachytávací jednotka ATmega164P obsahuje vstupní zachytávací jednotku (TBD Input Capture Unit). Tato jednotka měří frekvenci obdélníkového signálu. Může být také nakonfigurována k ukládání aktuální hodnoty časovače 1 reagující na vzestupnou nebo sestupnou hranu vstupního zachytávacího pinu či vstup analogového komparátoru. Jestliže je měřen externí signál přes vstupní zachytávací jednotku, hodnota časovače 1 by se mohla měnit, což by pak byl zdroj náhodnosti. Toto je pouze myšlenka, která nebyla zatím vyzkoušena. 3.2.4 Náš generátor náhodných čísel na mikrokontroléru Atmel AVR Náš generátor náhodných čísel je popsaný v [7]. Oscilace RC oscilátoru na vývojové desce jsou použity jako zdroj náhody ke generování osmi náhodných bitů za sekundu. Při implementaci této metody na vývojovou desku AVR Butterfly není zapotřebí žádných přídavných komponentů. 3.2.4.1 Generování náhodných čísel Mikrokontrolér ATmega169 [1] na vývojové desce AVR Butterfly [2] může přistupovat k několika oscilátorům. Základní konfigurace využívá RC oscilátor uvnitř čipu jako systémové hodiny. Dále může použít oscilátor s externě připojeným krystalem jako asynchronní hodinový generátor pro časovač 2. Tyto oscilátory nejsou nikdy perfektně stabilní. Jejich frekvence kolísají z mnoha fyzikálních příčin, jako například velikost napětí, okolní teplota a další. Důležité je, že vliv těchto fyzikálních příčin je odlišný u každého oscilátoru. Krystalový oscilátor je více stabilní, zatímco RC oscilátor vykazuje větší kolísání. I když je přípravek pořád ve stabilním prostředí a je napájen ze stabilizovaného zdroje, RC oscilátor vykazuje měřitelné kolísání. Toto kolísání u RC oscilátoru může být použito jako zdroj náhody. V této metodě je použit krystalový oscilátor k tomu, aby odpočítával jednu sekundu. Po uplynutí doby je přečtena hodnota, kterou načítal RC oscilátor. V ideálním světě by byla načítaná čísla stále stejná. Ovšem v reálném světě se tato čísla mění. Princip metody pro generování náhodných čísel je znázorněn na obrázku 3.5. Časovač 1 čítá takty systémového RC oscilátoru, ten funguje na přednastavené frekvenci 2 MHz. Časovač 2 s krystalovým oscilátorem, který funguje na frekvenci 32,768 khz, vyvolává přerušení pomocí předděličky každou sekundu. V obsluze přerušení je 16bitová hodnota z časovače 1 přečtena a uložena. Časovač 1 je následně vynulován a uložená hodnota je odeslána přes rozhraní RS-232 do počítače. Po provedení těchto instrukcí je opuštěna obsluha přerušení a mikrokontrolér čeká opět na přerušení od časovače 2. 3.2.4.2 Testování náhodnosti Pro testování náhodnosti byla použita sada testů NIST sts-2.0b popsaná v [3]. Nyní je důležité rozhodnout, které bity z naměřených hodnot jsou náhodné a které ne. V důsledku toho je nutné z naměřených 16bitových hodnot získat řetězce obsahující pouze jednotlivé bity. Tím vznikne 16 souborů obsahující 0., 1., až 15. bit ze všech naměřených hodnot.
KAPITOLA 3. GENERÁTORY NÁHODNÝCH ČÍSEL 14 Obrázek 3.5: Princip generování náhodných čísel na AVR Butterfly převzato z [7] Tyto jednotlivé řetězce jsou pak testovány. Jak se očekávalo, bity 15 10 nejsou náhodné, jelikož mnoho P value (hodnota v intervalu od nuly do jedné včetně, která udává náhodnost testovaného řetězce) bylo pod hranicí 0,01. Je to vidět i v původním souboru 16 bitových hodnot, kde se tyto vyšší bity skoro vůbec nemění. Bit 9 už je na tom lépe, výrazně se mění. Zbývá zjistit, zda je náhodnost dostatečná. Bohužel i u 9. bitu se objevila P value pod hranicí 0,01 u výsledků více testů. Dále je důležité si uvědomit, že nejméně významný bit 0 (LSB Least Significant Bit) také není náhodný. To proto, že než může být přerušení obslouženo, musí být dokončena právě prováděná instrukce. Většina AVR instrukcí zabírá jeden nebo dva takty. To dělá LSB bit příliš závislý na vykonávaném kódu. V extrémním případě, kdy kód nic nedělá, ale pouze čeká v nekonečném cyklu na přerušení, mikrokontrolér pouze vykonává instrukci RJMP, která zabírá dva takty, LSB zůstává konstantní. Pro zbývající bity 1 8 stále neprošly některé testy. To byl Univerzální test, který neprošel pro nedostatečné množství dat a některé z mnoha výsledků testu NonOverlapping- Template. Výsledek by měl být však stále vpořádku, jelikož 1% hranice očekává, že jeden ze 100 testů může selhat, i když je ve skutečnosti testovaná sekvence náhodná. Nakonec byla otestována i sekvence obsahující všechny náhodné bity a to bity 1 8. Bohužel stále to nestačilo pro univerzální test, ale výsledky ostatních testů byly dobré.
Kapitola 4 Testování náhodnosti K testování je možné použít více druhů testů nebo testovacích algoritmů. Některé testy pracují s pevně danými číselnými intervaly, ale ty lepší pracují se sekvencemi jednotlivých bitů. Mezi tyto testy patří také sada statistických testů STS Statistical Test Suite [3] od institutu NIST a sada testů Dieharder [4]. Zde je nutno podotknout, že sada testů Dieharder vyžaduje k testování velice dlouhou sekvenci vygenerovaných bitů. Proto se budeme dále zabývat první zmíněnou sadou testů. Nyní je důležité si uvědomit, jak by mělo vypadat testování náhodnosti respektive rozhodování, zda lze konkrétní sekvenci bitů považovat za náhodnou. Máme určitou sekvenci bitů. Každý bit může být s 50% pravděpodobností 1 nebo 0 a nezáleží na tom, jaké bity stojí před ním. Máme-li k dispozici dostatečně dlouhou bitovou sekvenci, vyplývá z toho, že poměr počtu jedniček a nul by měl být v této sekvenci vyrovnaný. První test, který bychom navrhli pro testování náhodnosti, by byl test poměru jedniček a nul. Tento test se ale dá snadno obejít. Představme si například generátor, který vygeneruje sekvenci obsahující 10 000 bitů. Aby prošel tímto testem, vygeneruje za sebou 5 000 nul a 5 000 jedniček. Tato sekvence by naším testem prošla, ale náhodná zcela určitě není. Tento test nefunguje a musíme vymyslet jiný. Abychom odhalili sekvenci, ve které máme na začátku jedničky a na konci nuly, je potřeba vymyslet jiný test. Druhý test testovanou sekvenci rozdělí do několika podsekvencí a na tyto podsekvence provede náš první test. Ještě zavedeme podmínku, že první test musí projít pro všechny podsekvence, aby mohla být původní sekvence označena za náhodnou. Způsobů dělení do podsekvencí může být více. Sekvenci můžeme rozdělit do pevně daného počtu podsekvencí a nebo ji můžeme dělit po pevně daném počtu bitů. Bohužel i tento test můžeme snadno obejít. Náš generátor bude generovat střídavě dvojici bitů 1 a 0. Projde i druhým testem, ale náhodná čísla negeneruje. Ani tento test nefunguje a musíme opět vymyslet jiný. Náš třetí test bude sčítat počet změn z nuly na jedničku a naopak. Pokud bude počet změn příliš malý nebo příliš velký v závislosti na délce sekvence, vyhodnotí ji jako nenáhodnou. Aby sekvence prošla tímto testem, bude muset mít počet změn přibližně odpovídající očekávanému počtu změn náhodné sekvence (to můžeme získat ze statistik a nebo vypočítat pomocí matematické pravděpodobnosti). Náš třetí test odhalí první i druhou nenáhodnou sekvenci. Víme-li, že ke změně bitů dochází v průměru jednou po 3 bitech, můžeme vygenerovat sekvenci, která obsahuje po sobě vždy jednu nulu a pět jedniček. Tato posloupnost projde naším třetím testem, ale je také nenáhodná. Použitím všech tří testů posloupnost 15
KAPITOLA 4. TESTOVÁNÍ NÁHODNOSTI 16 odhalíme. K testování náhodnosti je dobré použít více testů. Proto i výše zmíněné testy (programy) jsou sadami testů. Budeme-li vymýšlet stále další a sofistikovanější testy, bude se nám také dařit vytvářet sekvence, které těmito testy projdou a budou nenáhodné. Velice účinnou zbraň proti výše zmíněnému používá NIST v STS [3]. Testovanou sekvenci rozdělí na podsekvence a ty otestuje sadou patnácti testů. U každého testu spočítá P value, což je hodnota v intervalu <0, 1> udávající náhodnost testované sekvence. Pokud je P value < 0,01, je sekvence vyhodnocena jako nenáhodná. Aby byl generátor dobrý pro generování náhodných čísel, nemusí ani nesmí mít pro všechny podsekvence hodnoty P value rovny 1. Analogii hledejme v opravdu náhodné sekvenci. Kdybychom rozdělili náhodnou sekvenci, jež by měla hodnotu P value 1 (P value = 1 by měla s určitostí pouze nekonečná náhodná sekvence bitů), tak jednotlivé podsekvence nebudou mít P value = 1. Některé podsekvence nemusí ani testy projít. Proto NIST při vyhodnocování používá test rovnoměrného rozložení hodnot P value. A pro kontrolu, jestli neskončilo mnoho sekvencí vyhodnocených jako nenáhodné, používá test poměru úspěšných sekvencí. Tyto testy jsou popsané v sekci 4.2. 4.1 Popis jednotlivých testů Pro všechny testy platí, že když P value 0,01, je vstupní sekvence považována za náhodnou. Pro názornost uvádíme u několika prvních jednodušších testů i definici a ukázku příkladu. Konkrétní definice dalších testů jsou popsány v [3]. 4.1.1 Frequency (Monobit) Test (frekvenční test) Test se zaměřuje na poměr jedniček a nul v celé testované sekvenci. Zkoumá, jestli se poměr jedniček vzhledem k celkovému počtu bitů blíží k hodnotě 0,5. Účelem testu je rozhodnout, zda počet jedniček a nul v testované sekvenci je přibližně stejný jako očekávaný počet pro opravdu náhodnou sekvenci. Všechny následující testy závisí na tom, jestli tento test projde nebo ne. 4.1.1.1 Popis testu Nejprve je vstupní sekvence (0, 1) upravena na sekvenci (+1, 1). Všechny hodnoty v nové sekvenci se sečtou a statisticky se vyhodnotí P value. 4.1.1.2 Definice n Délka vstupní sekvence. ɛ Jednotlivé bity testované sekvence ɛ = ɛ 1, ɛ 2,..., ɛ n. S n Sekvenci přeměníme na chybovou sekvenci S n skládající se z ±1, tak že S n = X 1 + X 2 +... + X n, kde X i = 2ɛ 1.
KAPITOLA 4. TESTOVÁNÍ NÁHODNOSTI 17 S obs Statistický přehled S obs je absolutní chyba dělená druhou odmocninou délky sekvence. S obs = S n n P value ( Sobs P value = erfc ), kde funkce erfc je popsána v [3] v sekci 5.5.3. 2 4.1.1.3 Příklad Sekvence ɛ = 1011010101 (1) Konverze na sekvenci ±1: S n = 1+( 1)+1+1+( 1)+1+( 1)+1+( 1)+1 = 2. (2) S obs = 2 10 = 0,632 455 32 ( ) 0,632 455 32 (3) P value = erfc = 0,527 089. 2 4.1.2 Frequency Test within a Block (frekvenční blokový test) Test se zaměřuje na poměr jedniček a nul uvnitř M-bitových bloků. Test zkoumá, jestli je počet jedniček uvnitř M-bitového bloku přibližně rovný hodnotě M/2, jak se očekává u předpokladu náhodnosti. Pro blok velikosti M = 1 je tento test stejný jako test Frequency (Monobit) Test. 4.1.2.1 Popis testu Vstupní sekvence se rozdělí do M-bitových bloků. Zbylé bity na konci sekvence jsou nevyužité. Pro každý blok M se spočítá poměr jedniček. Z výsledků jednotlivých bloků se statisticky spočítá P value. 4.1.2.2 Definice n M Délka vstupní sekvence. Velikost každého bloku. ɛ Jednotlivé bity testované sekvence ɛ = ɛ 1, ɛ 2,..., ɛ n. χ 2 (obs) Měří, jak se pozorovaný poměr jedniček uvnitř M-bitového bloku rovná očekávané hodnotě 1/2. χ 2 (obs) = 4M (π i 0,5) N 2 i=1
KAPITOLA 4. TESTOVÁNÍ NÁHODNOSTI 18 P value P value = igamc ( N/2, χ 2 (obs)/2 ), kde funkce igamc je nekompletní gamma funkce pro Q(a,x) definovaná v [3] v sekci 5.5.3. 4.1.2.3 Příklad Pro tento příklad máme sekvenci ɛ = 0110011010, n = 10, M = 3. n (1) Rozdělíme vstupní sekvenci do N = nepřekrývajících se bloků. Nevy- M užité bity na konci sekvence zahodíme. Dostaneme tři bloky 011, 001, a 101. Poslední 0 bude nevyužita. (2) Spočítáme poměr jedniček π i v každém M-bitovém bloku π i = pro 1 i N. V našem případě π 1 = 2/3, π 2 = 1/3, π 3 = 2/3 ( (3) χ 2 (obs) = 4 3 (2/3 1/2) 2 + (1/3 1/2) 2 + (2/3 1/2) 2) = 1. (4) P value = igamc (3/2, 1/2) = 0,801 252 M j=1 ɛ (i 1)M+j M, 4.1.3 Runs Test (test identických skupin) Test hledá počet skupin skládajících se z posloupnosti identických bitů. Skupina posloupnosti identických bitů k, je skupina bitů délky k obsahující přesně k identických bitů, které jsou na začátku a na konci ohraničené bity opačnými. Účelem testu je zjistit, zda počet identických skupin různé délky odpovídá očekávanému počtu pro náhodnou sekvenci. Jinými slovy nám tento test určí, zda změna mezi jedničkami a nulami není příliš rychlá a nebo příliš pomalá. 4.1.3.1 Popis testu Spočítáme celkový počet posloupností identických bitů. Ze získané hodnoty vypočteme statisticky P value. 4.1.3.2 Definice n Délka vstupní sekvence. ɛ Jednotlivé bity testované sekvence ɛ = ɛ 1, ɛ 2,..., ɛ n. n 1 V n (obs) Celkový počet posloupností identických bitů. V n (obs) = r (k) + 1, kde r (k) = 0 když ɛ k = ɛ k+1 v opačném případě r (k) = 1. k=1
KAPITOLA 4. TESTOVÁNÍ NÁHODNOSTI 19 P value ( ) Vn (obs) 2nπ (1 π) P value = erfc 2 2nπ (1 π) 4.1.3.3 Příklad Pro tento příklad máme sekvenci ɛ = 1001101011, n = 10. (1) Nejdříve spočítáme poměr jedniček π ve vstupní sekvenci π = j ɛ j n = 3/5. (2) Počet skupin v sekvenci ɛ = 1 00 11 0 1 0 11 je V 10 (obs) = (1 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0) + 1 = 7. (3) P value = 0,147 232 4.1.4 Test for the Longest Run of Ones in a Block (test nejdelší posloupnosti jedniček uvnitř bloku) Test hledá nejdelší posloupnost jedniček uvnitř M-bitového bloku. Účelem tohoto testu je rozhodnout, zda nejdelší posloupnost jedniček uvnitř testované sekvence odpovídá předpokládané délce pro náhodnou sekvenci. Nepřiměřená délka nejdelší posloupnosti jedniček naznačuje také nepřiměřenou délku nejdelší posloupnosti nul. Proto není třeba dělat test nejdelší posloupnosti nul. Více se o tom dozvíte v sekci 4.4 v [3]. 4.1.4.1 Popis testu Vstupní sekvence se rozdělí do M-bitových bloků. Pro každý blok se vyhodnotí nejdelší posloupnost jedniček. Z jednotlivých výsledků se statisticky vypočítá P value. 4.1.4.2 Definice n Délka vstupní sekvence. ɛ Jednotlivé bity testované sekvence ɛ = ɛ 1, ɛ 2,..., ɛ n. M Velikost každého bloku. M může nabývat pouze tří hodnot, M = 8 když n 128, M = 128 když n 128 a M = 10 4 když n 750 000 χ 2 (obs) Zjišťuje, jak délka nejdelší posloupnosti jedniček v M-bitovém bloku odpovídá očekávané délce. χ 2 (v i Nπ i ) 2 K (obs) =, kde hodnota π i je definována v sekci 3.4 v [3], hodnoty K a N závisí na M tak, že když M = 8 pak Nπ i=0 i K = 3 a N = 16, M = 128 pak K = 5 a N = 49, M = 10 4 K = 6 a N = 75. P value P value = igamc ( K/2, χ 2 (obs)/2 )
KAPITOLA 4. TESTOVÁNÍ NÁHODNOSTI 20 4.1.5 Binary Matrix Rank Test (test hodnosti binární matice) Test se zaměřuje na hodnost disjunktních sub-matic testované sekvence. Účelem tohoto testu je prověřit lineární závislost mezi podřetězci pevně dané délky z testované sekvence. 4.1.5.1 Popis testu U tohoto testu byly spočítány pravděpodobnosti pro binární matice o velikosti 32x32 bitů. Minimální počet testovaných matic je 38. Proto musí být minimální délka testované sekvence větší než 38 912 bitů. Test se může provádět i s jinými počty řádků a sloupců u matic, ale bylo by zapotřebí vypočítat pro ně pravděpodobnosti. Sekvence se rozdělí do bloků po 32x32 bitů. Přebytečné bity se zahodí. Jednotlivé bloky se zapíší do matic a spočítá se hodnost každé matice. Výsledky hodností matic se rozdělí do tří skupin a spočítá se jejich množství. V první skupině jsou hodnosti o velikosti počtu řádků matice. Ve druhé skupině jsou hodnosti o jedna menší a ve třetí skupině jsou zbylé hodnosti. Nakonec se statisticky vyhodnotí P value. 4.1.6 Discrete Fourier Transform (spectral) Test (diskrétní test pomocí Fourierovi transformace) Na stránkách institutu NIST, je uvedeno, že ve vyhodnocování tohoto testu je chyba. Proto ho zde nebudeme ani uvádět. 4.1.7 Non-overlapping Template Matching Test (test na nepřekrývající se vzory) Test se zaměřuje na počet opakování předdefinovaného řetězce v sekvenci. Účelem testu je nalézt generátory, které produkují příliš mnoho opakujících se vzorů. 4.1.7.1 Popis testu Test používá m-bitové okno k hledání konkrétního m-bitového vzoru. Jestliže aktuální okno neodpovídá vzoru, přesune se o jeden bit. V případě, že se okno shoduje se vzorem, inkrementuje se hodnota opakování a okno se přesune o m bitů. Test rozděluje vstupní sekvenci do stejných bloků o velikosti M = 131 072. V kódu je definován počet bloků N = 8. Proto test vyžaduje sekvenci o velikosti alespoň 10 6 bitů. NIST doporučuje zvolit hodnotu m = 9 nebo m = 10. Pro jednotlivé bloky se počítají hodnoty opakování a ze získaných výsledků se statisticky vyhodnotí P value. Test je opakován několikrát pro různé vzory, proto je v souboru finalanalysisreport více řádků s výsledky u tohoto testu. 4.1.8 Overlapping Template Matching Test (test na překrývající se vzory) Test se zaměřuje na počet opakování předdefinovaného řetězce v sekvenci. U tohoto testu vzor obsahuje samé jedničky.
KAPITOLA 4. TESTOVÁNÍ NÁHODNOSTI 21 4.1.8.1 Popis testu Test používá m-bitové okno k hledání konkrétního m-bitového vzoru. Jestliže aktuální okno neodpovídá vzoru, přesune se o jeden bit. V případě, že se okno shoduje se vzorem, inkrementuje se hodnota opakování a okno se přesune o m 1 bitů. Test rozděluje vstupní sekvenci do stejných bloků o velikosti M = 1 032. V kódu je definován počet bloků N = 968. Proto test vyžaduje sekvenci o velikosti alespoň 10 6 bitů. NIST doporučuje zvolit hodnotu m = 9 nebo m = 10. Pro jednotlivé bloky se počítají hodnoty opakování, které se rozdělují do 6 skupin následovně: v první skupině jsou hodnoty obsahující 0 opakování, ve druhé skupině hodnoty obsahující 1 opakování,... a v poslední, šesté skupině, jsou hodnoty obsahující 5 a více opakování. Ze získaných výsledků se statisticky vyhodnotí P value. 4.1.9 Maurer s Universal Statistical Test (Maererův statistický univerzální test) Test se zaměřuje na počet bitů mezi odpovídajícími vzory (to souvisí s délkou komprimované sekvence). Zjišťuje, zda může být sekvence významně zkomprimována bez ztráty informace. Významně zkomprimovatelná sekvence je označena za nenáhodnou. 4.1.9.1 Popis testu Test používá malé L-bitové bloky. Hodnota L závisí na velikosti vstupní sekvence a je v intervalu < 6, 16 >. Sekvence pro nejmenší L musí obsahovat alespoň 387 840 bitů. Test rozděluje vstupní sekvenci na dvě: počáteční sekvenci Q a testovací sekvenci K. Sekvence Q obsahuje 10 2 L bitů a sekvence K obsahuje n/l Q bitů. Pro názornost je průběh testu vysvětlen na tabulce. Na začátku testu je vytvořena tabulka, která obsahuje jeden řádek a sloupce se všemi možnými hodnotami L-bitových bloků, těch je přesně 2 L. V prvním řádku tabulky je zapsaná největší pozice L-bitových bloků v počáteční sekvenci Q. Test postupně prochází testovanou sekvenci K po L-bitových blocích a přidává do tabulky řádky. Nový řádek je shodný s předchozím až na sloupec, který odpovídá aktuálnímu L bloku v testované sekvenci. Zároveň test počítá proměnnou sum. Ta reprezentuje všechny změny detekované v sekvenci K. Proměnná sum se spočítá sum = sum + log 2 (i T i ), kde i je aktuální pozice bloku L a T i je předchozí pozice v přepsaném sloupci. Hodnota sum se následně porovnává s teoreticky očekávanou hodnotou pro náhodnou sekvenci a podle výsledků je statisticky vyhodnocena P value. 4.1.10 Linear Complexity Test (test lineární složitosti) Test se zaměřuje na délku LFSR. Test zjišťuje, zda je sekvence dostatečně složitá na to, aby mohla být označena za náhodnou. Náhodné sekvence se vyznačují delším LFSR.
KAPITOLA 4. TESTOVÁNÍ NÁHODNOSTI 22 4.1.10.1 Popis testu Vstupní sekvence je rozdělena do N M-bitových bloků. Test hledá uvnitř každého bloku i od počátku nejkratší L i -bitovou sekvenci LFSR, která generuje zbylé bity v bloku i. Aby sekvence L i vygenerovala následující bit, musí se následující bit rovnat součtu některých bitů modulo 2. Sekvence L i se po každém vygenerovaném bitu posune o jeden bit a sečtením bitů na stejných pozicích v sekvenci L i mod 2 musí vygenerovat další bit. Tímto způsobem musí vygenerovat všechny zbylé bity v bloku i. Ze získaných hodnot L i pro jednotlivé bloky a dalších koeficientů je nakonec statisticky vyhodnocena P value. NIST doporučuje pro tento test vstupní sekvenci 1 000 000. Hodnota M musí být v rozmezí 500 M 5000 a N musí být 200. 4.1.11 Serial Test (sériový test) Test se zaměřuje na frekvenci všech možných překrývajících se m-bitových vzorů skrze celou sekvenci. Test rozhoduje, zda je počet opakování 2 m m-bitových překrývajících se vzorů přibližně shodný s očekávanými výsledky pro náhodnou sekvenci. Náhodné sekvence jsou rovnoměrné, proto každý m-bitový vzor má stejnou šanci se objevit v sekvenci jako ostatní m-bitové vzory. Pokud m = 1 je test Serial Test shodný s testem Frequency (Monobit) Test. 4.1.11.1 Popis testu Test nejdříve přidá na konec sekvence prvních m 1 bitů. Dále spočítá četnosti všech možných překrývajících se m-bitových bloků, všech možných překrývajících se m 1bitových bloků a všech možných překrývajících se m 2bitových bloků. Výsledky jsou vyhodnoceny a statisticky se spočítá P value. Doporučení pro zvolení hodnot m a velikosti bloku n je m < log 2 n 2. 4.1.12 Approximate Entropy Test (aproximační test entropie) Tento test, stejně jako test Serial Test, se zaměřuje na četnost všech možných překrývajících se m-bitových vzorů skrze celou vstupní sekvenci. Test porovnává četnost překrývajících se bloků dvou velikostí (m a m + 1) s očekávaným výsledkem pro náhodnou sekvenci. 4.1.12.1 Popis testu Oproti testu Serial Test je zde P value počítána jiným způsobem. Nároky na hodnoty m a velikosti bloku n jsou zde stejné, tedy m < log 2 n 2.
KAPITOLA 4. TESTOVÁNÍ NÁHODNOSTI 23 4.1.13 Cumulative Sums (Cusum) Test (test kumulativní sumy) Test se zaměřuje na maximální odchylku (od nuly) náhodného průchodu pomocí kumulativní sumy upravené sekvence (0, 1) na (+1, 1). Velká odchylka nám říká, že jsou v sekvenci místa nebo místo, kde je velké množství stejných bitů střídané menším množstvím bitů s opačnou hodnotou. Test porovnává velikost odchylky s předpokládanou hodnotou pro náhodnou sekvenci. Velká odchylka od nuly značí příliš mnoho 0 nebo 1. Malá odchylka značí příliš časté střídání hodnot. 4.1.13.1 Popis testu Test postupně prochází celou sekvenci a počítá celkovou sumu. Odchylka od nuly je pak maximální absolutní hodnota počítané sumy. Test prochází vstupní sekvenci zepředu a zezadu. Pomocí odchylek a dalších koeficientů jsou spočítány dvě hodnoty P value, jedna pro průchod odpředu a druhá pro průchod odzadu. Vstupní sekvence u tohoto testu by měla mít alespoň 100 bitů. 4.1.14 Random Excursions Test (test náhodných odchylek) Test se zaměřuje na počet cyklů, které obsahují K návštěv v kumulativní sumě. Test vytváří řetězec S, který obsahuje hodnoty výsledků kumulativní sumy. Cyklus je sekvence obsahující hodnoty z řetězce S, které leží mezi hodnotami 0. 4.1.14.1 Popis testu Test vytvoří řetězec S a přidá na jeho začátek i konec 0. Dále rozdělí řetězec na jednotlivé cykly. Nula, která ukončuje jeden cyklus, je začátkem následujícího cyklu. V dalším kroku se spočítá, kolikrát se v jednotlivých cyklech objevila každá z hodnot -4, -3, -2, -1, 1, 2, 3 a 4. Pro každou hodnotu se nakonec spočítá P value, proto je ve výsledném vyhodnocení osmi výsledků tohoto testu. Je doporučeno, aby vstupní sekvence obsahovala alespoň 1 000 000 bitů. 4.1.15 Random Excursions Variant Test (variace testu náhodných odchylek) Test se zaměřuje na celkový počet návštěv v kumulativní sumě. Test vytváří řetězec S, který obsahuje hodnoty výsledků kumulativní sumy. Cyklus je sekvence obsahující hodnoty z řetězce S, které leží mezi hodnotami 0. 4.1.15.1 Popis testu Test vytvoří řetězec S a přidá na jeho začátek i konec 0. Dále rozdělí řetězec na jednotlivé cykly. Nula, která ukončuje jeden cyklus, je začátkem následujícího cyklu. V dalším kroku se spočítá, kolikrát se v sekvenci S objevila každá z hodnot -9, -8,..., -2, -1, 1, 2,..., 8 a 9. Pro každou hodnotu se nakonec spočítá P value, proto je ve výsledném vyhodnocení osmnácti výsledků tohoto testu. Je doporučeno, aby vstupní sekvence obsahovala alespoň 1 000 000 bitů.
KAPITOLA 4. TESTOVÁNÍ NÁHODNOSTI 24 4.2 Vyhodnocení výsledků Vyhodnocení empirických výsledků může být provedeno mnoha způsoby. NIST v sadě statistických testů používá dva testy pro vyhodnocení výsledků. První z nich je poměr úspěšných sekvencí. To je poměr sekvencí, které projdou testem, k celkovému počtu testů. Druhý test je rozložení hodnot P value pro kontrolu rovnoměrnosti. 4.2.1 Proportion of Sequences Passing a Test (poměr úspěšných sekvencí) Z empirických výsledků pro jednotlivé statistické testy spočítáme poměr sekvencí, které jsou úspěšné. Například jestliže je testováno 1 000 binárních sekvencí (tedy m = 1 000) a z toho je 996 sekvencí úspěšných, znamená to, že těchto 996 sekvencí má P value 0,01, potom je poměr úspěšných sekvencí 996/1 000 = 0,996. Rozsah pro úspěšné projití testem poměru úspěšných sekvencí je definován následovně: ˆp (1 ˆp) ˆp ± 3, kde ˆp = 1 0,01 a m je počet sekvencí. Pro příklad, který je uvedený m 0,99 (1 0, 99) výše dostaneme: 0,99 ± 3 = 0,99 ± 0,009 439 2. Poměr úspěšných sekvencí 1 000 by měl tedy ležet nad hodnotou 0,980 560 7. 4.2.2 Uniform Distribution of P values (rovnoměrnost rozložení hodnot P value) Obrázek 4.1: Histogram hodnot P value převzato z [3] Rozložení hodnot P value se zkoumá kvůli určení rovnoměrnosti. Můžeme ho znázornit na obrázku 4.1. Interval od 0 do 1 je rozdělen do 10 podintervalů po 0,1. Hodnoty P value, které spadají do jednotlivýh intervalů jsou sečteny a zobrazeny v grafu. Matematicky je to vyhodnoceno pomocí funkce χ 2 a pomocí vyhodnocení P value z jednotlivých hodnot P value. Funkci χ 2 spočítáme následovně χ 2 Fi s ) 2 10 ( 10 (obs) =, kde i=1 s 10
KAPITOLA 4. TESTOVÁNÍ NÁHODNOSTI 25 F i je počet hodnot P value v podintervalu ( ) i, a s je celkový počet sekvencí. P value je spočítána takto: P value T = igamc 9 2, χ2. Jestliže nám vyjde, že P value T 0,000 1, 2 pak může být sekvence považována za rovnoměrně rozloženou. 4.2.3 Konečné vyhodnocení výsledků Obrázek 4.2: Final Analysis Report převzato z [3] Po provedení všech testů se vytvoří soubor finalanalysisreport. Ukázka souboru je vidět na obrázku 4.2. Soubor obsahuje výsledky rovnoměrnosti hodnot P value a poměr úspěšných sekvencí. Řádky v tomto souboru reprezentují výsledky testů, jejichž název je uveden v sloupci STATISTICAL TEST. Sloupce C1 až C10 nám udávají, kolik hodnot P value leží v daném podintervalu (popsáno v sekci 4.2.2). Ve sloupci P-VALUE je spočítána výsledná P value ze sloupců C1 až C10. Ve sloupci PROPORTION je spočítán poměr úspěšných sekvencí. Aby bylo poznat, zda testovaný vzorek prošel příslušným testem, je na konci souboru spočítána hranice pro test poměru úspěšných sekvencí v závislosti na počtu podsekvencí, do kterých je testovaný vzorek rozdělen.
Kapitola 5 Návrh řešení V předchozích sekcích jsme zmínili možnosti generování náhodných čísel. Každá má nějaké výhody a nevýhody. Nyní je důležité rozhodnout se pro implementaci jednoho z uvedených způsobů. Výběr bude záviset na účelech používání generátoru a hardwaru pro implementaci. Pokud to bude možné, chtěli bychom použít modul AVR Butterfly popsaný v [2] bez dalších komponentů a vytvořit co nejlepší náhodný generátor. Modul AVR Butterfly již obsahuje například Watchdog, ADC převodník, rozhraní RS-232 a další. 5.1 Pseudonáhodné generátory versus fyzikální generátory Pseudonáhodné generátory čísel, které jsme popsali v sekci 3.1, by se daly všechny použít pro implementaci na mikrokontroléru AVR. Výhodou pseudonáhodných generátorů je, že generují velice rychle pseudonáhodná čísla. Navíc můžeme pro účely testování generovat hodnoty na počítači a až výsledný otestovaný generátor implementovat na mikrokontolér. Naproti tomu generují čísla s určitou periodou, pro start potřebují semínko a je-li znám algoritmus a jedno vygenerované číslo (pro některé generátory je třeba více čísel s různým umístěním v generované posloupnosti), lze vypočítat další čísla generované posloupnosti. My chceme generovat opravdu náhodná čísla a proto použijeme fyzikální generátor náhodných čísel. Pro implementaci generátoru náhodných čísel jsme si vybrali metodu popsanou v sekci 3.2.4. Metoda používá pro generování náhodných hodnot 2 MHz RC oscilátor čítající po dobu jedné sekundy. V publikaci [11] je popsána podobná metoda, jež využívá místo RC oscilátoru 9 MHz krystalový oscilátor. Zvolili jsme první metodu, protože RC oscilátor je méně stabilní a odchylky načítaných hodnot by měly být proto výraznější. Implementace zvolené metody nevyžaduje žádné další komponenty a může být provedena přímo na vývojovou desku AVR Butterfly. 26
Kapitola 6 Implementace a testování Jak jsme již zmínili výše, budeme pracovat s vývojovou deskou AVR Butterfly, na kterou implementujeme generátor popsaný v sekci 3.2.4. Testovat budeme pomocí sady testů STS [3] od NIST. Při testování je možné měnit parametry u některých testů. Proto můžeme testovat jednu sekvenci několikrát s různými parametry. Pro zjednodušení budeme provádět testování s výchozími parametry. U testování jednotlivých implemetací našeho generátoru zde uvádíme výsledky v tabulkách jen pro prvních několik testů. Všechny dosažené výsledky i s testovacími daty jsou na přiloženém DVD. 6.1 Předpřipravení dat Z našeho generátoru posíláme data přes rozhraní RS-232 do počítače. Nejdříve posíláme dolní byte vygenerovaného čísla a následně horní byte. Pokud si chceme zobrazená data v počítači přečíst, musíme je zobrazit v hexadecimálním formátu. Data je nutné programově zpracovat. Sada testů STS nám dovoluje testovat binární soubory i soubory, kde jsou nuly a jedničky reprezentovány jako ASCII znaky. V ASCII režimu jsou bílé znaky při testování vypouštěny, což nám dovoluje si ukládat data přehledně. My si přijatá data ukládáme v ASCII kódu vždy jednu 16bitovou hodnotu na řádek. Při testování nemáme obvykle k dispozici 16bitové hodnoty se všemi náhodnými bity. Musíme proto nejdříve extrahovat bity, u kterých předpokládáme, že jsou náhodné. Jestliže se chceme přesvědčit, že jsme využili maximum náhodných bitů, a nebo si nejsme jisti, které náhodné jsou a které ne, extrahujeme si postupně všechny bity samostatně. Po zjištění všech náhodných bitů je vyextrahujeme z 16bitové hodnoty dohromady a otestujeme jako celek. Při každém testování bychom měli vědět, kolik bitů testujeme. Při spouštění STS jsme dotázáni na velikost testované podsekvence n a počet testovaných podsekvencí m. Data by měla obsahovat minimální počet bitů l n m. 6.2 Použitelné testy Jak už jsme se zmínili výše, je při testování dat nutné zadat délku testované sekvence n a počet testovaných sekvencí m. Aby měly smysl vyhodnocovací testy poměr úspěšných 27
KAPITOLA 6. IMPLEMENTACE A TESTOVÁNÍ 28 Stistický test Požadovaná délka sekvence n Poznámka Frequency 100 BlockFrequency 100 Runs 100 LongestRun 128 Rank 38 912 NonOverlappingTemplate = 1 000 000 pravděpodobnosti OverlappingTemplate = 1 000 000 pravděpodobnosti Universal 387 840 pravděpodobnosti LinearComplexity 1 000 000 Serial - ApproximateEntropy - CumulativeSums 100 RandomExcursions 1 000 000 RandomExcursionsVariant 1 000 000 Tabulka 6.1: Požadovaná délka vstupní sekvence pro jednotlivé testy sekvencí a rovnoměrnost rozložení hodnot P value, je zapotřebí zvolit m 10. Některé testy v STS mají doporučené minimální množství bitů a některé vyžadují vstupní sekvenci přesné délky. Uvádíme zde proto tabulku 6.1, která souhrnně ukazuje potřebný počet bitů u konkrétních testů. Poznámka pravděpodobnosti v tabulce znamená, že testy mají spočítané pravděpodobnostní hodnoty náhodné sekvence o velikosti uvedené v sousedním sloupci. Jestliže nedodržíme požadovanou délku sekvence u těchto testů, nebudou výsledky správné. Díky uvedené tabulce můžeme snadno určit, které testy jsou použitelné pro konkrétní sekvenci délky l. Při zvolení nejmenšího možného m = 10 je vždy zapotřebí alespoň l 10n. 6.3 Náhodná hodnota každou sekundu První implementace našeho RNG generuje vždy jednu 16bitovou hodnotu za sekundu. Program nám ovlivňuje poslední bit, ten je vždy 1. 6.3.1 První test Před otestováním prvních dat musíme rozhodnout, která část je náhodná. Nultý bit není třeba testovat, je vždy roven 1. Nejvyšší bity jsou také zcela nenáhodné, protože se mění jen výjimečně. Náhodně vypadající bity jsou 1 8. Ty budeme testovat. Celkem jsme vygenerovali 147 000 16bitových čísel. Z každého čísla použijeme 8 bitů. K dispozici máme tedy 147 000 8 = 1 176 000 bitů. Minimálně musíme testovat 10 podsekvencí, z nichž každá může mít maximálně 117 600 bitů. Pro zjednodušení a přehlednost vždy zaokrouhlujeme počet testovaných bitů dolů na 10 000. Při prvním testu jsme otestovali 110 000 bitů x 10 podsekvencí. Protože velikost podsekvence je 110 000 bitů, můžeme provést pouze některé testy. Výsledky použitelných testů jsou v tabulce 6.2.
KAPITOLA 6. IMPLEMENTACE A TESTOVÁNÍ 29 Statistický test P value Proportion Frequency 0.035174 1 BlockFrequency 0.911413 1 CumulativeSums 0.739918 1 CumulativeSums 0.350485 1 Runs 0.739918 1 LongestRun 0.350485 0.9 Rank 0.534146 1 ApproximateEntropy 0.911413 1 Serial 0.534146 1 Serial 0.035174 1 Minimální hodnota Proportion pro každý statistycký test je přibližně = 0,895607, pro počet podsekvencí = 10. Tabulka 6.2: Výsledky prvního testu Pro provedení všech testů nemáme dostatečné množství dat. U použitelných testů jsou všechny hodnoty P value > 0,000 1 a všechny hodnoty P roportion > 0,895 607. Výsledky ukazují, že testovaná sekvence je náhodná. 6.3.2 Druhý test Při prvním testu jsme otestovali bity 1 8, u nichž jsme na základě odhadu předpokládali náhodnost. Odhad byl správný a z testů vyplývá náhodnost těchto bitů. Abychom si byli jisti, že jsme využili maximum náhodných bitů, rozhodli jsme se při druhém testu otestovat všechny bity zvlášť kromě nultého. Vygenerovali jsme 314 265 hodnot. Z 16bitových hodnot jsme postupně vyextrahovali každý bit. U jednoho bitu jsme získali sekvenci l o velikosti 314 265 bitů. Jednotlivé sekvence bitů jsme testovali v 10 podsekvencí o velikosti 30 000 bitů. Bity 1 8 prošly všemi použitelnými testy. Bit 9 neprošel testy rovnoměrnosti rozložení P value a poměru úspěšných sekvencí pro testy: BlockFrequency, Runs a LongestRun. Bit 10 neprošel žádným testem a další bity už jsme ani netestovali. Bit 9, vzhledem k výsledkům, nepovažujeme za náhodný. Testováním jednotlivých bitů se nám potvrdilo, že náhodné jsou pouze bity 1 8. Pro nově vygenerovanou sekvenci nám ještě zbylo otestovat bity 1 8 jako celek. Tentokrát jsme se je rozhodli otestovat 3krát, pokaždé pro jiný počet podsekvencí. Zajímalo nás, jestli bude mezi vyhodnocením tesů nějaký rozdíl v závislosti na počtu podsekvencí. V našem případě znamená zvýšení počtu podsekvencí snížení délky podsekvence, abychom vždy využili stejné množství otestovaných bitů. K dispozici máme 314 265 8 = 2 514 048 bitů. Celkový testovaný počet bitů bude l = 2 500 000. Testy budeme provádět pro následující rozdělení na podsekvence: 250 000 bitů x 10 podsekvencí, 50 000 bitů x 50 podsekvencí a 25 000 bitů x 100 podsekvencí. Výsledky všech použitelných testů jsou v tabulce 6.3. Jak je vidět, testovaná sekvence prošla všemi testy i při různém rozdělení do podsekvencí.
KAPITOLA 6. IMPLEMENTACE A TESTOVÁNÍ 30 250 000 x 10 50 000 x 50 25 000 x 100 Statistický test P value P rop. P value P rop. P value P rop. Frequency 0.911413 1 0.419021 1 0.366918 1 BlockFrequency 0.534146 1 0.289667 1 0.383827 0.98 CumulativeSums 0.739918 1 0.911413 1 0.964295 0.99 CumulativeSums 0.739918 1 0.911413 1 0.494392 0.99 Runs 0.739918 1 0.574903 0.98 0.595549 0.99 LongestRun 0.534146 1 0.699313 1 0.401199 1 Rank 0.739918 1 0.23681 1 0.01455 1 ApproximateEntropy 0.350485 1 0.017912 1 0 0.98 Serial 0.534146 1 0.779188 1 0.699313 0.99 Serial 0.739918 1 0.383827 1 0.595549 0.98 Min. hodnota Prop. 0.895607 0.947786 0.96015 Tabulka 6.3: Výsledky druhého testu 6.3.3 Vyhodnocení V grafu na obrázku 6.1 ukazujeme četnost 16bitových hodnot získaných přímo z našeho generátoru. Jsou to hodnoty testované v druhém testu. V grafu jsou vidět dvě Gaussova rozložení hodnot. To je způsobeno tím, že se přerušilo generování a my jsme následně spojovali dva datové soubory, abychom získali větší množství hodnot pro testování. Obrázek 6.1: Četnost neupravených 16bitových hodnot z našeho generátoru Pro porovnání původních hodnot s náhodnými hodnotami zjištěnými testováním, jsme vytvořili další graf na obrázku 6.2. Na něm je vidět četnost náhodných 8 bitových hodnot. Podle očekávání pro náhodnou sekvenci jsou jednotlivé hodnoty rozloženy rovnoměrně.
KAPITOLA 6. IMPLEMENTACE A TESTOVÁNÍ 31 Obrázek 6.2: Četnost náhodných 8bitových hodnot z našeho generátoru Z důvodu nedostatku dat nebylo možné provést všechny testy v sadě STS, ale náš generátor prošel všemi testy, které jsme na něj aplikovali. Dále jsme graficky znázornili rovnoměrné rozložení vygenerovaných náhodných hodnot. Jelikož jsme zatím neprovedli všechny testy nejsme schopni přesně určit kvalitu našeho generátoru, ale z dosažených výstupů zatím nic nenasvědčuje tomu, že je špatný. 6.4 Generování 16 hodnot za sekundu K aplikaci všech testů nám zatím brání nedostatek dat. Potřebovali bychom alespoň 10 000 000 bitů. To znamená přibližně 15 dní generování. Rozhodli jsme se kvůli tomu pro zrychlení našeho generátoru. Rychlost generátorů je také velice důležitá. Čím rychlejší generátor se nám podaří vytvořit, tím lépe. Napadla nás myšlenka, kterou vysvětlíme na příkladu. Náš generátor načítá každou sekundu 8 náhodných bitů. Otázka zní: kolik náhodných bitů by obsahovala 16bitová hodnota načítaná naším generátorem za 2 sekundy? Šestnáct bitů by to nejspíše nebylo. Dle našeho odhadu by to mohlo být možná 10 nebo 11 bitů. Proto, když naopak zkrátíme dobu s jakou generujeme náhodná čísla, měli bychom ve výsledku dostat větší množství náhodných dat. Rozhodli jsme se naši teorii vyzkoušet na 16krát rychlejším čtení hodnoty z čítače. Neočekáváme 8 náhodných bitů z každé 16bitové hodnoty jako doposud. Ale kdybychom získali alespoň 1 náhodný bit, zrychlí se náš generátor dvojnásobně. Dalším problémem je nultý bit. Nyní je vždy jedničkový. Kdyby se nám podařilo tento nedostatek odstranit, mohli bychom získat při každém čtení hodnoty o jeden náhodný bit více.
KAPITOLA 6. IMPLEMENTACE A TESTOVÁNÍ 32 Kvůli novým poznatkům jsme upravili implementaci generátoru: 1. Nultý bit se bude měnit. 2. Změna nastavení předděličky u čítače 32 khz krystalového oscilátoru, aby vyvolával přerušení 16krát za sekundu. 6.4.1 První test S naší novou implementací jsme vygenerovali nová data přesně 1 970 606 hodnot. Je třeba otestovat, jestli jsme nepřišli změnou implementace o náhodnost. Předpokládáme, že počet náhodných bitů nebude stejný jako dříve a tak musíme znovu testovat každý bit zvlášť. Tentokrát má smysl díky změnám testovat i nultý bit. Pro testování jednotlivých bitů jsme zvolili počet podsekvencí m = 100. Každá podsekvence obsahuje 19 700 bitů. Nejdříve jsme otestovali nultý bit. Ten prošel pouze testy Rank a Linear Complexity. Z toho vyplývá, že je stále ovlivněn programem a není proto náhodný. Bity 1 4 vyšly náhodné pro všechny použitelné testy. Bit 5 už nevyšel pro některé testy a vyšší bity je zbytečné testovat. Nyní otestujeme pro ověření náhodné bity jako celek. Máme k dispozici 1 970 606 4 = 7 882 424 bitů. Budeme testovat 100 podsekvencí po 78 800. Výsledky prokázali náhodnost bitů 1 4. Nepodařilo se nám získat náhodnost nultého bitu, ale teorie pro zrychlení generátoru se potvrdila. Což je pro nás výhodnější, než kdyby to bylo naopak. Dříve jsme generovali osm náhodných bitů každou vteřinu a nyní jich generujeme 64 (16 4). 6.4.2 Druhý test Úspěšně se nám podařilo zrychlit generátor a díky tomu bychom měli být schopni vygenerovat potřebných 10 000 000 bitů pro použití všech testů přibližně za 2 dny. Při generování se nám podařilo získat téměř 6 000 000 hodnot. Z prvního testu známe náhodné bity a tak je otestujeme. Dohromady máme přes 20 000 000 bitů. Celou sekvenci rozdělíme do podsekvencí po miliónech kvůli některým testům, které NIST doporučuje spouštět pro vstupní sekvenci o velikosti n = 1 000 000, a otestujeme konečně všemi testy. Naše náhodná data prošla pro téměř všechny testy. Pouze u tří ze 148 testů uvnonoverlappingtemplate sekvence nedosáhla pro test poměru úspěšných sekvencí přibližné hranice P roportion 0,923 254. Namísto toho dosáhla u těchto tří testů poměru P roportion = 0,900 0. Pro kontrolu jsme otestovali tuto sekvenci i pro větší počet podsekvencí (200 000 bitů x 100 podsekvencí). Všechny použitelné testy dopadly úspěšně. 6.4.3 Testování teplotní závislosti Náš generátor pracuje na principu nestability RC oscilátoru. RC oscilátor, kromě jiných vlivů, je nejvíce závislý na teplotě. Proto je důležité náš generátor otestovat při teplotních změnách.
KAPITOLA 6. IMPLEMENTACE A TESTOVÁNÍ 33 Vývojová deska AVR Butterfly [1] přímo umožňuje měření teploty přes ADC převodník. Použitím napěťového děliče přečteme pomocí ADC převodníku hodnotu protékající NTCtermistorem (Negative Temperature Coefficient záporný teplotní koeficient). Teplotu spočítáme následujícím způsobem: T emperature = β ADC ln 1024 ADC + β T zero, kde β = 4 250, T amb ADC = hodnota v datovém registru ADC, T zero = 273 K, T amb = 298 K. Pro tento účel jsme přeprogramovali mikrokontrolér, aby při každém přerušení odesílal s náhodnou hodnotou zároveň hodnotu z ADC převodníku. Při zpracování dat v počítači musíme rozdělit data do dvou souborů na ADC a náhodné hodnoty. Z hodnot získaných pomocí ADC převodníku spočítáme podle výše uvedené rovnice teplotu, která byla naměřena při vygenerování konkrétní hodnoty. Teplotní změny jsme u vývojové desky AVR Butterfly dosahovali pomocí foukání horkého vzduchu a následného vložení do ledničky a mrazáku. Při tom se nám podařilo vygenerovat 16 300 náhodných hodnot s informací, při jaké teplotě byly hodnoty vygenerovány. Ze získaných hodnot jsme vytvořili grafy, kde jsou zobrazeny po sobě jdoucí hodnoty. Na obrázku 6.3 je vidět graf vygenerovaných hodnot a na obrázku 6.4 je teplotní graf ve C. V grafu hodnot není vidět zpočátku reakce na zvýšení teploty. Pravděpodobně je to tím, že se RC oscilátor nepřizpůsobuje tak rychle změnám teplot jako NTC-termistor a že byl ovlivněn od předešlého neúspěšného zahřívacího pokusu. Další důvod bude nerovnoměrné zahřívání. Při foukání horkého vzduchu jsme mohli více zahřívat NTC-termistor než vlastní mikrokontrolér. Přibližně od měřené hodnoty 4 000 je v grafu generovaných hodnot vidět výrazná reakce na změnu teploty z 50 C na 0 C. Generátor se zpomalil (ne ve smyslu pomalejšího generování náhodných čísel) a čítá místo přibližně do 43 000 do 39 000. Obrázek 6.3: Hodnoty generované při měření teploty Je zřejmé, že náš generátor reaguje na změnu teploty. Důležité je zjistit, zda se tato
KAPITOLA 6. IMPLEMENTACE A TESTOVÁNÍ 34 Obrázek 6.4: Teploty ve C k jednotlivým naměřeným hodnotám skutečnost promítne na kvalitě generovaných čísel. Vygenerovali jsme poměrně málo čísel, ale po vložení generátoru do mrazáku se z důvodu své předchozí teploty orosil a přestal fungovat i přesto, že byl vložen do igelitového sáčku a zaizolován izolační páskou. Získané hodnoty jsme testovali v 10 podsekvencích po 6 500 bitech. Všechny použitelné testy prošly úspěšně. Můžeme proto říci, že teplota nemá vliv na kvalitu generovaných čísel. 6.5 Generování 128 hodnot za sekundu Už jsme zjistili, že náš generátor generuje kvalitní náhodná čísla a je teplotně nezávislý. Jedna z dalších důležitých vlastností RNG je rychlost. Budeme se proto snažit implementovat náš generátor co nejrychlejší. Použijeme metodu zrychlení vyvolávání přerušení od čítače řízeného krystalovým oscilátorem. V implementaci našeho generátoru zrušíme dělící poměr předděličky u čítače, který bude nově vyvolávat přerušení 128krát za sekundu. 6.5.1 První test Pro první ověřovací test jsme vygenerovali přibližně 2 000 000 hodnot. Opět jsme otestovaly nejdříve jednotlivé bity pro zjištění těch náhodných. Všemi použitelnými testy prošly pouze bity 1 a 2. Z vygenerovaných dat jsme vyextrahovali bity 1 a 2 a otestovali je dohromady. Měli jsme pouze 4 000 000 bitů, jež nedostačovaly na náročnější testy. Všemi ostatními testy testovaná sekvence prošla.
KAPITOLA 6. IMPLEMENTACE A TESTOVÁNÍ 35 6.5.2 Druhý test Pro druhý test jsme vygenerovali okolo 33 000 000 hodnot. Z předchozího testu známe náhodné bity. Vyextrahovali jsme rovnou dohromady bity 1 a 2 a otestovali. Použili jsme 65 podsekvencí po 1 000 000 bitů. Naše náhodná data prošla všemi testy kromě jednoho ze 148 testů NonOverlapping- Template. Vstupní sekvence v testu poměru úspěšných sekvencí nedosáhla přibližné hranice P roportion 0,952 976. Namísto toho dosáhla hodnoty 0,938 5. 6.6 Vylepšené generování 128 hodnot za sekundu Do této doby jsme generátor zlepšovali zkracováním intervalu mezi přerušeními. Ovlivňovali jsme časovač řízený krystalovým oscilátorem. Existuje i druhý způsob. RC oscilátor na vývojové desce AVR Butterfly pracuje na frekvenci 2 MHz kvůli úspoře energie. Můžeme ho ale nastavit, aby fungoval až na 8 MHz. Jestliže zrychlíme 4krát RC oscilátor, zvětší se i 4krát načítaná hodnota čítače řízeného RC oscilátorem a mohli bychom získat více náhodných bitů v každé hodnotě. 6.6.1 První test Pomocí nové úpravy v implementaci, jsme vygenerovali přes 2 000 000 hodnot. Jelikož očekáváme větší množství náhodných bitů než při předchozí implementaci, musíme testovat opět jednotlivé bity. Pro každý bit jsme rozdělili sekvenci do 10 podsekvencí po 200 000 bitech. Použitelnými testy pro danou velikost vstupní sekvence prošly bity 1 4. Spojené bity jsme již netestovali, jelikož máme z předchozích testů ověřeno, že jsou-li náhodné jednotlivé bity, pak je náhodná i sekvence vytvořená jejich spojením. Při 4násobném zrychlení RC oscilátoru jsme získaly 2x více náhodných bitů. Náš generátor nyní produkuje 512 náhodných bitů za sekundu. 6.7 Vylepšené generování 512 hodnot za sekundu V současné době získáme s každou hodnotou 4 náhodné bity. Kdyby se nám podařilo zkrátit ještě více interval mezi přerušeními, mohl by se náš generátor zrychlit. Časovač řízený krystalovým oscilátorem čítá s největší možnou rychlostí. Pro zkrácení intervalu přerušení musíme do čítače vždy po vyvolání přerušení přednastavit požadovanou hodnotu. Čítač přeteče při hodnotě 256. Rozhodli jsme se zkrátit interval 4krát a tak budeme nastavovat čítač po přerušení na hodnotu 196. 6.7.1 První test Jelikož už je náš generátor poměrně rychlý, vygenerovali jsme hned pro první test zaokrouhleně 140 000 000 hodnot. Pro určení náhodnosti jsme testovali u jednotlivých bitů 140 podsekvencí po 1 000 000. Bit 1 neprošel pouze pro jeden ze 148 testů NonOverlapping- Template. Nedosáhl u testu poměru úspěšných sekvencí přibližné hranice P roportion
KAPITOLA 6. IMPLEMENTACE A TESTOVÁNÍ 36 0,964 772. Namísto toho dosáhl hodnoty 0,957 1. Bit 2 prošel naprosto všemi testy. Další bity náhodné nejsou. Když jsme zjistili náhodnost bitů 1 a 2 otestovali jsme je dohromady pro 280 podsekvencí po 1 000 000 bitů. Naše poslední posloupnost prošla všemi testy. 6.7.2 Vyhodnocení Změnou implementace generátoru se nám ho opět podařilo zrychlit a aktuálně je schopen generovat 1024 bit/s. Náhodné bity získáváme z 16bitových hodnot. Ze začátku jsme neměli dostatek dat pro zobrazení četnosti 16bitových hodnot pro vyextrahované bity. Nyní s naším vylepšeným generátorem získáváme dostatečné množství dat a tak zobrazujeme graf četností 16bitových hodnot na obrázku 6.5. Obrázek 6.5: Četnost náhodných 16bitových hodnot z našeho generátoru