True Random Number Generator

Numerele aleatoare sunt foarte folositoare in criptografie, etc. In general implementarile din software sunt pseudorandom, si nu sunt foarte sigure.

Idea de pornire

Sunt mai multe tipuri de circuite care pot genera biti aleatori:

1. Amplificare zgomot : se bazeaza pe o sursa de zgomot: electromagnetica, sonica, termica si amplifica acel zgomot pentru a putea da un numar aleator (1 daca zgomotul este peste un prag, 0 altfel)

2. Multivibratoare astabile: se bazeaza pe faptul ca un circuit de ceas nu va avea acelasi ritm tot timpul

3. Dual sampling pe oscilatoare: au mai multe ceasuri si se bazeaza pe faptul ca ele nu sunt perfect sincronizate pentru a putea obtine un numar random

4. Hibrid: se bazeaza pe mai multe surse de randomness, si le combina intre ele intr-un mod anume pentru a genera un numar aleator cu un bias mai mic

Circuite

Circuit dual sampling - am pus 2 oscilatoare Pierce la 12MHz si 8MHz Am facut rezistentele reglabile, pentru a putea forta oscilatoarele sa functioneze la parametrii cat mai potrivnici, in speranta ca asta va mari clock skew-ul.

Circuit amplificare zgomot - am luat zgomotul de pe un tranzistor si l-am amplificat Am facut rezistentele reglabile, pentru a putea mari sensibilitatea la zgomot a circuitului

Date experimentale

Am pornit de la ideea ca regland rezistentele voi putea obtine o distributie cat mai aproape de 50% a numarului de 0 si 1 obtinuti intr-o perioda de timp, evitand astfel algoritmii de de-biasing, care duc la micsorarea numarului de numere random generate. Din pacate circuitul de amplificare zgomot are un bias pentru 0, astfel, indiferent de reglaje, are sansa de aproximativ 44% sa dea 1, si 56% sa dea 0, si ne-legat de rata de sampling - acesta din urma este un lucru bun, deoarece pot sa fac aplic o rata de sampling mare, si sa aplic un algoritm de de-biasing.

Celalt circuit pare sa aiba un bias asemator spre 0, dar mai redus (53%-47%). Reglarea rezistentelor are un efect foarte mic.

Am pus si un fir in aer, neconectat la nici un circuit: acesta din urma pare sa aiba un bias de aproape 1% spre 1, ceea ce inseamna ca poate fi folosit si fara a aplica debiasing, sperand ca dupa ce se aplica debiasing pe celelalte 2 fire, sa se atenueze si acest bias (mic), astfel incat sansa sa obtin 0 si 1 sa fie cat mai aproape de 50%.

Schimband functiile de obtinere a bitilor si rata de sampling am ajuns la o un rezultat de +/- 0.3% in favourea lui 1, ceea ce este foarte bine. De asemenea, faptul ca fluctueaza indica faptul ca este mult mai aproape de 50%, o moneda ideala. Nu am reusit sa strang destule date pentru o analiza concludenta a bit streamului insa, dar rata de generare a bitilor este destul de buna.

Arhiva completa cu date experimentale: data_epp.zip, ultimele (26 si 27) sunt datele obtinute pe algoritmul actual. Nu am documentat toate schimbarile prin care am trecut.

Programul

Programul in sine a fost usor de facut. Am pornit de la laboratul 3, am scos partea de ADC (primesc doar date in binar), si am facut partea de transmisie seriala + un timer pentru sampling. Partea care a necesitat mult trial-and-error a fost partea in care am incercat sa scot biasul celor 3 streamuri de biti: Am incercat algoritmul John von Neumann, care presupune determinarea schimbarilor din 1 in 0 si din 0 in 1, si scrierea primului bit (1 respectiv 0) dar din cauza diferentei de viteza a schimbarilor streamurilor, a ramas un bias. Am incercat apoi timpului dintre 0 si 1, dar cele 3 streamuri variaza foarte mult, asa ca 1 reiesea foarte des ca interval, chiar si la sample rate-uri mari. In cele din urma am ajuns la un John von Neumann modificat: Cand un stream isi schimba starea ma uit la valoarea altui stream, si o aleg pe aceasta. Dupa cum ziceam mai sus, asta duce la de-biasing de un singur bit si respectiv 2 biti (numarul de tranzitii 0 1 si 1 0 va fi intotdeauna egal, ceea ce duce si la numarul de tranzitii 1 1 si 0 0 egal, datorita faptului ca numarul de biti este egal), dar nu am destule date experimentale pentru a determina daca nu exista un bias la nivel mai mare (3,4,… biti), dar faptul ca folosesc 3 streamuri aparent independente ar trebui sa reduca acest bias la un minim.

Sursa: src_epp.zip

Concluzii

Bias-ul este destul de greu de testat si de eliminat, dacă se dorește și pastrarea unei rate mari de generare de numere aleatore.

Se poate reduce bias-ul folosind mai multe streamuri de biti.

Zgomotul electromagnetic de pe un fir lung este mai bun generator de numere random decat cele 2 circuite ale mele. (Obs: nu am pus un fir legat de piciorul in aer a tranzistorului de frica sa nu se arda ceva - oricum stabilizatorul are tendinta sa se incalzeasca destul de tare, si i-am pus un radiator in speranta ca se mai duce din temperatura - deoarece nu am nici un fel de cutoff, in nici un punct).

Utilizare

Este nevoie de o sursa de tensiune de 12V.

Datele se colecteza pe interfata seriala(9600 baud, 1 stop bit).

Datele afisate sunt biti.

Cablaj

Bibliografie

David Wilde - True Random Number Generators based on a Sigma-Delta Modulator

Hardware RNG

Hardware_random_number_generator

Randomness_extractor

pm/prj2012/avoinescu/14.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0