Riistvaraline juhuarvugeneraator

**Riistvaraline juhuarvugeneraator** (inglise keeles *hardware RNG*) on seade, mis genereerib juhuslikke arve, lähtudes sellistest füüsikalistest ilmingutest nagu soojusmüra, fotoelektriline efekt, kõvaketta lugemis- ja kirjutuspeade liikumine jms. Sellised protsessid on teoreetiliselt ettearvamatud ja nende abil saadud juhuarve võib lugeda tõeliselt juhuslikeks – vastupidi pseudojuhuarvudele, mis saadakse etteantavale võtmele/numbrijadale arvutuslikke algoritme rakendades. Pseudojuhuarvud on loomupäraselt ettearvatavad ning ainult näiliselt juhuslikud – nende vastu on tehtud mitmeid rünnakuid.

Et riistvaralised juhuarvugeneraatorid on tavaliselt üpris aeglased, kasutatakse nende väljundit kiires pseudojuhuarvu algoritmis, mis võimaldab juhuarvude genereerimist kiirendada.

## Kasutusalad

Juhuarvud on olulised krüptograafias, hasartmängudes ja statistikas.

Juhuarvugeneraatoreid on võimalik luua ka lähtudes makroskoopilistest protsessidest nagu täringu- või mündivise, ruletiratas ning loteriimasinad. Ettearvamatust nendes protsessides on võimalik põhjendada kaoseteooriaga ning dünaamiliste süsteemide ebastabiilsusega. Vastavate protsesside tulemused sõltuvad pisidetailidest ja nii-öelda varjatud parameetritest, mis muudavad nende protsesside lõppoleku ennustamise võimatuks. Olgugi et selliste makroskoopiliste protsesside kasutamine on enamjaolt levinud hasartmängunduses, kirjeldas Inglise teadlane Francis Galton 1890. aastal, kuidas täringuga teaduslikel eesmärkidel juhuarve genereerida.

Juhuarve kasutatakse nii sümmeetrilises kui ka asümmeetrilises krüptograafias genereerimaks võtmeid, mille salastatusel ja ettearvamatusel põhineb krüptitud andmete turvalisus ja terviklikkus.

## Tööpõhimõtted

Juhuslikkuse aluseks on peamiselt kaks fundamentaalset allikat: kvantmehaanika aatomi tasemel ja soojusmüra. Kvantmehaanika eeldab, et teatud füüsikalised protsessid, nagu aatomituuma lagunemine, on juhuslikud ja neid ei saa ennustada. Ning kuna me ei ela absoluutse nulltemperatuuri juures, on igale süsteemile omane teatud juhuslikkus. Näiteks õhumolekulid põrkuvad pidevalt üksteise vastu täiesti juhuslikult. 
Et kvantmehaaniliste sündmuste tulemusi ei saa põhimõtteliselt ennustada, on need juhuarvude genereerimise standardiks. Kvantmehaanilised sündmused, mida juhuarvugeneraatorites kasutatakse:

* Footonite – valgusosakeste – saatmine poolläbipaistvale peeglile, millelt footon kas peegeldub või läbib peeglit. Mõlemad juhud on teineteist välistavad ning vastavalt sellele, kas footon läbis/peegeldus, saadakse juhuslik biti väärtus "0" või "1".
* Geigeri loenduri tuvastatud tuumalagunemine 

Soojusmüra on kergem tuvastada. Müra muundamisel bitijadaks võimendatakse saadud signaali, filtreeritakse ja muundatakse digitaalseks.

### Kellanäitude nihe

Lisaks eespool mainitud allikaile on juhuarvugeneraatorit võimalik ehitada lähtudes kellanäitude nihkest. Kellanäitude nihe viitab ilmingule, kus kahe võrreldava kella näidud ei muutu täpselt sama kiirusega. Seega mõne aja möödudes tekib nende kellade näitude vahel nihe. Juhuarvugeneraatoris kasutatakse kahte eraldi kristallostsillaatorit, mille võnkesagedused on erinevad. Näiteks üks ostsillaator võngub sekundi jooksul sada korda ja teine miljon korda. Keskmiselt võngub kiirem ostsillaator 10 000 võnget aeglase ostsillaatori ühe võnke kohta. Aga et kristallostsillaatorid ei ole täpsed, siis tegelik võngete arv erineb. Seda variatsiooni saab kasutada juhuslike bittide genereerimiseks. Näiteks kui kiirema ostsillaatorite võngete arv aeglase ostsillaatori ühe võnke kohta on paaritu arv, siis valitakse "0", ja kui võngete arv on paaris, siis valitakse "1". Selline kristallostsillaatorite paar võib seega genereerida sada juhuslikku bitti sekundis. Kuna aga sellised süsteemid on tavaliselt ühele poole kallutatud ja genereerivad näiteks rohkem ühtesid kui nulle, siis dekorreleeritakse väljund ning sajast bitist saadakse mõned tõeliselt juhuslikud.

### Muu
Tarkvaraarendajad, kel pole "õigeid" juhuarvugeneraatoreid käepärast, proovivad juhuslikkust saavutada olemasolevate vahenditega, näiteks mõõtes klahvivajutuste ajavahesid ning siis lugedes vastavast tulemusest vähima biti. Juhuslikkust võivad aitavad tekitada ka Wi-Fi müra  ning kõvaketta lugemis- ja kirjutuspeade liikumine. Sellised meetodid on riskantsed, sest piisavalt kaval pahalane võib tulemust mõjutada.

## Dekorrelatsioon
Erinevate tööpõhimõtetega generaatorite väljastatavad bitijadad on kalduvad sisaldama rohkem, kas "1" või "0". Sellise ühele poole kallutatuse eemaldamiseks on kaks lähenemist. Üheks võimaluseks on riistvaraliselt signaali filtreerida, teiseks genereeritud bitijada vastavate algoritmidega "puhastada".

Üks selliseid algoritme on John von Neumanni loodud lihtne viis, kuidas bitijada kallutatust vähendada. Algoritm võrdleb kahte bitti korraga, rakendades ühte otsust kolmest: kui kaks järjestikust bitti on võrdsed, siis neid ei kasutata; "1" ja "0" järjestikusel esinemisel saadakse "1"; "0" ja "1" järjestikusel esinemisel saadakse "0". See vähendab kallutatust ning seda on lihtne rakendada arvuti programmina või digitaalloogikas.

## Probleemid
Töökindlaid juhuarvugeneraatoreid on keeruline konstrueerida. Üldjuhul hakkavad riistvaralised generaatorid teatud aja möödudes väljastama aina väiksema juhuslikkusega arve. Töökindluse tagamiseks on enamikul juhuarvugeneraatoritel ehitatud sisse teatud testmehhanismid või kontrollib juhuslikkust tarkvara. RFC 4086 ja FIPS 140-2 kirjeldavad vastavaid teste.

## Juhuarvugeneraatorite võrdlus

## Vaata ka
*Kvantjuhuarvugeneraator

## Viited