Generatorul de numere pseudoaleatoare ( PRNG , engleză pseudorandom number generator , PRNG ) este un algoritm care generează o secvență de numere ale căror elemente sunt aproape independente unele de altele și se supun unei distribuții date (de obicei, uniformă discretă ).
Informatica modernă folosește pe scară largă numerele pseudoaleatoare într-o varietate de aplicații, de la Monte Carlo și simulare la criptografie . În același timp, calitatea rezultatelor obținute depinde direct de calitatea PRNG-urilor utilizate. Această împrejurare este subliniată de cunoscutul aforism al matematicianului ORNL Robert Caviu.: „ Generarea numerelor aleatorii este prea importantă pentru a fi lăsată la voia întâmplării ”.
Sursele numerelor aleatoare reale sunt extrem de greu de găsit. Zgomotele fizice [1] , cum ar fi detectoarele de evenimente cu radiații ionizante , zgomotul împușcat într-un rezistor sau radiația cosmică [2] pot fi astfel de surse. Cu toate acestea, astfel de dispozitive sunt rareori utilizate în aplicațiile de securitate a rețelei. Atacurile brutale asupra unor astfel de dispozitive provoacă, de asemenea, dificultăți.
Sursele fizice ale numerelor aleatoare au o serie de dezavantaje:
În același timp, numerele aleatoare obținute dintr-o sursă fizică pot fi folosite ca element generator (sămânță engleză) pentru PRNG-uri software. Astfel de generatoare combinate sunt folosite în criptografie, loterie, aparate de slot. [3]
John von Neumann a considerat inacceptabil să se utilizeze generatoare fizice de numere aleatorii în tehnologia computerelor, deoarece dacă ar fi necesară verificarea calculelor, repetarea acțiunilor anterioare ar necesita reproducerea unui număr aleator, în timp ce generarea unui nou număr aleator este inacceptabilă. Înregistrarea și stocarea preliminară a numerelor aleatoare generate ar implica posibilitatea citirii acestora. Mecanismul de citire a datelor a fost una dintre cele mai slabe verigi din computerele anilor 1940. John von Neumann a dat următoarea metodă a pătratului mijlociu [4] pentru obținerea numerelor pseudoaleatoare din zece cifre:
Un număr din zece cifre este pătrat, apoi un număr din zece cifre este luat din mijlocul pătratului numărului, care este din nou pătrat și așa mai departe.De exemplu, pentru numerele din 4 cifre, începând de la 1234, obținem , unde luăm cele 4 cifre din mijloc (adăugând un zero la început, dacă este necesar). Apoi pătratăm numărul rezultat și așa mai departe. Dezavantajul acestei metode este setul limitat de PSCH datorită faptului că secvența bucle - .
În 1951, D. G. Lemer a propus o metodă liniară congruentă , [5] a cărei esență este de a specifica o succesiune de numere întregi printr-o formulă recursivă în care sunt numere întregi și îndeplinesc următoarele condiții: . Dezavantajul acestei metode este dependența de , deoarece , precum și faptul că buclele PFC.
Majoritatea PRNG - urilor deterministe corespund structurii propuse de P. Lecuer 1994:în]1 [ . De obicei , iar starea generatorului este dată de formula recursivă pentru . Valoarea ieșirii generatorului ; este o succesiune de numere pseudoaleatoare. Deoarece este finit, trebuie să existe unele finite și astfel încât . Aceasta înseamnă că condițiile și vor fi îndeplinite pentru toate , deoarece funcțiile și sunt deterministe. Astfel, se dovedește că succesiunea este periodică. Perioada PRNG se numește minim pozitiv . [3]
Cele mai frecvente sunt metoda liniar congruentiala , metoda Fibonacci cu intarzieri , registrul de deplasare cu feedback liniar , registrul de deplasare cu feedback generalizat .
Dintre PRNG-urile moderne, „ vortexul Mersenne ” propus în 1997 de Matsumoto și Nishimura a devenit, de asemenea, răspândit . Avantajele sale sunt o perioadă colosală (2 19937 −1), o distribuție uniformă în 623 de dimensiuni (metoda congruențială liniară oferă o distribuție mai mult sau mai puțin uniformă în maximum 5 dimensiuni), generarea rapidă a numerelor aleatoare (de 2-3 ori mai rapidă decât PRNG-uri standard folosind metoda liniară congruentă). Cu toate acestea, există algoritmi care recunosc secvența generată de vortexul Mersenne ca nealeatorie.
Un generator de numere pseudo-aleatoare este inclus în multe procesoare moderne , de exemplu, RdRand este inclus în setul de instrucțiuni IA-32. [6]
O variație a PRNG este GPSB (PRBG) - generatoare de biți pseudo-aleatorii, precum și diverse coduri de flux .
Mai jos este o listă de generatoare care s-au remarcat istoric în domeniul generării numerelor pseudoaleatoare, fie datorită semnificației lor istorice, fie pentru că au fost un model inovator pentru epocile lor. Mai mult, în ciuda faptului că acesta este un PRNG, unele dintre ele pot fi aplicabile în domeniul criptografiei.
Algoritm | Autorii | Legături | Descriere | |
---|---|---|---|---|
mijlocul pătratului | John von Neummann | 1946 | [7] | PRNG, care este considerat de calitate scăzută, dar de mare importanță istorică ca fiind unul dintre primii algoritmi. |
Generatorul Lehmer / Metoda congruențială liniară | D. H. Lehmer | 1951 | [opt] | Este cunoscută și ca metoda congruențelor liniare multiplicative și a fost foarte influentă în acest domeniu de cercetare. Este cunoscută și sub denumirea de Metoda Liniară Congruențială, a cărei bază s-a îmbunătățit în timp. |
Generatorul Lag Fibonacci | GJ Mitchell; D. P. Moore | 1958 | [9] | Un algoritm foarte influent în studiul proceselor de generare a numerelor aleatoare, inspirând alți mari autori de mai târziu precum G. Marsaglia, creatorul unui test de calitate a numerelor aleatoare numit „Diehard”, de exemplu. |
Registrul de deplasare linear cu feedback (LFSR) / Oscilator Tausworthe | R. C. Tausworth | 1965 | [zece] | Un generator al cărui design a influențat multe alte PRNG-uri ulterioare. Prin urmare, este foarte important din punct de vedere istoric. Cunoscut și ca generatorul Tausworthe. |
Wichmann & Hill Generator | B.A. Wichmann; D.I. Hill | 1982 | [unsprezece] | O combinație de trei LCG-uri mici potrivite pentru procesoare pe 16 biți. Utilizat pe scară largă în multe programe, de exemplu, a fost folosit în Excel 2003 și în unele versiuni ulterioare pentru funcția RAND în Excel și a fost generatorul implicit în Python până la versiunea 2.2. |
Regula 30 | Wolfram, Stephen | 1983 | [12] | Generator bazat pe automate celulare. |
Generator Blum-Blum-Shub | Bloom, Manuel ; L. Blum; M. Shub | 1986 | [13] | Este considerat unul dintre cei mai siguri generatori din punct de vedere criptografic, în principal datorită încorporării cercetărilor și conceptelor preluate din teoria numerelor în formula sa. Pentru acest algoritm Blum , Manuel a primit premiul Alan Turing din 1995. |
generator park-miller | Parcul SK; KW Miller | 1988 | [paisprezece] | O implementare concretă a generatorului Lehmer, utilizat pe scară largă deoarece este inclus în C++ ca funcție minstd_rand0 începând cu C++11. |
GHINDĂ | RS Wikramaratna | 1989 | [cincisprezece] | Numele său provine de la acronimul englezesc ACORN, care înseamnă „Additive Congruent Random Number″. |
MIXMAX | GK Savvidy; NG Ter-Arutyunyan-Savvidy | 1991 | [16] | Acesta este un generator aparținând clasei de generatoare liniare congruente matriceale, o generalizare a metodei congruențelor liniare. Logica familiei de generatoare MIXMAX se bazează pe rezultatele teoriei ergodice și ale mecanicii clasice. |
Adăugați cu transport | G. Marsaglia | 1991 | [17] | Modificarea generatoarelor Fibonacci cu întârziere. |
Scădere-cu-împrumut | G. Marsaglia; A. Zaman | 1991 | [17] | Algoritm derivat din generatoarele Fibonacci cu întârziere. |
ISAAC | RJ Jenkins Jr. | 1993 | [optsprezece] | Cryptographically Secure Cryptographic Data Generator (CSPRNG) dezvoltat de Robert J. Jenkins. |
Mersenne Twister, MT | M. Matsumoto; T. Nishimura | 1996 | [19] | Acesta este probabil cel mai cunoscut generator de pe această listă, în principal pentru că este un algoritm implementat în funcția RAND a limbajelor de programare Python și R, pe lângă prezența sa puternică în jocurile electronice precum Pro Evolution Soccer (PES). |
Xorshift | G. Marsaglia | 2003 | [douăzeci] | Acesta este un subtip foarte rapid de generatoare LFSR. Marsaglia a propus, de asemenea, un generator xorwow ca o îmbunătățire, în care producția generatorului xorshift este însumată cu o secvență Weyl. Generatorul xorwow este generatorul implicit din biblioteca nVidia CUDA API CURAND pentru GPU. |
Algoritmul Fortuna | Schneier, Bruce ; Niels Ferguson | 2003 | [21] | Algoritmul este considerat sigur din punct de vedere criptografic. CSPRNG, binecunoscut pentru că este încorporat în sistemele și produsele Apple. |
Linear pe perioadă lungă bine echidistribuit (WELL) | F. Panneton; P. L'Ecuyer; M. Matsumoto | 2006 | [22] | Un algoritm cunoscut ca un supliment pentru Mersenne Twister (MT), care caută în mod deliberat să-și ascundă punctele slabe. |
Sistem avansat de randomizare (ARS) | J. Somon; M. Moraes; R. Dror; D. Shaw | 2011 | [23] | O versiune simplificată a cifrului bloc AES care oferă performanțe foarte înalte pe un sistem care acceptă AES-NI. |
Threefry | J. Salmon, M. Moraes, R. Dror și D. Shaw | 2011 | [23] | O versiune simplificată a cifrului în bloc Threefish, potrivită pentru implementarea GPU. |
Filox (Philox) | J. Salmon, M. Moraes, R. Dror și D. Shaw | 2011 | [23] | Simplificarea și modificarea cifrului bloc Threefish cu adăugarea S-box. |
Generator congruențial permutat (PCG) | M.E. O'Neill | 2014 | [24] | Model obţinut prin metoda congruenţială liniară. |
Generator de biți cu ciclu aleatoriu (RCB) | R. Cookman | 2016 | [25] | RCB este descris ca un generator de modele de biți conceput pentru a depăși unele dintre deficiențele Mersenne Twist (MT) și limitarea scurtă a perioadei/lungimii de biți a generatoarelor de schimbare/modul. |
Secvența Weyl Pătrat Mijloc RNG | B. Widynski | 2017 | [26] | O variație a metodei originale a pătratelor medii a lui John von Neumann. |
Xoroshiro128+ | D. Blackman; S. Vigna | 2018 | [27] | Modificarea generatorului Xorshift al lui G. Marsaglia, unul dintre cele mai rapide generatoare de pe procesoarele moderne pe 64 de biți. Generatoarele înrudite sunt xoroshiro128**, xoshiro256+ și xoshiro256***. |
MELG pe 64 de biți (MELG-64) | S. Harase; T. Kimoto | 2018 | [28] | Implementarea generatoarelor F2 liniare pe 64 de biți cu perioada Mersenne primară. |
Pătrate RNG | B. Widynski | 2020 | [29] | O versiune bazată pe contor a Middle Square Weyl Sequence RNG. Similar ca design cu Philox, dar mult mai rapid. |
Itamaraca (Ita) | D.H. Pereira | 2021 | [treizeci] | Cunoscut ca primul algoritm PRNG bazat pe funcția de valoare absolută. Itamaracá este, de asemenea, un model simplu și rapid care generează secvențe aperiodice de numere aleatoare. |
O soluție alternativă este de a crea un set de un număr mare de numere aleatoare și de a-l publica într-un fel de dicționar , numit „ pad unic ”. Cu toate acestea, chiar și astfel de seturi oferă o sursă foarte limitată de numere în comparație cu numărul cerut de aplicațiile de securitate a rețelei. Deși aceste seturi oferă caracter aleatoriu statistic, ele nu sunt suficient de sigure, deoarece un atacator ar putea obține o copie a dicționarului.
Niciun algoritm determinist nu poate genera numere complet aleatoare, ci doar aproximează unele dintre proprietățile acestora. După cum spunea John von Neumann , „ Oricine are o slăbiciune în ceea ce privește metodele aritmetice de obținere a numerelor aleatorii este fără îndoială un păcătos ”.
Orice PRNG cu resurse limitate se blochează mai devreme sau mai târziu - începe să repete aceeași secvență de numere. Lungimea ciclurilor PRNG depinde de generatorul în sine și este de aproximativ , unde este dimensiunea stării interne în biți, deși generatoarele liniare congruente și LFSR au cicluri de ordin maxim [31] . Dacă secvența PRNG generată converge către cicluri prea scurte, atunci un astfel de PRNG devine previzibil și nepotrivit pentru aplicații practice.
Majoritatea generatoarelor aritmetice simple, deși rapide, suferă de multe neajunsuri grave:
În special, algoritmul RANDU , care a fost folosit pe calculatoarele mainframe de zeci de ani , s-a dovedit a fi foarte slab [32] [33] , ridicând îndoieli cu privire la fiabilitatea rezultatelor multor studii care utilizează acest algoritm.
Pe lângă nevoia de a genera secvențe de numere aleatoare ușor reproductibile, există și nevoia de a genera numere complet imprevizibile sau pur și simplu complet aleatorii. Astfel de generatoare sunt numite generatoare de numere aleatoare (RNG - engleză generator de numere aleatoare, RNG ). Deoarece astfel de generatoare sunt cel mai adesea folosite pentru a genera chei unice simetrice și asimetrice pentru criptare, ele sunt cel mai adesea construite dintr-o combinație de PRNG criptografic puternic și o sursă externă de entropie (și această combinație este acum înțeleasă în mod obișnuit ca RNG).
Aproape toți marii producători de microcipuri furnizează RNG-uri hardware cu diverse surse de entropie, folosind diverse metode pentru a le elimina de predictibilitatea inevitabil. Cu toate acestea, în acest moment, viteza de colectare a numerelor aleatoare de către toate microcipurile existente (câteva mii de biți pe secundă) nu se potrivește cu viteza procesoarelor moderne.
În cercetarea modernă, se încearcă utilizarea măsurării proprietăților fizice ale obiectelor (de exemplu, temperatura ) sau chiar fluctuațiilor cuantice ale vidului ca sursă de entropie pentru RNG. [34]
În calculatoarele personale, autorii de software RNG folosesc surse mult mai rapide de entropie, cum ar fi zgomotul plăcii de sunet sau contorul de ceas al procesorului . Colectarea entropiei a fost punctul cel mai vulnerabil al RNG. Această problemă nu este încă pe deplin rezolvată în multe dispozitive (cum ar fi cardurile inteligente ) care rămân vulnerabile în acest fel. [35] Multe RNG-uri folosesc metode tradiționale încercate și testate, deși lente, de colectare a entropiei, cum ar fi măsurarea răspunsului utilizatorului ( mișcarea mouse-ului etc.), ca în PGP și Yarrow [36] , sau interacțiuni între fire , cum ar fi , în Java SecureRandom.
Dacă timpul curent este folosit ca sursă de entropie, atunci pentru a obține un număr întreg de la 0 la N , este suficient să calculați restul împărțirii timpului curent în milisecunde la numărul N +1. Dezavantajul acestui RNG este că produce același număr pentru o milisecundă.
Sursa de Entropie | PRNG | Avantaje | Defecte | |
---|---|---|---|---|
/dev/random pe UNIX / Linux | Contor de ceas al procesorului, totuși colectat numai în timpul întreruperilor hardware | LFSR , cu hashing de ieșire prin SHA-1 | Disponibil pe toate Unix-urile, o sursă sigură de entropie | Se „încălzește” pentru o perioadă foarte lungă de timp, se poate „bloca” pentru o lungă perioadă de timp sau funcționează ca un PRNG ( / dev / urandom ) |
Yarrow de Bruce Schneier [36] | Metode tradiționale | AES -256 și SHA-1 stare internă mică | Design flexibil criptorezistent | Încet |
Microsoft CryptoAPI | Ora curentă, dimensiunea hard diskului, memoria liberă, numărul procesului și numele NETBIOS al computerului | Hash MD5 al stării interne, 128 de biți | Încorporat în Windows, nu se blochează | Depinde foarte mult de furnizorul criptografic (CSP) utilizat. |
Java SecureRandom | Comunicarea între fire | SHA-1 - hash de stare internă (1024 de biți) | Stare internă grozavă | Colectare lentă a entropiei |
RdRand de către intel [37] | Curenți de zgomot | Construcția PFS bazată pe citirea de biți „aleatorie” a valorilor din curenți [37] | Foarte repede, nu se blochează | Dezvoltarea inițială, proprietățile se dau numai cu acordul dezvoltatorilor. |
Unul dintre criteriile că PRNG este puternic criptografic este incapacitatea de a distinge valorile de ieșire ale PRNG de o secvență aleatorie independentă distribuită uniform pe interval. Să existe o familie de PRNG , unde cardinalitatea mulțimii este egală cu . După cum s-a menționat mai sus, este un set finit de stări, este o distribuție de probabilitate în spațiul de stări folosită pentru a selecta starea inițială (seed engleză), este o funcție de tranziție, este spațiul valorilor de ieșire, . De obicei , iar starea generatorului este dată de formula recursivă pentru . Valoarea ieșirii generatorului ; este o succesiune de numere pseudoaleatoare. Să presupunem că funcțiile de tranziție și de ieșire pot fi calculate în timp polinomial, puteri ale . Să fie o clasă de teste statistice care încearcă în timp polinomial să distingă valorile de ieșire ale PRNG de o secvență aleatorie independentă distribuită uniform pe interval . O familie de PRNG-uri este numită bună din punct de vedere al timpului polinomial dacă există una astfel încât niciunul dintre teste nu poate distinge valorile de ieșire ale PRNG de o secvență aleatorie independentă distribuită uniform pe intervalul cu probabilitate . [3]
Aplicațiile criptografice folosesc algoritmi determiniști pentru a genera numere aleatorii, generând astfel o secvență de numere care teoretic nu poate fi aleatoare din punct de vedere statistic. În același timp, dacă alegeți un algoritm bun, succesiunea numerică rezultată - numere pseudoaleatoare - va trece majoritatea testelor de aleatorie. Una dintre caracteristicile unei astfel de secvențe este o perioadă lungă de repetiție. [3]
Exemple de PRNG-uri criptografic puternice sunt RC4 [31] , ISAAC [38] , SEAL [39] , SNOW [40] , un algoritm teoretic foarte lent Blum-Blum-Shub [31] , precum și contoarele cu hash criptografic. funcții sau cifruri bloc sigure criptografic în locul funcției de ieșire [31] .
De asemenea, cifrurile puternice din punct de vedere criptografic includ generatoare cu mai multe registre cu deplasare , generatoare cu transformări neliniare și generatoare de criptare majoritară A5/x . [31]
Generatorul de numere aleatorii este criptat folosind diverse chei secrete obținute la fiecare etapă. Un contor cu o perioadă lungă este utilizat ca intrare la dispozitivul de criptare. Când utilizați o cheie DES pe 56 de biți , poate fi utilizat un numărător cu punct .
Secvența pseudo-aleatorie obținută prin această schemă are o perioadă completă: fiecare valoare de ieșire , , ... se bazează pe o valoare de contor diferită, deci . Deoarece cheia este secretă, orice cheie secretă nu depinde de cunoștințele uneia sau mai multor chei secrete anterioare. Pentru a crește puterea criptografică a algoritmului, este necesar la fiecare pas să criptați un număr aleatoriu cu un RNG - . [41]
PRNG din standardul ANSI X9.17 este utilizat în multe aplicații de securitate financiară și PGP . În centrul acestui PRNG se află triplul DES . Generatorul ANSI X9.17 este format din următoarele părți:
Valorile aleatoare de intrare sunt și . este valoarea de ieșire. Calculul fără cunoștințe nu este posibil într-un timp rezonabil și, prin urmare, următoarea valoare pseudo-aleatorie , deoarece sunt efectuate trei operațiuni suplimentare de criptare pentru a obține. [42]
În afară de generatoarele LFSR învechite, binecunoscute, care au fost utilizate pe scară largă ca PRNG-uri hardware în secolul al XX-lea, se cunosc foarte puține despre PRNG-urile hardware moderne, deoarece majoritatea dintre ele sunt dezvoltate în scopuri militare sau sunt brevetate și păstrate secret . Generatoarele RLOS bazate pe hardware Toyocrypt și LILI-128 au fost piratate folosind atacuri algebrice [43] [44] .
În prezent, se știe despre utilizarea PRNG-urilor hardware implementate pe baza zgomotului de putere redusă în circuitele electrice. [45]
Generatorul de numere aleatorii pentru loterie este un complex hardware-software folosit la loterie în care este necesar să se ghicească o combinație a unui anumit număr de numere. Oricare dintre numerele posibile are aceeași probabilitate de a apărea.
Încercările de a crea un generator de numere aleatorii datează din 3500 î.Hr. e. și sunt asociate cu jocul de masă egiptean antic Senet . În Senet, doi jucători joacă pe două părți. Mișcările sunt determinate folosind 4 bețe plate, care pot fi considerate un generator de numere aleatorii din acel moment. Aruncă toate cele patru bețe deodată. Se punctează după cum urmează: 1 băț a căzut cu partea albă în sus - 1 punct și o aruncare suplimentară; 2 - 2 puncte; 3 - 3 puncte, 4 - 4 și o rolă în plus. Una dintre laturile bastonului este neagră și dacă toate cele patru bețe cad cu partea neagră în sus, acesta este rezultatul maxim - 5 puncte și o aruncare suplimentară.
Cunoscutul generator de numere aleatorii ERNIE a fost folosit de mulți ani pentru a determina numerele câștigătoare ale loteriei britanice.
Principalele cerințe pentru software-ul și echipamentele utilizate pentru desfășurarea lotteriilor în Federația Rusă sunt stabilite prin Legea federală nr. 138-FZ din 11 noiembrie 2003 „Cu privire la loterie”:
La loteriile de stat rusești (Gosloto 5 din 36, Gosloto 6 din 36, Gosloto 6 din 45, Gosloto 7 din 49, Gosloto 4 din 20, „Sportloto” 6 din 49”) [47] auto- Încărcarea tobelor de loterie sunt folosite pentru a determina câștigătorii . Tragele la sorți sunt transmise în direct. [48]
În loteriile de stat rusești ("Rapido", "Keno-Sportloto", "Top-3", "12/24", "Totul pentru o sută"), se folosește un generator de numere aleatorii pentru a determina câștigătorii - un hardware și software sistem certificat de ANO „MIC” și respectând recomandările FSUE VNIIMS . Dispozitivul generează un flux continuu de zgomot aleatoriu, care este convertit în numere. La un moment dat, valorile curente sunt smulse din flux, care reprezintă combinația câștigătoare la loterie. [49]
În 2015, fostul director de securitate al Asociației Multi-State Lottery din SUA , după ce a câștigat 16,5 milioane de dolari, care avea acces la software-ul folosit la extragerile la loterie, a fost însărcinat să folosească algoritmi speciali pentru a determina combinația câștigătoare de loterie timp de câteva zile pe an. [cincizeci]