Sunteți pe pagina 1din 7

Facultatea de Electronica Comunicatii si Calculatoare

Generatoare de numere pseudo-aleatoare


-proiect-

Turlea Petrisor Cosmin


Calculatoare 4.2.2
Numere pseudo-aleatoare
Un generator de biti aleatori este un dispozitiv sau un algoritm prin a carui
iesire rezulta o secventa de cifre binare independente din punct de vedere statistic,
secventa in care probabilitatea de emitere a valorii 1 este de exact 1/2 .
Deci, un generator de biti pseudo-aleatori este un algoritm determinist (in sensul ca
fiind dat acelasi sir de valori, generatorul va produce intotdeauna la iesire aceeasi
secventa) prin care, fiind data o secventa pur aleatoare binara de lungime k la intrare,
la iesire va genera o secventa binara de lungime l, unde l este mult mai mare decat k,
secventa care “pare” a fi aleatoare.
Definitie formala : fie intregii strict pozitivi k si l, l k+1, ( unde l este obtinut
din k prin aplicatii polinomiale). Un (k, l)-generator de numere pseudo-aleatoare (pe
scurt un (k, l)-PRBG), este o functie calculabila in timp polinomial (in functie de k).
Intrarea se numeste secventa initiala de intrare, in timp ce iesirea este numita
secventa pseudo-aleatoare.Din punct de vedere informatic, un algoritm determinist
este un algoritm a carui comportare este previzibila. Fiind date aceleasi date
particulare de intrare, algoritmul va produce la iesire acelasi rezultat
corect, iar masina pe care ruleaza acesta, va trece intotdeauna prin aceeasi secventa
de stari. Timpul polinomial este timpul de calcul al functiei, timp marginit de un
polinom de lungime l al secventei de iesire.

Clasificare:

 generatori simplii
Generatorul liniar congruential
Generatori Ranrot
Generatorul Blum – Blum – Shub
 generatori bazati pe LFSR
Generatorul Geffe
Generatori de tip “Stop-and-go”
Generatorul Stop-and-go alternativ
 alte clase
Generatorul Mother-of-all
Generatorul Blum – Micali
Generatorul1/p
Generatorul Blum – Blum – Shub
Unul dintre cele mai des utilizate generatoare de numere pseudo-aleatoare,este
acest generator.
Generatorul Blum – Blum – Shub se bazeaza pe problema resturilor
patratice, al carei enunt este urmatorul:
Fie un intreg n = pq, unde p si q sunt numere prime necunoscute si fie:

Definitie: Fie p si q doua numere prime.

Daca:

atunci numarul n = pq se numeste intreg Blum.

Algoritmul BBS prezentat ca un (k, l)-PRBG este urmatorul:


Fie p si q doua numere prime, intregi Blum de k/2 biti si fie n = pq. QR(n) reprezinta
ansamblul de resturi patratice modulo n.
Fie valoarea initiala:
unde

Generatorul Blum – Blum – Shub este considerat un generator sigur din punct
de vedere criptografic, in acest moment, fiind dealtfel considerat drept cel mai bun
generator de numere pseudo-aleatoare pentru protocoale de generare si distributie a
cheii.
Securitatea acestuia se bazeaza pe dificultate factorizarii lui n, unde n poate fi
facut public (oricine poate genera o secventa pseudo-aleatoare pe baza lui). Iar daca n
nu se descompune in factori, nimeni nu poate prezice iesirea.
Mai mult, fiind data o parte a secventei, nu exista nici o modalitate de a prezice
bitul anterior sau pe cel ulterior secventei.
Acest algoritm este folosit pentru generarea unei secvenţe de biţi
pseudoaleatoare, secvenţă folosită ca şi cheie de criptare de către algoritmul
AES(Algoritmul AES este un algoritm de criptare simetric, bloc. Aceasta înseamnă
că la criptare şi la decriptare se foloseşte aceeaşi cheie, şi că procesul de criptare se
desfăşoară pe blocuri de biţi.). Acest algoritm este destul de simplu de implementat,
dar este extrem de eficace pentru scopul acesta, de a genera o cheie de criptare
pseudoaleatoare. Anume, dacă se generează numere (secvenţe de biţi, până la urmă)
în intervalul [0..n-1], un observator nu poate prezice numărul care urmează a fi
generat cu o probabilitate mai mare de 1/n. Algoritmul funcţionează destul de simplu,
fiind prezentat în cele ce urmează. Iniţial, se generează două numere prime Blum, p şi
q. Numerele prime Blum sunt numere prime, pentru care restul împărţirii lor la 4 este
3. Pasul următor este alegerea unui număr, seed, din intervalul [1..p*q].
Se calculează

Mai departe se calculează:

Paritatea unui număr se defineşte ca fiind restul împărţirii numărului xi la 2. Secvenţa


de ieşire este z1, z2, ... zn.

Exemplu
Fie p = 383, q = 503; deci n = 192649. Alegand x0 = 1013552 (mod n) = 20749,
generatorul BBS va produce ¸sirul pseudo-aleator 11001110000100111010.

Securitatea acestui generator se bazeaza pe dificultatea factorizarii lui n. n


poate fi facut public, oricine poate genera o secventa pseudo-aleatoare pe baza lui.
Totusi, daca n nu se descompune ın factori, nimeni nu poate prezice iesirea; nici
macar o afirmatie de genul: Urmatorul bit este 1 cu probabilitate 51%. Mai mult,
fiind dat˘a o parte a secvent¸ei, nu exist˘a nici o modalitate de a prezice bitul anterior
sau cel ulterior secventei.
Implementare
#include <iostream>
#include <cmath>
using namespace std;
typedef long double ll;

class bbs{

ll p, q, M, seed, actual;

ll gcd(ll a, ll b){
if(b == 0) return a;
return gcd(b, fmod(a,b));
}

public:

bbs(ll p, ll q, ll s){
this->p = p;
this->q = q;
this->seed = s;
M = p*q;
actual = s;
}

ll getrandom(){

ll r = fmod(actual*actual,M);
actual = r;
return r;
}

ll getirandom(int i){

ll g = gcd(p, q);
ll lcm = p*q/g;

ll exp = 1;
for(int j = 1; j <= i; ++j) exp = fmod((exp+exp),lcm);

ll x0 = seed*seed;
ll r = x0;

for(int j = 2; j <= exp; ++j) r = fmod((r*x0),M);

return r;
}
}

int main(){

ll p = 11;
ll q = 19;
ll s = 3;

bbs b(p, q, s);


int n = 1000;
cout << n << endl;
for(int i = 0; i < n; ++i) {
cout << b.getrandom()/M << endl;
}
}
Bibliografie:

www.wikipedia.com

Asist. Drd. Morogan Maria Luciana- GENERATORI DE NUMERE PSEUDO-


ALEATOARE

S-ar putea să vă placă și