V informatice je zvykem rozlišovat dva druhy náhodných funkcí (generátorů):
Skutečný generátor náhodných čísel (
trueRNG) vytváří výstupní sekvenci náhodných veličin, jež splňují statistické podmínky nahodilosti, avšak neumíme ji rekonstruovat, což znamená, že ani ze znalosti libovolně dlouhé sekvence ni až ni+k, kde k ≥ 0, nejsme schopni zjistit žádné jiné nj pro j < i ani pro j > i + k.
Toto chování je žádoucí zejména v kryptografických aplikacích, a moderní procesory, např. Intel řady Ivy Bridge a vyšší, mají hardwarovou podporu takového generátoru vestavěnu přímo na chipu.
Fysikální provedení RNG může být různé, tradiční řešení je vzít vzorek radioaktivního materiálu s dlouhým poločasem rozpadu a sledovat jeho radiaci, nověji se, pokud mne neplete paměť, používá měření tepelného šumu na přechodu Zenerovy nebo tunelové diody.
Proč takový generátor potřebují kryptologové, je nasnadě: útočník nemá žádnou možnost, jak reprodukovat proces vytvoření pomocí RNG vygenerovaného privátního klíče.
Naproti tomu u generátoru pseudonáhodných čísel (PRNG) vyžadujeme, aby jeho výstup splňoval pokud možno stejné statistické předpoklady jako RNG, avšak zároveň aby výstupní sekvence byla dokonale reprodukovatelná, tj. aby určitý vnitřní stav generátoru Pi (jenž není zaměnitelný s výstupem ni) určoval všechny následující stavy Pi+1, Pi+2, …
Generátory pseudonáhodných čísel se neřeší fysikálně, ale jako mathematická funkce, která ze stavu Pi vytvoří jednoznačně výstup ni a následující stav Pi+1. Jednou z nejjednodušších možností je lineární kongruentní generátor (LCG), dnes se ale spíše dává přednost jiným algorithmům s lepšími statistickými vlastnostmi výstupu (např. Mersenne twister).
Použití PRNG v kryptografii je, minimálně pro generování privátních klíčů, nebezpečné, protože není vyloučeno, že útočník z dostatečně dlouhé výstupní sekvence ni až ni+k, kde k > 0, rekonstruuje stav generátoru Pi+k a tím i všechny budoucí stavy Pi+k+1, Pi+k+2, …
Existují však aplikace, kdy nám toto risiko nevadí a kdy naopak chceme, aby byla sekvence dokonale reprodukovatelná, abychom předešli obvinění, že jsme při jejím vytváření
fixlovali.
Mezi takové případy patří i výběr podpisových archů ke kontrole registrujících se kandidátů. Algorithmus by měl být publikován předem, a aby se zabránilo možnosti účelového uspořádání souboru kandidátem, který by si sám spočítal, které z jeho archů se budou ověřovat, měl by mít jako další vstup dodatečnou informaci, která je ministerstvem neovlivnitelná a bude známa až poté, co kandidáti své archy odevzdají.
Není třeba nic komplikovaného, k zamezení takového risika stačí několik málo bitů entropie. Typickým příkladem je ciferný součet denního bursovního indexu, ale myslitelné jsou i jiné varianty, ještě méně ovlivnitelné: třeba počet v tento den narozených dětí nebo počet branek padlých v posledním fotbalovém kole (paranoici mohou místo fotbalu zvolit koše v basketbalu).
Ministerstvo vnitra udělalo to nejhorší, co udělat mohlo: sice algorithmus PRNG nezveřejnilo předem, ale žádný prvek náhody do něj nezařadilo, takže kdokoli se o něm včas dozvěděl, mohl své podpisové archy očíslovat tak, aby se do kontrolních vzorků dostaly jen ty
nejlepšíkusy, a navíc se jím při výběru patrně ani neřídilo.
Celkově to začíná působit dojmem, že Česká pošta, Lidové noviny a MF Dnes nejsou jediným, kdo dává v této kampani Janu Fischerovi
slevua kdo se naopak snaží některé další adepty
osolit.
Komentáře
T. Moláček
Ve vašem konkrétním případě: pokud platí, že po dvou nulách ve výstupu je dvakrát pravděpodobnější jednička než nula, pak algoritmus A vypadá takto: pokud dva poslední dodané bity výstupu PRNG jsou nula, tipni jedničku, jinak tipni náhodně. Takový algoritmus bude mít pravděpodobnost úspěchu uhádnutí bitu následujícího po dvou nulách ve výstupu PRNG 2/3 = 1/2 + 1/6, přičemž 1/6 rozhodně není zanedbatelná výhoda.
Pokud zkonstruujete jakýkoli statistický test, kterým budete schopen rozlišit výstup toho PRNG od doopravdy náhodného proudu bitů, není ten PRNG kryptograficky bezpečný.
Podstatu mé konstrukce jste nicméně nepochopil, útočník nic takového, co píšete, nedostane.
Nebo analogicky: zašifruju text bezpečnou proudovou šifrou. Pustím to po drátě, kde se použije nějaké kódování bitů, třeba zmíněné (_:String).flatMap(x => ""+x+x). Dostává tímto kódováním útočník nějakou výhodu?
Z principu ne. Pokud by dostal nějakou výhodu (tzn. šifra by potom nebyla bezpečná), určitě to útočník může provést i sám bez jakýchkoli dalších znalostí. To by ale znamenalo, že už původní šifra nebyla bezpečná. Což je ale spor s předpokladem.
A tím bych to ze své strany asi tak uzavřel.
Napsal jste to pěkně, ale nic neschvaluji, nepopírám a nehanobím-:)
To se všechno udělat dá, mathematické methody na to existují; jen je škoda, že v právu, jak víme, primitivní pavědy jako mathematika nejsou použitelné
RSS kanál komentářů k tomuto článku