Generazione di numeri casuali - Random number generation

I dadi sono un esempio di un generatore di numeri casuali hardware meccanico. Quando si lancia un dado cubico, si ottiene un numero casuale da 1 a 6.

Generazione di numeri casuali è un processo mediante il quale, spesso per mezzo di un generatore di numeri casuali ( RNG ), una sequenza di numeri o simboli che non possono essere ragionevolmente prevedibili meglio da casuale caso viene generato. Ciò significa che la particolare sequenza di risultati conterrà alcuni modelli rilevabili con il senno di poi ma imprevedibili con la previsione. I veri generatori di numeri casuali possono essere generatori di numeri casuali hardware (HRNGS) che generano numeri casuali, in cui ogni generazione è una funzione del valore corrente dell'attributo di un ambiente fisico che cambia costantemente in un modo praticamente impossibile da modellare. Ciò sarebbe in contrasto con le cosiddette "generazioni di numeri casuali" eseguite da generatori di numeri pseudocasuali (PRNG) che generano numeri che sembrano solo casuali ma in realtà sono predeterminati: queste generazioni possono essere riprodotte semplicemente conoscendo lo stato del PRNG .

Varie applicazioni della casualità hanno portato allo sviluppo di diversi metodi per generare dati casuali . Alcuni di questi sono esistite fin dai tempi antichi, tra le cui fila sono ben noti esempi "classici", tra cui il rotolamento dei dadi , lanciando moneta , il rimescolamento di carte da gioco , l'uso di achillea steli (per la divinazione ) nel I Ching , così come innumerevoli altre tecniche. A causa della natura meccanica di queste tecniche, la generazione di grandi quantità di numeri sufficientemente casuali (importante nelle statistiche) richiedeva molto lavoro e tempo. Pertanto, i risultati a volte venivano raccolti e distribuiti come tabelle di numeri casuali .

Esistono diversi metodi di calcolo per la generazione di numeri pseudocasuali. Tutti non raggiungono l'obiettivo della vera casualità, sebbene possano soddisfare, con successo variabile, alcuni dei test statistici per la casualità destinati a misurare quanto siano imprevedibili i loro risultati (cioè, fino a che punto i loro modelli siano distinguibili). Ciò li rende generalmente inutilizzabili per applicazioni come la crittografia . Tuttavia, esistono anche generatori di numeri pseudocasuali crittograficamente sicuri (CSPRNGS) accuratamente progettati , con caratteristiche speciali progettate specificamente per l'uso nella crittografia.

Applicazioni e usi pratici

I generatori di numeri casuali hanno applicazioni nel gioco d' azzardo , nel campionamento statistico , nella simulazione al computer , nella crittografia , nella progettazione completamente randomizzata e in altre aree in cui è desiderabile produrre un risultato imprevedibile. Generalmente, nelle applicazioni che hanno l'imprevedibilità come caratteristica fondamentale, come nelle applicazioni di sicurezza, i generatori di hardware sono generalmente preferiti rispetto agli algoritmi pseudocasuali, ove fattibile.

I generatori di numeri pseudocasuali sono molto utili nello sviluppo di simulazioni con metodo Monte Carlo , poiché il debug è facilitato dalla possibilità di eseguire nuovamente la stessa sequenza di numeri casuali partendo dallo stesso seme casuale . Sono utilizzati anche in crittografia, purché il seme sia segreto. Mittente e destinatario possono generare automaticamente lo stesso insieme di numeri da utilizzare come chiavi.

La generazione di numeri pseudocasuali è un compito importante e comune nella programmazione di computer. Mentre la crittografia e alcuni algoritmi numerici richiedono un grado molto elevato di casualità apparente , molte altre operazioni richiedono solo una modesta quantità di imprevedibilità. Alcuni semplici esempi potrebbero presentare a un utente una "citazione casuale del giorno" o determinare in che modo un avversario controllato dal computer potrebbe muoversi in un gioco per computer. Forme più deboli di casualità vengono utilizzate negli algoritmi hash e nella creazione di algoritmi di ricerca e ordinamento ammortizzati .

Alcune applicazioni che a prima vista sembrano adatte alla randomizzazione non sono in realtà così semplici. Ad esempio, un sistema che seleziona "casualmente" i brani musicali per un sistema di musica di sottofondo deve apparire solo casuale e può anche avere modi per controllare la selezione della musica: un vero sistema casuale non avrebbe alcuna restrizione sul fatto che lo stesso elemento appaia due o tre volte in successione.

Numeri "veri" contro numeri pseudo-casuali

Esistono due metodi principali utilizzati per generare numeri casuali. Il primo metodo misura alcuni fenomeni fisici che dovrebbero essere casuali e quindi compensa eventuali distorsioni nel processo di misurazione. Le fonti di esempio includono la misurazione del rumore atmosferico , del rumore termico e altri fenomeni elettromagnetici e quantistici esterni. Ad esempio, la radiazione cosmica di fondo o il decadimento radioattivo misurati su scale temporali brevi rappresentano fonti di entropia naturale .

La velocità con cui l'entropia può essere raccolta da fonti naturali dipende dai fenomeni fisici sottostanti misurati. Pertanto, si dice che le fonti di entropia "vera" naturale siano bloccanti  : sono limitate in velocità fino a quando non viene raccolta abbastanza entropia per soddisfare la domanda. Su alcuni sistemi simili a Unix, inclusa la maggior parte delle distribuzioni Linux , il file pseudo dispositivo /dev/random si bloccherà fino a quando non verrà raccolta sufficiente entropia dall'ambiente. A causa di questo comportamento di blocco, letture in blocco di grandi dimensioni da /dev/random , come riempire un'unità disco rigido con bit casuali, possono spesso essere lente su sistemi che utilizzano questo tipo di fonte di entropia.

Il secondo metodo utilizza algoritmi computazionali in grado di produrre lunghe sequenze di risultati apparentemente casuali, che in realtà sono completamente determinati da un valore iniziale più breve, noto come valore seme o chiave . Di conseguenza, l'intera sequenza apparentemente casuale può essere riprodotta se si conosce il valore del seme. Questo tipo di generatore di numeri casuali è spesso chiamato generatore di numeri pseudocasuali . Questo tipo di generatore in genere non si basa su fonti di entropia naturale, sebbene possa essere periodicamente seminato da fonti naturali. Questo tipo di generatore non è bloccante, quindi non è limitato dalla velocità da un evento esterno, rendendo possibili letture di grandi dimensioni.

Alcuni sistemi adottano un approccio ibrido, fornendo casualità raccolte da fonti naturali quando disponibili e ricorrendo a generatori di numeri pseudocasuali crittograficamente sicuri basati su software periodicamente riseminati (CSPRNG). Il fallback si verifica quando il tasso di casualità di lettura desiderato supera la capacità dell'approccio di raccolta naturale di tenere il passo con la domanda. Questo approccio evita il comportamento di blocco a velocità limitata dei generatori di numeri casuali basati su metodi più lenti e puramente ambientali.

Mentre un generatore di numeri pseudocasuali basato esclusivamente sulla logica deterministica non può mai essere considerato come una "vera" sorgente di numeri casuali nel senso più puro del termine, in pratica sono generalmente sufficienti anche per applicazioni critiche per la sicurezza. In effetti, generatori di numeri pseudocasuali accuratamente progettati e implementati possono essere certificati per scopi crittografici critici per la sicurezza, come nel caso dell'algoritmo achillea e fortuna . Il primo è la base della sorgente di entropia /dev/random su FreeBSD , AIX , OS X , NetBSD e altri. OpenBSD utilizza un algoritmo di numeri pseudocasuali noto come arc4random .

Metodi di generazione

Metodi fisici

I primi metodi per generare numeri casuali, come i dadi, il lancio delle monete e le ruote della roulette, sono ancora utilizzati oggi, principalmente nei giochi e nel gioco d'azzardo, poiché tendono ad essere troppo lenti per la maggior parte delle applicazioni in statistica e crittografia.

Un generatore di numeri casuali fisici può essere basato su un fenomeno fisico atomico o subatomico essenzialmente casuale la cui imprevedibilità può essere ricondotta alle leggi della meccanica quantistica . Le fonti di entropia includono il decadimento radioattivo , il rumore termico , il rumore da sparo , il rumore delle valanghe nei diodi Zener , la deriva dell'orologio , i tempi dei movimenti effettivi di una testina di lettura e scrittura del disco rigido e il rumore radio . Tuttavia, i fenomeni fisici e gli strumenti utilizzati per misurarli presentano generalmente asimmetrie e distorsioni sistematiche che rendono i loro risultati non uniformemente casuali. Un estrattore di casualità , come una funzione hash crittografica , può essere utilizzato per avvicinarsi a una distribuzione uniforme di bit da una sorgente casuale non uniforme, sebbene a un bit rate inferiore.

La comparsa di sorgenti di entropia fotonica a banda larga, come il caos ottico e il rumore di emissione spontanea amplificato , aiuta notevolmente lo sviluppo del generatore di numeri casuali fisici. Tra questi, il caos ottico ha un alto potenziale di produrre fisicamente numeri casuali ad alta velocità a causa della sua elevata larghezza di banda e grande ampiezza. Nel 2013 è stato costruito un prototipo di un generatore di bit casuali fisici in tempo reale ad alta velocità basato su un laser caotico.

Sono stati escogitati vari modi fantasiosi per raccogliere queste informazioni entropiche. Una tecnica consiste nell'eseguire una funzione hash su un frame di un flusso video da una fonte imprevedibile. Lavarand ha usato questa tecnica con le immagini di un certo numero di lampade di lava . HotBits misura il decadimento radioattivo con tubi Geiger-Muller , mentre Random.org utilizza variazioni nell'ampiezza del rumore atmosferico registrato con una normale radio.

Dimostrazione di un semplice generatore di numeri casuali basato su dove e quando si fa clic su un pulsante

Un'altra fonte comune di entropia è il comportamento degli utenti umani del sistema. Sebbene le persone non siano considerate buoni generatori di casualità su richiesta, generano comportamenti casuali abbastanza bene nel contesto dei giochi di strategia mista . Alcuni software per computer relativi alla sicurezza richiedono che l'utente esegua una lunga serie di movimenti del mouse o input da tastiera per creare l'entropia sufficiente necessaria per generare chiavi casuali o per inizializzare generatori di numeri pseudocasuali.

Metodi di calcolo

La maggior parte dei numeri casuali generati dal computer utilizza PRNG che sono algoritmi in grado di creare automaticamente lunghe serie di numeri con buone proprietà casuali ma alla fine la sequenza si ripete (o l'utilizzo della memoria cresce senza limiti). Questi numeri casuali vanno bene in molte situazioni, ma non sono casuali come i numeri generati dal rumore atmosferico elettromagnetico usato come fonte di entropia. La serie di valori generati da tali algoritmi è generalmente determinata da un numero fisso chiamato seme. Uno dei PRNG più comuni è il generatore congruenziale lineare , che utilizza la ricorrenza

per generare numeri, dove a , b e m sono interi grandi, ed è il successivo in X come una serie di numeri pseudocasuali. Il numero massimo di numeri che la formula può produrre è uno in meno del modulo , m -1. La relazione di ricorrenza può essere estesa alle matrici per avere periodi molto più lunghi e migliori proprietà statistiche. Per evitare alcune proprietà non casuali di un singolo generatore congruenziale lineare, più generatori di numeri casuali di questo tipo con valori leggermente diversi del coefficiente moltiplicatore, a , possono essere utilizzati in parallelo, con un generatore di numeri casuali "master" che seleziona tra i vari diversi generatori.

Un semplice metodo carta e penna per generare numeri casuali è il cosiddetto metodo del quadrato medio suggerito da John von Neumann . Sebbene sia semplice da implementare, il suo output è di scarsa qualità. Ha un periodo molto breve e gravi punti deboli, come la sequenza di output che converge quasi sempre a zero. Una recente innovazione è quella di combinare il quadrato centrale con una sequenza di Weyl . Questo metodo produce un output di alta qualità per un lungo periodo.

La maggior parte dei linguaggi di programmazione per computer include funzioni o routine di libreria che forniscono generatori di numeri casuali. Sono spesso progettati per fornire un byte o una parola casuale o un numero in virgola mobile distribuito uniformemente tra 0 e 1.

La qualità, cioè la casualità, di tali funzioni di libreria varia ampiamente da un output completamente prevedibile a un sicuro crittograficamente. Il generatore di numeri casuali predefinito in molte lingue, inclusi Python, Ruby, R, IDL e PHP, è basato sull'algoritmo Mersenne Twister e non è sufficiente per scopi di crittografia, come è esplicitamente affermato nella documentazione del linguaggio. Tali funzioni di libreria hanno spesso scarse proprietà statistiche e alcune ripeteranno i modelli dopo solo decine di migliaia di prove. Vengono spesso inizializzati utilizzando l' orologio in tempo reale di un computer come seme, poiché un tale orologio generalmente misura in millisecondi, ben oltre la precisione della persona . Queste funzioni possono fornire una casualità sufficiente per determinate attività (ad esempio i videogiochi) ma non sono adatte dove è richiesta una casualità di alta qualità, come nelle applicazioni di crittografia, statistica o analisi numerica.

Fonti di numeri casuali di qualità molto più elevata sono disponibili sulla maggior parte dei sistemi operativi; per esempio /dev/random su vari tipi di BSD, Linux, Mac OS X, IRIX e Solaris, o CryptGenRandom per Microsoft Windows. La maggior parte dei linguaggi di programmazione, inclusi quelli sopra menzionati, forniscono un mezzo per accedere a queste fonti di qualità superiore.

dagli umani

La generazione di numeri casuali può essere eseguita anche da esseri umani, sotto forma di raccolta di vari input dagli utenti finali e di utilizzarli come fonte di randomizzazione. Tuttavia, la maggior parte degli studi rileva che i soggetti umani hanno un certo grado di non casualità quando tentano di produrre una sequenza casuale di, ad esempio, cifre o lettere. Possono alternare troppo tra le scelte rispetto a un buon generatore casuale; quindi, questo approccio non è ampiamente utilizzato.

Post-elaborazione e controlli statistici

Anche data una fonte di numeri casuali plausibili (forse da un generatore hardware basato sulla meccanica quantistica), è necessario ottenere numeri completamente imparziali. Inoltre, il comportamento di questi generatori cambia spesso con la temperatura, la tensione di alimentazione, l'età del dispositivo o altre interferenze esterne. E un bug software in una routine di numeri pseudocasuali, o un bug hardware nell'hardware su cui viene eseguito, può essere altrettanto difficile da rilevare.

I numeri casuali generati sono talvolta sottoposti a test statistici prima dell'uso per garantire che la fonte sottostante funzioni ancora e quindi post-elaborati per migliorare le loro proprietà statistiche. Un esempio potrebbe essere il generatore di numeri casuali hardware TRNG9803, che utilizza una misurazione dell'entropia come test dell'hardware e quindi elabora la sequenza casuale con un codice a flusso di registro a scorrimento. In genere è difficile utilizzare test statistici per convalidare i numeri casuali generati. Wang e Nicol hanno proposto una tecnica di test statistico basata sulla distanza che viene utilizzata per identificare i punti deboli di diversi generatori casuali. Li e Wang hanno proposto un metodo per testare i numeri casuali basato su sorgenti di entropia caotica laser utilizzando le proprietà di movimento browniano.

Altre considerazioni

Rimodellare la distribuzione

distribuzioni uniformi

La maggior parte dei generatori di numeri casuali funziona nativamente con numeri interi o singoli bit, quindi è necessario un passaggio aggiuntivo per arrivare alla distribuzione uniforme "canonica" tra 0 e 1. L'implementazione non è così banale come dividere l'intero per il suo valore massimo possibile. Nello specifico:

  1. L'intero utilizzato nella trasformazione deve fornire bit sufficienti per la precisione prevista.
  2. La natura stessa della matematica in virgola mobile significa che esiste più precisione quanto più il numero è vicino a zero. Questa precisione extra di solito non viene utilizzata a causa dell'elevato numero di bit richiesti.
  3. L'errore di arrotondamento nella divisione può influenzare il risultato. Nel peggiore dei casi, un limite presumibilmente escluso può essere disegnato contro le aspettative basate sulla matematica dei numeri reali.

L'algoritmo mainstream, utilizzato da OpenJDK, Rust e Numpy, è descritto in una proposta per STL di C++ . Non usa la precisione extra e soffre di bias solo nell'ultimo bit a causa del round-to-even. Altre preoccupazioni numeriche sono giustificate quando si sposta questa distribuzione uniforme "canonica" in un intervallo diverso. Un metodo proposto per il linguaggio di programmazione Swift afferma di utilizzare la massima precisione ovunque.

Gli interi uniformemente distribuiti sono comunemente usati in algoritmi come Fisher-Yates shuffle . Ancora una volta, un'implementazione ingenua può indurre una distorsione del modulo nel risultato, quindi è necessario utilizzare algoritmi più complessi. Un metodo che non esegue quasi mai la divisione è stato descritto nel 2018 da Daniel Lemire, con l'attuale stato dell'arte dell'"algoritmo ottimale" 2021 ispirato alla codifica aritmetica di Stephen Canon di Apple Inc.

La maggior parte degli RNG da 0 a 1 include 0 ma esclude 1, mentre altri includono o escludono entrambi.

Altre distribuzioni

Data una sorgente di numeri casuali uniformi, ci sono un paio di metodi per creare una nuova sorgente casuale che corrisponda a una funzione di densità di probabilità . Un metodo, chiamato metodo di inversione , prevede l'integrazione fino a un'area maggiore o uguale al numero casuale (che dovrebbe essere generato tra 0 e 1 per distribuzioni corrette). Un secondo metodo, chiamato metodo di accettazione-rifiuto , implica la scelta di un valore x e y e il test se la funzione di x è maggiore del valore y. In caso affermativo, il valore x viene accettato. In caso contrario, il valore x viene rifiutato e l'algoritmo riprova.

Come esempio per il campionamento del rifiuto, per generare una coppia di numeri casuali standard distribuiti normalmente statisticamente indipendenti ( x , y ), si possono prima generare le coordinate polari ( r , θ ), dove r 2 ~ χ 2 2 e θ ~ UNIFORM( 0,2π) (vedi trasformata di Box–Muller ).

sbiancante

Le uscite di più RNG indipendenti possono essere combinate (ad esempio, utilizzando un'operazione XOR bit per bit ) per fornire un RNG combinato almeno buono quanto il miglior RNG utilizzato. Questo è indicato come sbiancamento del software .

I generatori di numeri casuali computazionali e hardware sono talvolta combinati per riflettere i vantaggi di entrambi i tipi. I generatori di numeri casuali computazionali in genere possono generare numeri pseudocasuali molto più velocemente dei generatori fisici, mentre i generatori fisici possono generare "vera casualità".

Sequenze a bassa discrepanza come alternativa

Alcuni calcoli che fanno uso di un generatore di numeri casuali possono essere riassunti come il calcolo di un valore totale o medio, come il calcolo degli integrali con il metodo Monte Carlo . Per tali problemi, può essere possibile trovare una soluzione più accurata mediante l'uso delle cosiddette sequenze a bassa discrepanza , chiamate anche numeri quasi casuali . Tali sequenze hanno uno schema definito che riempie le lacune in modo uniforme, qualitativamente parlando; una sequenza veramente casuale può, e di solito lo fa, lasciare spazi vuoti più grandi.

Attività e dimostrazioni

I seguenti siti mettono a disposizione campioni di numeri casuali:

  • Le pagine delle risorse SOCR contengono una serie di attività interattive pratiche e dimostrazioni di generazione di numeri casuali utilizzando applet Java.
  • Il Quantum Optics Group dell'ANU genera numeri casuali provenienti dal vuoto quantistico. Campioni di numeri casuali sono disponibili nella pagina di ricerca del generatore di numeri casuali quantistici.
  • Random.org rende disponibili numeri casuali che derivano dalla casualità del rumore atmosferico.
  • Il Quantum Random Bit Generator Service presso l' Istituto Ruđer Bošković raccoglie la casualità dal processo quantistico dell'emissione fotonica nei semiconduttori. Forniscono una varietà di modi per recuperare i dati, comprese le librerie per diversi linguaggi di programmazione.
  • Il gruppo della Taiyuan University of Technology genera numeri casuali provenienti da un laser caotico. Campioni di numeri casuali sono disponibili presso il loro servizio di generazione di numeri casuali fisici.

Backdoor

Poiché gran parte della crittografia dipende da un generatore di numeri casuali crittograficamente sicuro per la generazione di chiavi e nonce crittografici , se un generatore di numeri casuali può essere reso prevedibile, può essere utilizzato come backdoor da un utente malintenzionato per violare la crittografia.

Si dice che la NSA abbia inserito una backdoor nel generatore di numeri pseudocasuali crittograficamente sicuro certificato NIST Dual EC DRBG . Se, ad esempio, viene creata una connessione SSL utilizzando questo generatore di numeri casuali, secondo Matthew Green ciò consentirebbe all'NSA di determinare lo stato del generatore di numeri casuali e quindi alla fine essere in grado di leggere tutti i dati inviati tramite la connessione SSL. Anche se era evidente che Dual_EC_DRBG era un generatore di numeri pseudocasuali molto scadente e probabilmente protetto da backdoor molto prima che la backdoor della NSA fosse confermata nel 2013, aveva visto un utilizzo significativo nella pratica fino al 2013, ad esempio da parte dell'importante società di sicurezza RSA Security . Successivamente ci sono state accuse secondo cui RSA Security ha consapevolmente inserito una backdoor della NSA nei suoi prodotti, probabilmente come parte del programma Bullrun . RSA ha negato di aver inserito consapevolmente una backdoor nei suoi prodotti.

È stato anche teorizzato che gli RNG hardware potrebbero essere modificati segretamente per avere meno entropia di quanto dichiarato, il che renderebbe la crittografia utilizzando l'RNG hardware suscettibile di attacchi. Uno di questi metodi che è stato pubblicato funziona modificando la maschera drogante del chip, che non sarebbe rilevabile dal reverse engineering ottico. Ad esempio, per la generazione di numeri casuali in Linux, è considerato inaccettabile utilizzare l' RNG hardware RDRAND di Intel senza mescolare l'output RDRAND con altre fonti di entropia per contrastare eventuali backdoor nell'RNG hardware, soprattutto dopo la rivelazione del programma NSA Bullrun .

Nel 2010, un'estrazione della lotteria statunitense è stata truccata dal direttore della sicurezza delle informazioni della Multi-State Lottery Association (MUSL), che ha installato surrettiziamente malware backdoor sul computer RNG sicuro del MUSL durante la manutenzione ordinaria. Durante gli hack l'uomo ha vinto un importo totale di $ 16.500.000 prevedendo correttamente i numeri alcune volte all'anno.

La randomizzazione del layout dello spazio degli indirizzi (ASLR), una mitigazione contro il rowhammer e i relativi attacchi all'hardware fisico dei chip di memoria è stata ritenuta inadeguata all'inizio del 2017 da VUSec. L'algoritmo del numero casuale, se basato su un registro a scorrimento implementato nell'hardware, è prevedibile a valori sufficientemente grandi di p e può essere decodificato con una potenza di elaborazione sufficiente ( Brute Force Hack ). Ciò significa anche indirettamente che il malware che utilizza questo metodo può essere eseguito sia su GPU che su CPU se codificato per farlo, anche utilizzando GPU per interrompere ASLR sulla CPU stessa.

Guarda anche

Riferimenti

Ulteriori letture

link esterno