Random Number Generator, zkráceně RNG, je zařízení nebo program, který vytváří číselné hodnoty. V peněžence potřebujeme kryptograficky bezpečný generátor: znalost předchozích výsledků ani času vytvoření nesmí útočníkovi umožnit prakticky předpovědět nové tajemství. Záleží přitom na zdroji entropie, použitém algoritmu i jeho správném zapojení do aplikace. Entropie tu označuje nejistotu, která o výsledku zůstává útočníkovi.
Představte si, že by peněženka odvodila tajemství jen z aktuálního času. Výsledek může vypadat složitě, ale útočník, který ví, kdy jste ji založili, by měl výrazně méně možností k vyzkoušení. RFC 4086 právě před takovými předvídatelnými vstupy varuje. Generátor vhodný pro hru nebo simulaci proto nemusí být vhodný pro klíče. Ani pěkné statistické rozložení výsledků samo o sobě bezpečnost nedokazuje. [2]
Obvykle spolupracuje několik částí. Zdroj poskytne nejistotu, jeho výstup se podle potřeby upraví a kryptografický deterministický generátor z utajeného vnitřního stavu vytvoří další hodnoty. Deterministický znamená, že ze stejného vnitřního stavu a stejných vstupů vznikne stejný výsledek; právě proto musí tento stav zůstat tajný. Aplikace o ně požádá přes rozhraní systému. Nemusí tedy probíhat nové fyzické měření pro každý vrácený bit. NIST SP 800-90C popisuje propojení generátorů podle části 90A se zdroji podle 90B. [1]
Základ pro pozdější obnovu peněženky podle BIP39 vzniká ještě před prvním slovem: generátor vytvoří 128 až 256 bitů počáteční entropie. Bit je základní jednotka zápisu informace, nula nebo jednička; podstatné je, aby vzniklou posloupnost útočník nedokázal odhadnout. Přidá se kontrolní součet, krátký údaj pro odhalení části chyb při zápisu, a celek se převede na obnovovací slova. Ta lze doplnit vlastní passphrase, dalším tajným textem. Funkce PBKDF2 z těchto vstupů odvodí 512bitový seed, výchozí tajnou hodnotu pro odvozování klíčů peněženky. Delší výstup ani kontrolní součet nedoplní chybějící náhodnost. Proto si obnovovací slova sami nevybírejte. [6]
Zařízení musí umět rozpoznat například to, že zdroj šumu začal opakovat stejnou hodnotu. NIST SP 800-90B proto požaduje kontroly zdroje při startu i během provozu a řešení zjištěných závad. Chybu nelze jen ignorovat a dál vydávat výstup za ověřenou náhodnost. Tyto kontroly sledují zdroj; nezaručují bezpečnost celé peněženky. [3]
Deterministický generátor si uchovává vnitřní stav, ze kterého počítá další výsledky. NIST SP 800-90A popisuje jeho vytvoření, generování, doplnění čerstvé entropie (reseed) a ukončení. Pokud stav unikne, samotné další volání generátoru nemusí bezpečnost obnovit. K obnově je potřeba vhodný postup a nová entropie, kterou útočník nezná. Dříve prozrazené klíče tím nezmizí z jeho rukou. [7]
Uživatel nemusí sám programovat RNG. Smysl má sledovat, zda konkrétní verze peněženky má doložený způsob generování a zacházení s chybami. Nápis „hardware“ nebo „offline“ to sám nepotvrzuje. Kontrola musí zahrnout zdroj, algoritmus, inicializaci i rozhraní aplikace. A i správně vytvořené tajemství později ztratí ochranu, pokud někomu prozradíte jeho zálohu. [1] [2]
Linuxové getrandom() ve výchozím režimu čeká na inicializaci zdroje urandom; s GRND_NONBLOCK může místo čekání vrátit EAGAIN. Po inicializaci má požadavek nejvýše 256 bajtů z urandom záruku úplného čtení bez přerušení signálem. U většího požadavku tato záruka neplatí. Program proto musí správně vyhodnotit návratový stav a počet skutečně získaných bajtů. [4]
Web Crypto nabízí getRandomValues() pro naplnění podporovaného celočíselného pole kryptograficky silnými hodnotami. Nad 65536 bajtů vyvolá QuotaExceededError. Pro klíče podporovaných algoritmů specifikace doporučuje generateKey(); nejde o univerzální generátor bitcoinových peněženek. Ani správné použití rozhraní neověřuje důvěryhodnost stránky: její kód může mít k vytvořenému tajemství přístup. [5]
Pro nejúplnější obraz čtěte toto heslo společně s Cryptographic Entropy, CSPRNG, Seed Generation, Brute Force Search Space. Opačným směrem na něj odkazují také CSPRNG, Deterministic RNG, True Random Number Generator, Seed Generation.