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:
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:
- 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:
Esempio di TRNG Hardware: Intel Digital Random Number Generator (DNRG)
- DNRG è il TRNG disponibile sui processori Intel.
- Può essere utilizzato per ottenere:
Confronto TRNG vs. PRNG:
| Caratteristica | PRNG | TRNG |
| Efficienza | Alta (algoritmi software, veloci una volta ottenuto il seed). | Bassa (dipende dall'acquisizione di rumore fisico, più lento). |
| Algoritmo | Deterministico (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). |