Tutorials

12. Numeri Casuali in Crittografia

La generazione di numeri casuali è una necessità fondamentale in numerosi contesti crittografici, essendo alla base della sicurezza di molti algoritmi. I numeri casuali sono essenziali per la generazi

La generazione di numeri casuali è una necessità fondamentale in numerosi contesti crittografici, essendo alla base della sicurezza di molti algoritmi.

Necessità di Numeri Casuali in Crittografia:

I numeri casuali sono essenziali per la generazione di:

  • Chiavi per cifrari simmetrici
  • Chiavi per cifrari asimmetrici (pubbliche e private)
  • Chiavi per MAC (Message Authentication Code)
  • IV (Vettori di Inizializzazione)
  • Nonce (numeri usati una sola volta)
  • Altri parametri crittografici.

Proprietà dei "Buoni" Numeri Casuali per la Crittografia:

Affinché un numero casuale sia considerato "buono" e possa essere utilizzato in algoritmi crittografici senza abbassare il livello di sicurezza, deve possedere due proprietà fondamentali:

1. Randomicità:

I bit che compongono il numero devono essere randomici secondo precisi criteri statistici:

  • Distribuzione Uniforme: La frequenza con cui appaiono zeri e uni deve essere approssimativamente la medesima. Ciò significa che ogni bit ha una probabilità del 50% di essere 0 o 1.
  • Indipendenza: Nessuna parte della sequenza di bit deve poter essere dedotta o inferita partendo da altre parti della stessa sequenza. Ogni bit deve essere indipendente dai precedenti.

2. Imprevedibilità:

Ogni numero generato deve essere statisticamente indipendente dagli altri numeri generati, sia precedenti che successivi. La conoscenza di uno o più numeri casuali già generati non deve permettere di prevedere altri numeri. Questo implica:

  • Imprevedibilità in Avanti (Forward Secrecy): Non deve essere possibile determinare i prossimi numeri che saranno generati, anche se si conosce lo stato interno del generatore in un certo momento.
  • Imprevedibilità all'Indietro (Backward Secrecy): Non deve essere possibile determinare i numeri che sono stati generati prima, anche se si conosce lo stato interno attuale del generatore.

Categorie di Generatori di Numeri Casuali:

I generatori di numeri casuali si dividono in due categorie principali:

1. True Random Number Generator (TRNG) - Generatori di Numeri Casuali Veri:

  • Un TRNG non utilizza un algoritmo per la generazione del numero random.
  • Utilizza invece un processo fisico intrinsecamente randomico, che viene acquisito e convertito in sequenze binarie (questa fonte è detta sorgente di entropia).
  • È necessaria la presenza di un hardware dedicato in grado di acquisire la sorgente di rumore randomico.
  • Esempi di Sorgenti di Entropia:
- Rumore elettrico (es. rumore termico in resistori). - Rumore radio. - Clock drift (piccole variazioni imprevedibili nei tempi dei clock del computer). - Movimenti del mouse, battiture sulla tastiera, attività del disco rigido (in alcuni contesti, sebbene meno "pure").

2. Pseudo Random Number Generator (PRNG) - Generatori di Numeri Pseudo-Casuali:

  • Un PRNG utilizza un algoritmo deterministico che acquisisce in input un valore iniziale (detto seed) e genera in output una sequenza di numeri che appaiono casuali.
  • A parità di seed, l'output non cambia. Questo significa che se si parte dallo stesso seed, si otterrà sempre la stessa sequenza di numeri.
  • È fondamentale che il seed sia ottenuto in modo randomico per garantire l'imprevedibilità della sequenza. Il seed può essere generato:
- Tramite un TRNG. - Tramite un altro PRNG (ma questo richiede un seed iniziale molto robusto). - Tramite un generatore di numeri casuali (RNG) più generico.
  • L'algoritmo deterministico viene iterato un certo numero di volte per produrre la sequenza.
  • I PRNG utilizzati in crittografia sono specificamente chiamati Secure PRNG (SPRNG) o Cryptographically Secure PRNG (CSPRNG), in quanto sono progettati per superare i test di randomicità e imprevedibilità richiesti per applicazioni crittografiche.

Implementazione dei PRNG:

L'implementazione di un PRNG può usare:

  • Algoritmi Specifici: Progettati appositamente per lo scopo di generare numeri pseudo-casuali crittograficamente sicuri.
  • Algoritmi Generici Crittografici: Algoritmi già esistenti e robusti, come:
- Cifrari a chiave asimmetrica. - Cifrari a chiave simmetrica (es. AES in modalità CTR o OFB). In questo caso, il seed (es. di 256 bit per AES) può essere diviso in due parti: una parte come chiave (K) e l'altra come contatore/vettore di inizializzazione (V). - Funzioni hash.

Esempio di TRNG Hardware: Intel Digital Random Number Generator (DNRG)

  • DNRG è il TRNG disponibile sui processori Intel.
  • Può essere utilizzato per ottenere:
- Numeri casuali (RDRAND) direttamente. - Seed da utilizzare in PRNG (RDSEED), fornendo una fonte di entropia di alta qualità.

Confronto TRNG vs. PRNG:

CaratteristicaPRNGTRNG
EfficienzaAlta (algoritmi software, veloci una volta ottenuto il seed).Bassa (dipende dall'acquisizione di rumore fisico, più lento).
AlgoritmoDeterministico (produce la stessa sequenza con lo stesso seed).Non utilizza un algoritmo (si basa su processi fisici).
PeriodicitàSì (la sequenza si ripete dopo un certo periodo, anche se molto lungo per CSPRNG).No (non c'è una ripetizione prevedibile, è intrinsecamente non periodico).