MegaLab.it
Stampa Articolo
Aperiodico gratuito di informatica
 
20080829205646

L'accumulatore in un PRNG crittografico

a cura di Mariano Ortu
31/10/2013 - articolo
Sicurezza - L'accumulatore e le fonti entropiche in un PRNG crittograficamente forte.

Nel corso di questa esposizione, vedremo il ruolo dell'accumulatore all'interno di un PRNG crittograficamente forte. Come già spiegato nel precedente articolo, l'accumulatore è un raccoglitore di dati casuali reali che garantisce il rinnovo del seme attingendo dalle varie fonti entropiche presenti nel sistema.

Accumul1.jpg

Accumulatore e fonti di entropia

Diamo per scontata la presenza, all'interno del sistema, di svariate fonti di entropia, siano esse interne o provenienti dall'ambiente esterno. Queste, in ogni momento, potranno e dovranno generare eventi ricchi di casualità, garantendo, indipendentemente dal tipo di fonte, che almeno una sia in grado di produrre dati non prevedibili per un malintenzionato.

Siccome non è possibile prevedere un eventuale attacco, è buona regola convertire l'imprevedibilità in una sorgente di casualità. All'interno di un sistema è possibile reperire le seguenti fonti di entropia, presumendo che siano ragionevolmente efficaci e quindi adatte per il lavoro dell'accumulatore:

Se si riuscisse a convertire in entropia l'insieme delle fonti descritte, è possibile vanificare qualsiasi attacco volto a carpire lo stato interno del PRNG. Chiaramente l'implementazione di tale accorgimento non risulta affatto agevole, le fonti in oggetto dovranno essere sovrintese a livello hardware e non sempre l'utente potrà gestirle in modo diretto.

Accumul2.jpg

Per meglio affrontare il problema ricorriamo a degli identificatori che avranno riscontro in un numero univoco referenziato nell'intervallo compreso tra 0 e 255, demandando agli implementatori il compito di allocare suddetti numeri in modo dinamico oppure statico. Nel caso specifico ciascun evento si compone in una breve sequenza di byte all'interno della quale transitano esclusivamente dati imprevedibili, come ad esempio le oscillazioni cronometriche di un timer che possono essere rappresentate in 2 o 4 byte tra i meno significativi.

È indispensabile altresì associare gli eventi provenienti dalle varie fonti in una stringa interpretabile che codifichi gli eventi medesimi in modo univoco, pertanto questi verranno definiti in 3 o più byte di dati, nel modo seguente:

Ci si rammenti, come già spiegato, che un malintenzionato può essere a conoscenza degli eventi prodotti da alcune fonti, quindi, per pianificare la nostra strategia, diamo per scontato che l'attaccante controlli alcune delle fonti in oggetto, è in grado di selezionare gli eventi da generare ed ha capacità ad interpellare i dati casuali del PRNG ogni qualvolta lo ritenga opportuno.

Variazione del seme

Per poter eseguire la variazione del seme è necessario accorpare gli eventi in un nucleo talmente esteso da poter vanificare i possibili tentativi volti ad enumerare gli eventuali valori di output, infatti un nucleo ben nutrito è in grado di offuscare completamente le informazioni possedute da un malintenzionato in merito allo stato del generatore.

Uno dei problemi legati a questa tecnica era dovuto al fatto che, in fase progettuale, non si è a conoscenza della quantità di eventi da associare ad un nucleo anticipatamente rispetto alla variazione del seme. La nuova generazione di PRNG ha risolto tale incombenza nel modo che segue.

Supponiamo la realizzazione di 32 nuclei di eventi denominati N0... N31 ed aventi ciascuno, al proprio interno, una stringa di byte con illimitata estensione: questa verrà impiegata come input di una funzione hashing e le implementazioni non dovranno immagazzinare suddetta stringa ma potranno calcolare l'hash man mano che questa viene inglobata nel nucleo, quindi in modo incrementale. Ogni fonte entropica sarà in tal modo sollecitata a distribuire ciclicamente gli eventi casuali nei vari nuclei disponibili, garantendo in tal modo l'uniformità dell'assegnazione e così ogni evento sarà accorpato alla stringa del nucleo in esame.

Accumul3.jpg

Il generatore riceverà un seme ex novo ogni qualvolta che il nucleo N0 disporrà di soddisfacente estensione. Le variazioni del seme saranno numerate semplicemente come 1, 2, 3, 4, ... e quindi, in base alla variazione del numero r, saranno inclusi uno o più nuclei. Per quanto sopra esposto il nucleo Ni sarà quindi incluso, a condizione che 2^i risulti un divisore di r, pertanto N0 sarà presente ad ogni variazione, N1 ad intervalli di 1, N2 ogni 4 variazioni e via discorrendo. Quando il nucleo viene inglobato in una variazione riceverà una stringa vuota ed in conseguenza riazzerato.

Il sistema descritto, per la sua intrinseca versatilità, è alquanto adattabile alle svariate situazioni che possono manifestarsi durante un attacco: se un malintenzionato possedesse informazioni esigue sulle fonti entropiche, non sarà chiaramente in grado di presumere N0 in una successiva variazione. È possibile che l'hacker disponga di una conoscenza approfondita sulle fonti di casualità o essere addirittura in grado di produrre eventi fraudolenti correlati. Se ciò accadesse significa che l'attaccante dispone della conoscenza necessaria nei confronti di N0 ed è pertanto in grado di ristrutturare il nuovo stato del generatore sulla falsariga del precedente e dei suoi output.

A tutela del generatore, quando viene utilizzato N1 in una variazione del seme, subentra però il fatto che la quantità dei dati non presumibili raddoppia e quindi, nel caso di N2 risulterà quadrupla. In questo modo, seppure un hacker possedesse la conoscenza di svariati eventi o possa produrne di suoi, l'esistenza di una sola fonte entropica non ipotizzabile darebbe vita ad un nucleo di dati casuali in grado di contenere e respingere l'attacco.

Accumul4.jpg

È importante, in questo frangente, capire con quale velocità viene ripristinato lo stato compromesso di un generatore: ciò dipende dalla velocità d'introduzione, rispetto all'attaccante, dell'entropia nei nuclei. Diamo per scontato una velocità ρ, dopo t secondi si ha un totale di ρt bit di entropia ed ogni nucleo potrà usufruire di circa ρt / 32 bit nell'intervallo di tempo in analisi. Il malintenzionato non sarà in grado di seguire lo stato se il generatore potrà avvalersi di un seme ex novo ricevuto da un nucleo avente oltre 128 bit di entropia. Siamo quindi al cospetto di due distinti casi:

Supponiamo adesso t come periodo di tempo che intercorre tra due variazioni del seme, il nucleo Ni acquisisce (2^i)ρt / 32 bit di entropia e viene utilizzato in uno di essi ogni (2^i) t secondi. Il risanamento del sistema inerente una situazione critica avverrà al primo rinnovo del seme con il nucleo che interpreta 128 ≤ (2^i) ρt / 32 < 256 con il limite superiore derivante dal fatto che, diversamente, il nucleo Ni-1 avrebbe al suo interno 128 bit di entropia tra le variazioni del seme. La disequazione conduce pertanto a:

( (2^i) ρt / 32) < 256 ed infine (2^i) t < (8192 / ρ)

Ciò significa che il periodo intercorso tra i punti di risanamento del sistema, (2^i) t è direttamente proporzionale al tempo indispensabile ad acquisire 2^13 bit di entropia, quindi 8192 / ρ. In apparenza esagerato, 2^13 trova spiegazione nella necessità di almeno 2^7 bit per ripristinare il sistema compromesso. Potrebbe accadere, nella circostanza, che il seme venga aggiornato prima che si riesca ad acquisire 2^7 in un dato nucleo e venga utilizzato il successivo che accorperà 2^8 bit prima del nuovo aggiornamento. Concludiamo suddividendo i dati in 32 nuclei, addizioniamo in tal modo un ulteriore fattore che rientra nell'ordine di 2^5. La soluzione analizzata è sicuramente accettabile e rientra in un fattore di -64 rispetto ad una strategia ottimale: questi permane costante, garantisce una situazione entro i limiti della sicurezza e consente un'ottima strategia di risanamento qualora si verifichino degli attacchi. Altro vantaggio è dato dal fatto che non si ha necessità a conoscere la quantità di entropia contenuta negli eventi e tantomeno misura e qualità delle informazioni a disposizione dei malintenzionati.

Accumul5.jpg

Esiste la possibilità, alquanto remota, che anche il nucleo N31 possa non acquisire sufficiente casualità tra le variazioni del seme indispensabili al risanamento del sistema compromesso: ciò è reso possibile se l'attaccante introducesse tanti eventi casuali da costringere le 2^32 variazioni del seme a verificarsi prima che le fonti casuali generino i 2^13 bit di casualità. Alfine di rimediare ad una situazione del genere è necessario ridurre la velocità delle variazioni del seme, pertanto, queste avverranno in una porzione di tempo pari a 100 ms., contenendole in tal modo a 10 per secondo. Lo stratagemma implica che saranno necessari almeno 13 anni prima di poter utilizzare, qualora esistesse, N32. Tale lasso di tempo rende quindi fattibile limitare il numero dei nuclei a 32!

Mariano Ortu vi saluta dalla terra dei nuraghi!

MegaLab.it rispetta la tua privacy. Per esercitare i tuoi diritti scrivi a: privacy@megalab.it .

Copyright 2008 MegaLab.it - Tutti i diritti sono riservati