Scuola Politecnica e delle Scienze di Base Corso di Laurea in Ingegneria Informatica Elaborato finale in Elettronica Generale Random Number Generation Techniques Anno Accademico 2015/2016 Candidato: Giuseppe Primo matr. N46001089 Alla mia Famiglia 2 Indice Random Number Generation Tecniques .................................................................................. 1 Indice .................................................................................................................................................... 3 Introduzione ......................................................................................................................................... 4 Capitolo 1: True Random Number Generator...................................................................................... 6 1.1 Direct Amplification .................................................................................................................. 8 1.2 Oscillator Sampling .................................................................................................................. 10 1.3 Discrete-Time Chaos ................................................................................................................ 11 Capitolo 2: Pseudo-Random Number Generator ............................................................................... 14 2.1 Middle Square Method............................................................................................................. 15 2.1.1 Esempio MSM: ................................................................................................................. 15 2.2 Linear Congruential Generator ................................................................................................ 16 2.2.1 Esempio LCG: .................................................................................................................. 17 2.3 Lagged Fibonacci Generator .................................................................................................... 18 2.4 Mersenne Twister ..................................................................................................................... 19 2.6 Blum Blum Shub ...................................................................................................................... 20 2.1.1 Esempio BBS: ................................................................................................................... 21 2.7 Fortuna ..................................................................................................................................... 21 Capitolo 3: TRNGs VS. PRNGs ........................................................................................................ 24 Capitolo 4: Conclusioni ..................................................................................................................... 28 Bibliografia ........................................................................................................................................ 30 3 Introduzione I generatori di numeri casuali o Random Number Generators (RNGs) sono dispositivi hardware o componenti software in grado di generare sequenze di numeri casuali. Un numero casuale può essere visto come una singola osservazione di una specifica variabile aleatoria. Una sequenza di numeri, per essere definita casuale, deve soddisfare almeno due caratteristiche: I numeri appartenenti alla suddetta sequenza devono essere uniformemente distribuiti (equiprobabili). Ogni numero deve essere statisticamente indipendente dagli altri numeri della sequenza Gli studiosi concentrano le loro ricerche ed il loro lavoro nel campo della generazioni di numeri in maniera casuale perché i RNGs sono impiegati in molti scenari: giochi e lotterie, crittografia, generazione di dati per test, simulazioni al computer (ad esempio simulazione di Monte Carlo), videogiochi e, in generale, in tutte quelle applicazioni in cui sono richiesti eventi casuali. Nella maggior parte delle applicazioni è desiderabile avere un generatore veloce e che produca sequenze di numeri quanto più “casuali” possibile. Tuttavia, queste due proprietà sono, di solito, inversamente proporzionali tra di loro: RNGs di buona qualità sono spesso lenti, mentre RNGs di bassa qualità sono, tipicamente, veloci. Per valutare la qualità di un generatore di numeri casuali, si effettuano una serie di test statistici applicati alle sequenze di numeri ottenute. Attualmente, esistono molti test statistici ed ognuno di essi, in generale, mira a dimostrare la presenza o l’assenza di “pattern” (o correlazione) all’interno della sequenza generata. La presenza di correlazione all’interno 4 della sequenza potrebbe indicare che la sequenza stessa non soddisfi le due proprietà citate e quindi, il generatore, sarà considerato di bassa qualità. E` importante tenere a mente che un numero finito di test statistici non può dimostrare che la sequenza generata sia casuale, è solo possibile dimostrare che la sequenza non è casuale. Dunque, poiché i test sono di natura statistica, non sarà possibile dare per certo il loro esito ma, ovviamente, più saranno i test che il generatore supera maggiore sarà la possibilità che il generatore sia un buon generatore. Si distinguono, a partire dal tipo di implementazione adottata, due principali famiglie di generatori: True Random Number Generator - TRNG e Pseudo-Random Number Generator - PRNG. 5 Capitolo 1: True Random Number Generator Chiamati anche Physical RNG o Hardware RNG lavorano sulla base di alcuni fenomeni fisici i quali ci si aspetta che siano puramente casuali. In particolare essi “estraggono” la casualità da processi fisici che si comportano, in linea di principio, in maniera non deterministica e quindi non predicibile. I fenomeni fisici su cui si basano questo tipo di generatori sono fenomeni microscopici come: il rumore termico, rumore atmosferico, effetto fotoelettrico, fenomeni quantistici o altri fenomeni. Un TRNG è un componente hardware spesso separato dal computer o dal dispositivo “ospitante”, connesso ad esso tramite USB o PCI bus. Si intuisce allora che la sorgente di rumore in ingresso al generatore deve spesso seguire un forte processo di digitalizzazione. In generale, l’architettura di un TRNG (Fig. 3) prevede: Un segnale analogico n(t) generato dalla sorgente di rumore (Noise Source) in ingresso, sulla base di processi fisici non deterministici, al Digitizer. Una sorgente di rumore ideale genera un segnale con distribuzione di probabilità uniforme. Il Digitizer campiona il segnale analogico (ad es. con un comparatore) e lo converte in uno stream di bit random s[i] (segnale analogico digitalizzato). Il Digitizer, insieme al Noise Source forma il Digitizer Noise Source. Il segnale digitalizzato s[i] è dato in input al Post-Processing Unit il quale produce words composte da m-bit (Internal Random Numbers – r[i]). 6 Questo blocco risolve due problemi: c’è la possibilità che la distribuzione di probabilità dei random bits generati non sia puramente uniforme ed inoltre si potrebbe verificare una bassa entropia. In particolare, il Post-Processing block consente di ottenere sequenze uniformemente distribuite di “0” e “1”. Questo componente hardware è implementato con diverse tecniche, tra le più diffuse si individuano: quella basata su un concetto proposto da John Von Neumann (Von Neumann Corrector, Fig.1) e quella basata su un operazione di OR esclusivo (XOR Corrector, Fig. 2). 1. Von Neumann Corrector converte coppie di bit in un solo output. In particolare converte la coppia [1, 0] in 0 e la coppia [0, 1] in 1. Per le coppie [0, 0] e [1, 1] non corrisponderà nessun output. [Fig. 1 Von Neumann Corrector] 2. XOR Corrector è basato sul concetto di OR Esclusivo descritto dalla tabella di verità in Fig. 2. [Fig. 2 Tabella di Verità XOR] Con l’ausilio di questo componente, dunque, sarà possibile incrementare l’entropia della sequenza in uscita ma il bit-rate complessivo del generatore, ovviamente, tenderà a diminuire. 7 Output Interface è un modulo che consente di avere una rappresentazione del numero generato in uno specifico formato. Quindi, tale blocco, converte la sequenza r[i] in una sequenza “richiesta” r_out[i] (External Random Number). [Fig. 3 Architettura generale di un TRNG] Le tecniche TRNG più diffuse sono tre: Direct Amplification Oscillator Sampling Discrete-Time Chaos 1.1 Direct Amplification La tecnica di generazione di numeri casuali più popolare è quella dell’amplificazione diretta, mostrata in Fig.1.1. E` caratterizzata da un amplificatore operazionale per amplificare il segnale (rumore) prodotto dalla sorgente di rumore. La sorgente di rumore può essere, ad esempio: rumore termico (generato dal movimento degli elettroni in un resistore) shot noise (generato dal flusso di corrente che attraversa una giunzione p-n). 8 [Fig. 1.1 Tecnica di Amplificazione Diretta] Il rumore deve essere amplificato per consentire al comparatore di operare riducendo i margini di errore. Il comparatore, a partire dagli input, converte il segnale analogico in un bitstream che rappresenta il numero digitale generato. Nello specifico, la tecnica dell’amplificazione diretta, consiste nel moltiplicare il segnale rumore w(n) col guadagno costante dell’amplificatore K e, successivamente, comparare il risultato con una tensione di offset 𝑉𝑜𝑓𝑓 in modo da ottenere, in output, una sequenza di bit 𝑏𝐷𝐴 (𝑛) come descritto di seguito: 𝑏𝐷𝐴 (𝑛) = { 1, 0, 𝐾 𝑤(𝑛) < 𝑉𝑜𝑓𝑓 𝑎𝑙𝑡𝑟𝑖𝑚𝑒𝑛𝑡𝑖 Per via della semplicità di realizzazione e del basso consumo di potenza, questa tecnica è adatta a soluzioni basate su singoli chip solo se è possibile schermare il rumore. Infatti è sensibile a variazioni deterministiche causate, in generale, da fenomeni di natura elettromagnetica o dalle particolari caratteristiche dell’amplificatore stesso. Pertanto, il segnale ottenuto in output dall’amplificatore sarà un segnale predicibile. La soluzione più efficiente potrebbe essere quella di schermare l’intero circuito al fine di preservare il segnale di rumore. Questa soluzione però richiederebbe grandi sforzi, sia in termini di progettazione e sia in termini economici. 9 1.2 Oscillator Sampling La maggior parte dei TRNGs sono basati su oscillatori. In questo tipo di generatori, due o più oscillatori sono combinati al fine di produrre una sequenza random di bit. Un tipico esempio di questi generatori è mostrato in Fig. 1.2. I componenti fondamentali sono: Un oscillatore a bassa frequenza Un oscillatore ad alta frequenza Flip-Flop D L’oscillatore a bassa frequenza fornisce un segnale di clock al Flip-Flop D in modo da campionare, sul fronte di salita, il segnale ad alta frequenza generato dall’oscillatore ad alta frequenza. Di fondamentale importanza è il periodo di jitter delle oscillazioni in quanto comportano incertezza nel momento di cui si va a campionare in un determinato istante. La “robustezza” di tale generatore può essere incrementata definendo opportunamente la frequenza dei due oscillatori. La probabilità di generare numeri puramente casuali dipende, dunque, dal periodo di jitter. [Fig. 1.2 Basic oscillator-based Random Number Generator] Questa tecnica, a differenza del Direct Amplification, è più robusta in presenza di rumore non “schermato”. Inoltre è possibile, stabilendo il periodo degli oscillatori, la qualità dei numeri generati. 10 Ma è stato dimostrato che, a partire solamente jitter degli oscillatori, non è sufficiente generare sequenze puramente casuali. Inoltre, il bit-rate di un generatore di questo tipo è circa 100 kbps e, dunque, sarà difficile utilizzarlo in sistema crittografici ad alta velocita`. 1.3 Discrete-Time Chaos Una soluzione a questi problemi potrebbe essere quella basata sulla teoria del chaos. Il “chaos” può essere visto come un comportamento non periodico, a lungo termine e non prevedibile generato da un certo sistema dinamico non lineare. Un sistema caotico è, dunque, un sistema fisico dominato dal caos nel quale anche piccole sollecitazioni del sistema potrebbero avere notevoli conseguenze sullo stato futuro del sistema stesso. I sistemi caotici, dato lo stato iniziale del sistema, sono per natura deterministici. Se si conosce esattamente lo stato iniziale del sistema, l’output del sistema potrebbe essere prevedibile. La particolarità di questo tipo di sistemi è che, in pratica, è difficile stimare lo stato iniziale del sistema e tale caratteristica li rende impredicibili. Possono essere utilizzate, ad esempio, le chaotic maps che sono una sottoclasse di sistemi dinamici non lineari a tempo discreto. Una tipica implementazione è la mappa shift di Bernoulli la quale esibisce un comportamento caotico mostrato in Fig. 1.3.1. All’interno della mappa si genera: 0 se 𝑥𝑛 < 1/2 1 se 𝑥𝑛 > 1/2. 11 Le probabilità di tutte le transizioni è uguale ad ½ a prescindere dallo stato corrente del sistema. [Fig. 1.3.1 Bernoulli shift map] Generatori che implementano soluzioni di questo tipo sono simili ai convertitori A/D (Fig. 1.3.2) in quanto sono composti da N-moduli in cascata (N-bit A/D Converter). L’output di un modulo è dato in input al modulo successivo. [Fig. 1.3.2 Esempio di una tecnica discrete-time chaos] L’inserimento di più moduli in sequenza, consente di aumentare la velocità dell’intero sistema e di conseguenza di migliorare la qualità dei bit casuali generati. Quindi l’alta velocità, capacità di integrazione e l’alta qualità dei bit generati rendono questo tipo di soluzione un candidato eccellente per la realizzazione di sistemi embedded basati su generatori di numeri casuali. I TRNGs basati su chaos sono molto più veloci dei TRNGs basati su oscillatori e possono essere facilmente integrati in altri circuiti. Come le tecniche basate su oscillatori, anche le tecniche discrete-time chaos sono robuste a influenze deterministiche (interferenze). 12 E` stato dimostrato, inoltre, che la non idealità delle mappe caotiche permettono di migliorare l’efficienza del Post-Processing Unit. 13 Capitolo 2: Pseudo-Random Number Generator Numeri casuali possono essere ottenuti anche da algoritmi i quali dovrebbero produrre, in linea generale, una sequenza di numeri avente le stesse proprietà statistiche di una sequenza generata da un TRNG. L’utilizzo di algoritmi però implica che i numeri verranno generati in modo completamente deterministico. Sarà quasi sempre necessario fornire un valore iniziale detto seme al fine di inizializzare l’algoritmo. A parità di seme e di interazioni, questi metodi forniscono sempre la stessa identica sequenza. Per tale motivo questo tipo di generatori sono detti generatori Pseudo-Casuali. Nei PRNGs vengono generati, nella maggior parte dei casi, sequenze di numeri interi uniformemente distribuiti tra 0 e un numero massimo prestabilito, oppure sequenze di numeri reali compresi tra 0 e 1. Esistono numerosi tipi di PRNG che si differenziano in base al tipo di algoritmo implementato, tra i più importanti ed utilizzati si individuano: Middle Square Method Linear Congruential Generator Lagged Fibonacci Generator Mersenne Twister Blum Blum Shub Fortuna Gli ultimi due metodi, in particolare, sono utilizzati in tutte quelle applicazioni critiche basate su crittografia. Per tali generatori c’è il bisogno di definire, oltre alle due proprietà citate precedentemente, un’altra importante proprietà`: la non predicibilità. Ovvero, 14 l’algoritmo usato per generare numeri casuali non deve permettere di ricostruire l’intera sequenza di numeri a partire dalla conoscenza di una parte di essa o dal seme. Tutti i generatori che soddisfano questo requisito sono detti generatori crittograficamente sicuri (Cryptographically Secure Pseudo-Random Number Generator – CSPRNG). 2.1 Middle Square Method Uno dei primi metodi proposti fu il Middle Square Method - MSM. Questo metodo fu inventato da John Von Neumann e descritto in una conferenza nel 1949. L’algoritmo si basa su un’idea sostanzialmente semplice: 1) Si stabilisce valore iniziale (seme) 𝑥0 di M cifre 2) Tale valore è elevato al quadrato, aggiungendo degli 0 se necessario 3) L’elemento successivo della sequenza in output sarà quello individuato dalle M cifre centrali di tale numero. 4) Il numero individuato farà da nuovo input all’algoritmo ed iterando il processo è possibile ottenere una sequenza di numeri pseudo-random di M cifre. 2.1.1 Esempio MSM: 𝑥𝑛 = 945726 𝑥𝑛 2 = 894397667076 𝑥𝑛+1 = 397667 𝑥𝑛+1 2 = 158139042889 𝑥𝑛+2 = 139042 … Sono molte però le problematiche legate a questo tipo di algoritmo: Nel caso in cui le M cifre centrali siano tutte 0, il generatore produrrà solamente numeri ad M cifre nulle. Nel caso in cui almeno la metà delle cifre ottenute fosse composta da 0, tutti i successivi output decrescerebbero fino a 0. 15 Particolari valori iniziali potrebbero produrre sempre gli stessi output. Nonostante le carenze, questo metodo risulta comunque molto rapido. 2.2 Linear Congruential Generator La metodologia più utilizzata è quella degli algoritmi a congruenza lineare. Questo tipo di algoritmi permettono, in modo analogo all’algoritmo Middle Square, di generare una sequenza di numeri casuali a partire da un seme. In più risolve il problema della comparsa degli zeri introdotto nel Middle Square Method. Il generatore lineare congruenziale - LCG fu introdotto intorno agli anni 50’ dal matematico D.H. Lemer ed è ancora oggi molto utilizzato. Si basa su un concetto molto semplice da comprendere e da implementare. Il generatore implementa la seguente relazione matematica: 𝑥𝑛+1 = (𝑎𝑥𝑛 + 𝑐) mod 𝑚 In cui: 𝑥0 è il seme o valore iniziale 𝑥𝑛 è un valore della sequenza 𝑚 coefficiente intero strettamente maggiore di 0 chiamato modulo 𝑎 coefficiente intero strettamente maggiore di 0 chiamato moltiplicatore 𝑐 e` detto incremento ed è non negativo. Nel caso in cui 𝑐 = 0 si parla di ParkMiller RNG o RNG moltiplicativo) Il periodo di un LCG può essere al più pari ad 𝑚 e una scelta errata dei valori di 𝑎 e 𝑐 può influire negativamente sulla lunghezza della sequenza ottenuta. E` stato necessario, dunque, definire dei criteri per assegnare dei valori ad 𝑎, 𝑐, 𝑚 e ad 𝑥0 al fine di garantire periodo massimo. In particolare è stato dimostrato che converrebbe scegliere in parametri in questo modo: 1. 𝑐 e 𝑚 devono essere coprimi (𝑀𝐶𝐷 (𝑐, 𝑚) = 1) 2. 𝑎 − 1 è divisibile per tutti i fattori primi di 𝑚 3. Se 𝑎 − 1 è multiplo di 4 anche 𝑚 dovrà essere un multiplo di 4 16 2.2.1 Esempio LCG: Un esempio può essere mostrato scegliendo i parametri in questo modo: 𝑎=3 𝑐=6 𝑚=5 𝑥0 = 1 L’output è raffigurato in Fig. 2.2.1 dove si evince che, in questo caso, il periodo è uguale a 4. La relazione che caratterizza il generatore diventa: 𝑥𝑖+1 = (3 ∙ 𝑥𝑖 + 6) mod 5 La sequenza generata sarà dunque: 𝑥1 = (3 ∙ 𝑥0 + 6) mod 5 = 4 𝑥2 = (3 ∙ 𝑥1 + 6) mod 5 = 3 𝑥3 = (3 ∙ 𝑥2 + 6) mod 5 = 0 𝑥4 = (3 ∙ 𝑥3 + 6) mod 5 = 1 𝑥5 = (3 ∙ 𝑥4 + 6) mod 5 = 4 𝑥6 = (3 ∙ 𝑥5 + 6) mod 5 = 3 [Fig. 2.1.1 Sequenza generata dal LCG] Alcune librerie di vari compilatori implementano la funzione rand(), basata sul LCG, con parametri differenti. Tra le più importanti troviamo: 17 GNU C Library (glibc) che seleziona: 𝑚 = 232 , 𝑎 = 1103515245, 𝑐 = 12345 e si considerano i bit ottenuti dal 30 a 0 Java.Util.Random che seleziona: 𝑚 = 248 , 𝑎 = 25214903917, 𝑐 = 11 e si considerano i bit ottenuti dal 47 a 16 I vantaggi di questo tipo di approccio sono sicuramente la semplicità di realizzazione e la velocità di generazione dei numeri (complessità computazionale molto bassa). Queste caratteristiche gli permettono di essere utilizzati in tutti quei sistemi, con potenzialità di calcolo e memoria limitate, come i sistemi embedded e spesso nei videogiochi. Tuttavia, si può ottenere una sequenza periodica di periodo al più pari ad 𝑚, quindi occorre scegliere 𝑚 elevato e valore di 𝑎, 𝑐 e 𝑥0 tali da avere periodo massimo. I valori 𝑥𝑖 generati sono determinati da questi ultimi quattro parametri rendendo le sequenze in uscita predicibili. Inoltre le sequenze generate risultano correlate, pertanto non si presta a tutte le applicazioni basate su crittografia e simulazione. 2.3 Lagged Fibonacci Generator Il generatore di Fibonacci ritardato è stato introdotto per cercare di allungare il periodo del generatore. E` basato sulla generalizzazione della successione di Fibonacci: 𝐹𝑘 = 𝐹𝑘−1 + 𝐹𝑘−2 Similmente, il generatore è definito dalla relazione: 𝐹𝑘 = (𝐹𝑘−𝑝 ⊗ 𝐹𝑘−𝑝+𝑞 ) mod 𝑚 In cui: 𝐹𝑘 e` l’n-esimo termine della successione di numeri pseudo-casuali generati 𝑝 e` chiamato lag del generatore ⊗ e` una qualsiasi operazione (addizione, sottrazione, divisione, moltiplicazione o un operazione logica) 𝑚 = 2𝑙 è detto modulo Con tale algoritmo si generano numeri random formati da 𝑙 bit. Nel generatore di Fibonacci, il periodo varia a seconda dell’operatore utilizzato. Ad esempio, nel caso di somma o sottrazione, il generatore avrà periodo 𝑇 tale che: 18 𝑇 ≤ (2𝑝 − 1) ∙ 2𝑙−1 Nel caso della moltiplicazione, il generatore avrà periodo 𝑇 tale che: 𝑇 ≤ (2𝑝 − 1) ∙ 2𝑙−3 Nel caso dell’ OR esclusivo, il periodo 𝑇 diventera`: 𝑇 ≤ (2𝑝 − 1) Tutti i generatori di Fibonacci hanno numerosi vantaggi rispetto ai generatori lineari congruenziali. Un aspetto di rilievo è il periodo relativamente più lungo rispetto ai LCGs in quanto può essere aumentato scegliendo un valore di 𝑝 sufficientemente grande. E` stato dimostrato che con i generatori basati su addizione, sottrazione e moltiplicazione si ottengono buoni risultati sulla maggior parte dei test statistici anche con valori piccoli di 𝑝. Valori tipici della coppia (𝑝, 𝑞) sono: (17, 5), (31, 13), (55, 24). E` però raccomandato scegliere valori di 𝑝 sempre sufficientemente grandi al fine di migliorare la qualità del generatore stesso. Generatori basati su OR Esclusivo sono inefficienti per valori di 𝑝 piccoli, mentre per valori grandi, riescono a superare tutti i test statistici. Per questi generatori è consigliato, inoltre, assegnare a 𝑝 numeri primi di Mersenne. 2.4 Mersenne Twister E` un algoritmo sviluppato da M. Matsumoto e T.Nishimura nel 1997. Questo algoritmo viene proposto al fine di porre rimedio alle varie mancanze delle precedenti soluzioni. La prima cosa che bisogna osservare è che il periodo viene aumentato a 219937 − 1, tale periodo non e` una casualita` in quanto, il generatore MT, e` stato progettato apposta per ovviare ai problemi introdotti dai generatori con periodo breve. Inoltre e` molto simile al LCG usato nel linguaggio C in termini di velocità di generazione. Il nome di questo metodo deriva dal fatto che la lunghezza del periodo scelto deve essere un numero primo di Mersenne. 19 Un numero primo di Mersenne è un numero primo esprimibile come: 𝑀𝑝 = 2𝑝 − 1 𝑝 è un numero intero positivo primo Nonostante sia trascurabile la correlazione tra valori successivi della sequenza, questo algoritmo, non è considerato ottimale in ambito crittografico ma si presta molto bene nei metodi Monte Carlo. In seguito però, sono state introdotte nuove varianti dell’algoritmo in grado di lavorare anche in ambito crittografico. Si rimanda, per l’implementazione di tale algoritmo, al sito ufficiale [11]. 2.6 Blum Blum Shub Questo algoritmo, facendo parte dei CSPRNGs, possiede proprietà che lo rendono particolarmente adatto in ambito della crittografia. Il Blum Blum Shub generator o anche BBS o generator 𝑥 2 mod 𝑛 e` definito come: 𝑏𝑖 = 𝑥𝑖 𝑚𝑜𝑑 2 Dove: 𝑥𝑖 = 𝑥𝑖−1 2 mod 𝑛 𝑛 = 𝑝𝑞 è un numero intero chiamato Blum Integer 𝑝 e 𝑞 sono due numeri primi distinti con 𝑝 = 3 (mod 4) e 𝑞 = 3 (mod 4) Step eseguiti dall’algoritmo: 1. Vengono scelti due numeri primi casuali molto grandi (𝑝 e 𝑞) e si calcola il Blum Integer: 𝑛 = 𝑝𝑞 2. Viene scelto un numero casuale, 𝑠0 detto seme, primo con 𝑛 ed appartenente all’intervallo [1, 𝑛 − 1]. Si calcola allora 𝑥0 = 𝑠0 2 mod 𝑛 3. Per 𝑖 che va da 1 a 𝑙, con 𝑙 numero di generazioni da effettuare, si esegue: a. 𝑥𝑖 = 𝑥𝑖−1 2 mod 𝑛 b. Si calcola 𝑏𝑖 20 2.1.1 Esempio BBS: 𝑛 = 𝑝 ∙ 𝑞 = 7 ∙ 19 = 133 → 𝑠 = 100 𝑥0 = 1002 mod 133 = 25 → 𝑏𝑜 = 1 𝑥1 = 252 mod 133 = 93 → 𝑏1 = 0 𝑥2 = 932 mod 133 = 4 → 𝑏2 = 0 𝑥3 = 42 mod 133 = 16 → 𝑏3 = 1 𝑥4 = 162 mod 133 = 123 → 𝑏4 = 1 L’output sarà: [1, 0, 0, 1, 1] Questo algoritmo è poco efficiente nelle simulazioni in quanto potrebbe essere laborioso il calcolo dei numeri. Inoltre, la sequenza prodotta da questo algoritmo non è bilanciata (le frequenze con cui si verificano gli 0 e gli 1 non sono uguali). Tuttavia, è stato dimostrato che, questa non uniformità non è poi così differente dalle sequenze generate da un TRNG della stessa lunghezza. Per tale motivo si presta molto bene in ambito crittografico. 2.7 Fortuna Fortuna è un algoritmo di generazione di numeri pseudo-casuali creato da B.Schneier e N. Ferguson. Il nome deriva dalla Dea del caso e del destino nella mitologia Romana. Questo algoritmo tende a svincolarsi dal concetto di seme come visto finora. Il generatore si articola in tre parti: 1. Accumulatore di entropia: raccoglie dati provenienti da varie sorgenti esterne (es. tastiera, mouse, scheda audio ecc…) e li usa come seme del generatore. I dati provenienti dalle sorgenti esterne sono uniformemente distribuiti tra 32 pool chiamati, rispettivamente, 𝑃0 , 𝑃1 , … , 𝑃31 . In teoria, un singolo pool, potrebbe contenere infiniti dati e, se accumula sufficiente entropia, verrà aggiornato rinnovando così il seed del generatore. Sarà presente un contatore che tiene traccia del pool correntemente utilizzato per l’aggiornamento del seme del generatore. 21 [Fig. Fortuna’s 32 Entropy Pools] 2. Generatore: viene inizializzato con un seed proveniente dall’accumulatore di entropia e genera sequenze di lunghezza arbitrarie di numeri pseudo-casuali. Il generatore è realizzato tramite un cifrario a blocchi (ad esempio AES). Lo stato interno del generatore è caratterizzato da una chiave a 256-bit (quella proveniente dall’accumulatore) e da un contatore a 128-bit. Dopo ogni richiesta di dati casuali, si generano 256-bit supplementari e si utilizzano come nuova chiave (next key) del codice a blocchi al fine di rendere l’algoritmo crittograficamente sicuro. [Fig. Fortuna’s Generator Core] 3. Seed File Manager: una volta avviato l’algoritmo, si crea un seed file usato per memorizzare un certo quantitativo di dati casuali per inizializzare il generatore all’avvio 22 del dispositivo. Questo per far sì che l’algoritmo generi dati casuali sin dall’inizio, in quanto i livelli di entropia raccolto dall’accumulatore, all’avvio dell’algoritmo, non sono ancora sufficienti per la generazione di numeri random. Allo start-up il seed file è letto, immediatamente un seed è generato e scritto all’interno del file. Quindi se si riavvia il dispositivo, non bisogna attendere che le fonti di casualità generino un numero di eventi sufficiente ad effettuare il primo rinnovo del seme. Un tipico problema potrebbe sorgere nel momento in cui si verifica uno spegnimento anomalo della macchina. Si cerca allora di tenere sempre aggiornato il file del seme quando si accumula sufficiente entropia. E` consigliato aggiornare il file ogni 10 minuti circa ma questo dipende dal tipo di applicazione che si sta progettando e dalla velocità dell’accumulatore nel raccogliere entropia. Questo generatore riesce a produrre sequenze casuali di qualità molto alta ed inoltre è relativamente facile implementarlo. Ciò lo rende un ottimo candidato in tutte le applicazioni basate su crittografia. 23 Capitolo 3: TRNGs VS. PRNGs Finora abbiamo analizzato le tecniche di generazione di numeri casuali più diffuse, sia quelle basate su TRNG sia quelle basate su PRNG, cercando di porre in risalto i vantaggi e svantaggi di ogni tecnica. Lo scopo di questo capitolo è di mettere a confronto, anche sulla base di un esempio pratico, le più significative differenze tra le due famiglie di generatori. Si parte dal presupposto che un modo semplice per esaminare un generatore di numeri è, senza effettuare test statistici, mostrare una visualizzazione grafica dei numeri prodotti in quanto risulta più semplice dedurre qualcosa osservando semplicemente un’immagine. Questo approccio ovviamente non è esaustivo come l’insieme dei test statistici ma consente, rapidamente, di farsi un’idea su cosa si sta cercando di dimostrare. Sono state generate, a tal fine, due bitmap: una tramite il tool Bitmap Generator basato su un TRNG del sito web [15] e l’altra tramite un algoritmo implementato in C++ (basato dunque su un PRNG) mostrato in Fig.3.1. Il Bitmap Generator si avvale di un TRNG il quale utilizza, come sorgente, il rumore atmosferico. L’algoritmo implementato, invece, genera numeri casuali, nell’intervallo [0, 1], con l’ausilio della funzione rand() della libreria <cstdlib> del C++. La funzione rand() è inizializzata da un seme tramite la chiamata della funzione srand(). La bitmap è caratterizzata da uno sfondo bianco e nel caso in cui venga generato un 1 allora si va a colorare di nero un pixel all’interno della bitmap. Alla fine dell’algoritmo la bitmap è salvata su un file “PRNG_bitmap1.bmp”. Il programma è stato compilato col MinGW GCC ed eseguito sulla piattaforma Microsoft Windows 10 e processore AMD A8. 24 [Fig. 3.1 Codice sorgente del bitmap generator in C++] Una volta generate, le due bitmap, sono state messe a confronto Fig. 3.2 e Fig. 3.3 25 [Fig.3.2 Bitmap generata col Bitmap Generator] [Fig.3.3 Bitmap generata con la funzione rand() del C++] Come si può notare dalle immagini, la bitmap generata con C++/Windows presenta una certa correlazione tra i pixel rispetto a quella generata col Bitmap Generator. Questo dimostra la sostanziale differenza tra le due famiglie di generatori. Ovvero, a partire da un determinato seme, i PRNGs generano sequenze di numeri di bassa qualità e periodiche a differenza dei TRNGs. Inoltre cambiando il seme, ad es. srand(9), la bitmap generata sarà del tutto simile a quella in Fig.3.3 e la correlazione tra i pixel persiste. E` interessante notare che questo algoritmo genera una grande sequenza di numeri in pochissimo tempo (ovviamente la velocità di esecuzione varia sulla base di molti fattori). Nello specifico sono stati generati 262144 numeri in 0.043 s. Sulla base di tutte le osservazioni fatte si deduce allora che i PRNGs sono: Efficienti, perché riescono a produrre moltissimi numeri in tempi ridotti Deterministici, perché se si conosce lo stato iniziale, una certa sequenza di numeri può essere riprodotta in un secondo momento Periodici, perché le sequenze generate potrebbero ripetersi nel tempo. Anche se attualmente, con i moderni generatori, sono stati raggiunti periodi talmente lunghi che possono essere considerati aperiodici in diversi scenari applicativi. 26 D’altro canto, i TRNGs sono: Inefficienti, perché, paragonati ai PRNGs, necessitano di molto più tempo per produrre sequenze di numeri casuali Non deterministici, perché una certa sequenza di numeri non può essere riprodotta Aperiodici Queste caratteristiche sono riassunte nella tabella in Fig.3.4 [Fig. 3.4 Confronto tra PRNGs e TRNGs] 27 Capitolo 4: Conclusioni A questo punto è lecito porsi la seguente domanda: quale generatore, tra tutti quelli osservati, è il migliore? Ancora una volta la risposta a questa domanda è: dipende. La scelta di utilizzare uno specifico RNG consegue dal tipo di scenario applicativo e dai requisiti che bisogna soddisfare. Non è possibile, dunque, dire che una soluzione è migliore rispetto ad un’altra. Si può solamente dire che, a partire dai requisiti di progetto che bisogna soddisfare, una soluzione potrebbe essere più adatta rispetto ad un’altra. Quindi, avendo analizzato gli aspetti più significativi delle due famiglie di generatori è possibile affermare che: I PRNGs sono adatti in tutte quelle applicazioni che richiedono, in tempi ridotti, grandi sequenze di numeri e una certa periodicità come ne caso della generazione di sequenze di spreading nelle tecniche spread spectrum come, ad esempio, frequency hopping. I TRNGs sono utili in tutte le applicazioni che richiedono una certa qualità di sequenze generate. Sono utilizzati in particolar modo nel campo della crittografia in quanto la robustezza dei sistemi crittografici è determinata dalla loro capacità di generare, tramite un RNG, una keystream non predicibile e non riproducibile. I TRNGs sono però difficili da progettare, da integrare e sono costosi. Per questi motivi, in ambito crittografico sono stati proposti i così detti CSPRNGs i quali, nonostante siano classificati come PRNGs, soddisfano i requisiti di sicurezza. 28 Soluzioni alternative ed innovative sono rappresentate dagli Hybrid Random Number Generator – HRNG in Fig. 4.0. Questa soluzione è osservata con grande interesse dagli studiosi in quanto potrebbe risolvere numerosi problemi in termini di qualità di sequenze e velocità di generazione. [Fig. 4.0 Implementazione più popolare di un Hybrid RNG] Infatti si cerca di combinare i TRNGs con i PRNGs tra di loro: si genera un seme con un TRNG, questo seme va ad inizializzare un PRNG in modo da avere un generatore che produce sequenze puramente casuali (grazie al rinnovo periodico del seme col TRNG) generate in modo estremamente rapido (grazie all’algoritmo efficiente del PRNG). 29 Bibliografia [1] Craig S. Petrie and J. Alvin Connelly, A Noise-Based IC Random Number Generator for Applications in Cryptography, IEEE Transactions on Circuits and Systems — I: Fundamental Theory and Applications, VOL. 47, NO. 5, 05/2000 [2] Benjamin Jun and Paul Kocher, The Intel ® Random Number Generator, Cryptography Research, Inc. White Paper Prepared For Intel Corporation, 22/04/1999 [3] V. Kote, V. Molata, J. Jakovenko1, Improved Structure of True Random Number Generator with Direct Amplification of Analog Noise, 2012 [4] G. Bucci and R. Luzzi, "Design of Testable Random Bit Generators," in Cryptographic Hardware and Embedded Systems – CHES 2005, 7th International Workshop, Edinburgh, Scotland, August 29 – September 1, 2005, Proceedings, ser. Lecture Notes in Computer Science, J. R. Rao and B. Sunar, Eds., vol. 3659. pp. 147 – 156, Springer, 2005. [5] Dries Schellekens, Bart Preneel, and Ingrid Verbauwhede, FPGA Vendor Agnostic True Random Number Generator [6] Hamid Nejati, Ahmad Beirami, and Warsame H. Ali, Discrete-Time Chaotic-Map Truly Random Number Generators: Design, Implementation, and Variability Analysis of the Zigzag Map, 5/06/2012 [7] Wikipedia, https://it.wikipedia.org/wiki/Generatore_lineare_congruenziale, 07/04/2016 [8] Srinivas Aluru1, Lagged Fibonacci Random Number Generators for Distributed Memory Parallel Computers, Journal of Parallel and Distributed Computing 45, 1–12-1997 article no. PC971363 [9] Wikipedia, https://en.wikipedia.org/wiki/Mersenne_Twister, 08/04/2016 30 [10] http://www.math.sci.hiroshima-u.ac.jp/~m-mat/eindex.html , 19/04/2016 [11] Thomas W. Cusick, Properties of the x2 mod N Pseudorandom Number Generator, IEEE Transaction on Information Theory, vol. 41, no. 4, July 1995 [12] Wikipedia, https://it.wikipedia.org/wiki/Fortuna_(PRNG), 09/04/2016 [13] Robert McEvoyt, James Curran, Paul Cotter, and Colin Murphyt, Fortuna: Cryptographically Secure Pseudo-Random Numnber Generation In Software And Hardware, 28/06/2006 [14] https://www.random.org/ , 21/04/2016 [15] N. M. Thamrin1, G. Witjaksono , A. Nuruddin , M. S. Abdullah, An Enhanced Hardware-based Hybrid Random Number Generator for Cryptosystem 31