Jednoduchý generátor náhody

Před nedávnem vyšla zprávička o USB generátoru náhody za 50 USD. Dle popisu výrobku tento generátor obsahuje dva generátory založené na zenerově šumu (i když teda v popisu píšou kvantizační šum z ADC; zřejmě tedy jde o informační šum při šíření zprávičky internetem :-D). Pojďme si takový generátor postavit za součástky, které má každý elektrobastlíř doma a tedy v podstatě zdarma.

Zenerova dioda

Polovodičová součástka, která se používá zejména na stabilizaci napětí. Na rozdíl od běžné diody se zenerka zapojuje v závěrném směru. V propustném funguje jako klasická polovodičová dioda s napětím přechodu 0.6V, v závěrném je dané napětí určeno konstrukcí PN přechodu a může nabývat různých hodnot (např. nejlepší teplotní vlastnosti má Zd 5.6V).

640px-V-a_characteristic_Zener_diode.svg

Obrázek je ukraden z wikipedie (je na čase si vyrobit curve tracer). Na VACH to ještě tak děsivě nevypadá. Závěrný přechod Zd se realizuje pomocí vratného průrazu materiálu, přesněji řečeno pomocí lavinového efektu. Lavinový efekt je jev, kdy jeden nosič náboje (elektron nebo díra) s sebou strhává ostatní nosiče a celý jev tak velmi rychle narůstá.

V praxi není možné určit, kdy se který elektron utrhne. Záleží to na hromadě statistických (zejména teplota) a kvantově mechanických faktorů (on ten zakázaný vodivostní pás není v každém bodě materiálu stejný).

Generátor šumu

Pojďme si tedy vyrobit generátor. Nemusíme pro to ani používat zenerovu diodu, stačí nám na to dva tranzistory NPN. Když si představíme tranzistor jako dvojici diod NP – PN, můžeme jednu z diod (NP přechod) vzít a zapojit ji v závěrném směru. Každá dioda má nějaké průrazné závěrné napětí, „dioda“ v tranzistoru má toto napětí někde kolem 6V (konkrétně pro BC548 je to 5V, najdete v katalogu).

schema

  • R1 4k7
  • R2 47k
  • T1, T2 BC548
  • C 47u

Součástky jsem bral tak jak mi přišly pod ruku. Funguje to ve velké šíři parametrů. Tranzistor T2 zde hraje roli zenerky. T1 je zesilovač ve zpětné vazbě. R1 a R2 jsou více méně pro omezení proudu tranzistory a pro nastavení pracovního bodu zenerky. C je prostě vazební kondenzátor, aby se nám do linkového vstupu nedostávala stejnosměrná složka.

Jak to funguje: T1 je na počátku zavřený (bází neprotéká proud), na T2 (Zd) postupně narůstá napětí (což je dané kapacitou přechodu a parazitními kapacitami obvodu), jakmile překročí zenerovo napětí, začne protékat proud do báze T1. Tím se T1 uzavírá, napětí na kolektoru jde k zemi, tím jde k nule i napětí na E-B T2 (Zd). T2 (Zd) přestává vodit a T1 se opět otevírá. Takto je cyklus uzavřen.

Jak bylo řečeno, nelze odhadnout napětí při kterém se urve nějaký elektron ze své hladiny a vezme s sebou svoje kamarády. Takto postavený „oscilátor“ tedy osciluje ve velmi širokém spektru a generuje tak bílý šum.

Pozn:

Takto postavený obvod je velmi citlivý. Ne, že by přestal kmitat, ale charakteristika spektra se mění podle připojeného okolí. Určitě by pomohlo ještě před linkový výstup strčit nějaký buffer (opamp s velmi malým zesílením kolem 1, nebo takovým, abychom na linkovém výstupu dostali 0.7V (0dB)). Ne, nezrujnuje nás to, nějakou TL741 jistě na starých deskách doma najde každý.

Pokud to chceme napájet z USB, tak potřebujeme DC-DC konvertor (potřebujeme se dostat pár voltů nad zenerovo napětí T2, stačila by i 9V baterie). Já to měl postavené na breadboardu a napájel jsem to z 12V akumulátoru. Určitě by to šlo napájet i z ATX zdroje PC (zde si dejte opravdu velký pozor na polaritu zapojení a hlavně na oddělení DC složky, nechcete si odpálit zvukový ADC, že ne).

Měření

DS2_QuickPrint4

„Celkový pohled“ na napětí na výstupu. Jeden vertikální dílek je 100mV, rozkmit je tedy cca 500mV. HW counter naměřil frekvenci 3.2 MHz (ve skutečnosti je ještě vyšší, tento generátor je opravdu velmi širokospektrální).

DS2_QuickPrint11

Pohled na detail lavinových přechodů. 2micro sekundy na horizontální dílek, naměřená frekvence je 5.7 MHz. Na tomto snímku je krásně vidět postupné nabíjení parazitních kapacit a také několik lavinových přechodů ve velmi různé okamžiky (časově i napěťově).

Můj osciloskop bohužel nedisponuje funkcí spektrálního analyzátoru a jeho FFT stojí za starou bačkoru. Když už ale máme linkové napětí, můžeme signál přivést na linkový vstup zvukové karty a analyzovat to v PC:

audacity-spec

Krásné bílé spektrum. Kdyby vás náhodou zajímal ten peak, tak je to přesně 50Hz. To se vám stane, když budete používat dlouhý nestíněný kabel. :-)

Jak získat náhodná data

Signál máme v PC. Můžeme jej uložit jako RAW (minimálně arecord to umí) a po částech prohnat přes nějakou kryptogtaficky silnou hashovací funkci. (Vyberte si nějakou, které ještě trochu věříte – já vím, z prázdné množiny se těžko vybírá ;-)) Tím získáme rovnoměrně rozprostřená náhodná čísla.

Na linkovém vstupu je sice náhodný signál, ale nepokrývá veškeré hodnoty, nechceme také linkový vstup saturovat, je nutné si nechat nějaký odstup, alespoň 12dB, a tím právě některé bity vzorků zůstanou většinou nulové. Tím, že to proženeme hashovací fcí získáme rovnoměrně rozložená náhodná čísla.

 Balíček audio-entropyd:

Démon audio-entropyd dělá přesně to. Bere vstup ze zvukové karty a převádí jej na náhodná data, která naláduje do kernelu jako zdroj entropie pro /dev/random.

Kernel poskytuje dva zdroje náhodných čísel. Jedno zařízení /dev/urandom poskytuje pseudonáhodná čísla vyrobená v kongruentním generátoru. Tento zdroj je relativně rychlý a především nevyčerpatelný. Zásadní nevýhodou kongruentních generátorů je, že mají periodu, za kterou se bude celá sekvence opakovat. Pokud chceme jedno číslo pro program házení kostkou, tak se nic neděje. Ovšem pokud potřebujeme opravdu mnoho dat, tak tento princip selhává.

Druhým zdrojem náhody v kernelu je /dev/random. Toto je skutečně náhodný zdroj. Kernel jej krmí z různých náhodných zdrojů, jako například vstupy z klávesnice, časování paketů na síti apod. Problém je, že těchto dat je strašně málo a navíc nejsou vždy dostupná (co si vezmete na serveru bez klávesnice a myši?) Právě tento generátor se používá pro kryptografické účely a tak na málo vytíženém serveru čekáte a čekáte (třeba na vygenerování rsa klíče, kde potřebujete náhodná prvočísla).

Některé distribuce obsahují balíček audio-entropyd přímo v repositářích. Bohužel v debianu není. Moje rychlé pokusy o zkompilování ze zdrojáků selhaly na tom, že balíček buď neviděl zvukovou kartu a když jsem aplikoval patche pro pulse audio (a na chvíli se snížil k tomu, že jsem nainstloval PA u sebe na kompu), tak zase nemohl zapisovat do kernel poolu. Majitelé Fedory jsou na tom lépe, těm by měl balíček fungovat přímo z repositáře.

Příspěvek byl publikován v rubrice Elektronika, Fedora, Fyzika, Hardware, Linux. Můžete si uložit jeho odkaz mezi své oblíbené záložky.