Per tutte le attività sensibili in Internet, la crittografia è obbligatoria. La comunicazione con il server deve essere sicura quanto l'archiviazione dati.
La crittografia, ovvero la scienza della comunicazione segreta, è la risposta al problema. L'etimologia della parola "crittografia" indica che essa deriva dall'unione di due parole greche: "critto", che significa "nascosto" o "segreto", e "grafia" che indica un processo di disegno, scrittura o descrizione.
Con la nascita delle scommesse online e delle esigenze di sicurezza in Internet, la crittografia è diventata un argomento dalle molteplici sfaccettature. L'utilizzo della codifica come processo o algoritmo per segretare i contenuti è soltanto una delle funzioni della crittografia. Oltre a questo, la crittografia deve essere in grado di offrire protezione contro gli intercettatori, gli attacchi chosen-plain text e gli attacchi chosen-cipher text, come pure garantire quanto segue:
la riservatezza: definita come il tentativo di mantenere il segreto.
l'integrità: un modo per confermare che i dati non sono corrotti.
l'autenticazione: un modo per verificare che il dispositivo con il quale si sta comunicando è effettivamente quello che dichiara di essere e non un aggressore.
l'autorizzazione: l'adeguata concessione di un permesso per fare qualcosa.
La crittografia moderna è stata sviluppata dopo la 2a guerra mondiale. Nel 1949, Claude Shannon concettualizzò le informazioni che stanno dietro alla sicurezza teorica. Il suo principio di base era questo: un testo cifrato deve essere tale da non rivelare alcuna informazione riguardo al testo in chiaro. In matematica, si scrive così:
La segretezza perfetta di Shannon
∀ messaggi m0 e m1 ϵ M (spazio di tutti i messaggi) come la lunghezza(m0) = lunghezza(m1) e ∀ c ϵ C (spazio di tutti i testi cifrati)
Pr[E(k, m0) = c] = Pr[E(k,m1) = c]
in cui k è uniforme in K (spazio di tutte le chiavi)
In altre parole, in un determinato testo cifrato un aggressore non sa stabilire se il messaggio cifrato sia m0 o m1 per tutti i possibili messaggi m0 e m1, quindi anche l'avversario più potente non riesce a scoprire nulla riguardo al testo in chiaro dal testo cifrato e quindi non è possibile alcun attacco al testo cifrato.
Nel nostro mondo digitale, la crittografia viene effettuata tramite i computer. La funzione logica XOR è il building block di base degli algoritmi crittografici in virtù di una importante proprietà di cui dispone, espressa dal seguente teorema:
Se Y è una variabile casuale su {0,1}n e X è una variabile uniforme indipendente su {0,1}n allora Z = Y XOR X è una variabile uniforme su {0,1}n
Ciò impedisce l'analisi di frequenza che costituiva il punto debole dei metodi utilizzati fino alla metà del 20o secolo.
L'algoritmo One Time Pad
L'algoritmo One Time Pad prende un messaggio m e una chiave k (la lunghezza di m e quella di k sono uguali) e XOR m e k. Purtroppo, per ottenere la segretezza perfetta, la chiave non deve essere più lunga del messaggio, (|K| > |M|), il che nella pratica è quasi impossibile. In effetti, se ci sono due messaggi criptati con la stessa chiave k, l'applicazione della funzione logica XOR a questi due testi cifrati produce come risultato m1 XOR m2, quindi una semplice analisi statistica di questo risultato consentirà di scoprire parecchie informazioni sul testo in chiaro.
Per rendere pratico l'OTP, la chiave casuale viene sostituita da una chiave "pseudo-casuale" con la seguente comprensione: conoscendo tutte le chiavi precedentemente generate, c'è soltanto una lieve probabilità (≤1/280) di scoprire la nuova chiave. Inoltre, invece della perfetta uguaglianza utilizzata per descrivere la segretezza perfetta di Shannon, noi diciamo di avere una sicurezza semantica se 2 testi cifrati hanno distribuzioni indistinguibili, quindi anche in questo caso stiamo parlando di probabilità. La generazione di chiavi è la pietra angolare della buona sicurezza. Come mostrato dal protocollo WEP, una scelta sbagliata della chiave distrugge la sicurezza.
Il WEP non è sicuro in quanto la lunghezza di IV (Initial Vector, vettore iniziale) è di 24 bit, il che significa che la stessa chiave viene utilizzata circa una volta ogni 16 milioni di frame. Inoltre, le chiavi sono correlate; la chiave per il frame 1 è 1||k, la chiave per il frame 2 è 2||k. Inoltre, IV viene reimpostato a 0 dopo un power cycle, quindi un aggressore può recuperare la chiave dopo soli 40.000 frame, il che è assolutamente poco sicuro nel clima odierno. Per superare questa debolezza, in un traffico di rete, deve essere negoziata una nuova chiave per ogni sessione. Nei moderni cifrari a flusso, per generare la chiave si utilizzano un seme + un Nonce (un valore che non si ripete per una data chiave) e la coppia (seme, Nonce) non si utilizza mai più di una volta. I più noti tra questi cifrari a flusso sono l'RC4, il Salsa o il Sosemanuk.
Occorre tenere presente che l'OTP va bene per la comunicazione all'interno della rete, ma non è adatto all'archiviazione dati. In effetti l'OTP non presenta integrità in quanto è malleabile: ciò significa che la modifica del testo cifrato non viene rilevata e produce un impatto prevedibile sul testo in chiaro.
Cifrari a blocchi
I cifrari a blocchi costituiscono un'altra forma di approccio alla cifratura. La loro implementazione è più complessa e lenta rispetto a quella dei cifrari a flusso, ma risultano più solidi e in grado di superare le problematiche poste dai cifrari a flusso. A differenza dei cifrari a flusso, i cifrari a blocchi sono un blocco fisso di n bit che viene cifrato per creare un testo cifrato di n bit. Quando un messaggio è inferiore a n bit, è necessario operare sullo stesso per raggiungere n bit. AES e RSA sono i più comuni standard di cifratura dei cifrari a blocchi.
Per i cifrari a blocchi sono disponibili due modalità d'esercizio: la modalità CBC (Cipher Block Chaining) e la modalità CTR (Counter). Ogni modalità necessita di un IV (Initial Vector) per avviare la codifica, ma poi l'implementazione differisce. La modalità CBC procede con un'implementazione seriale, a differenza della modalità CTR che prevede un'implementazione parallela.
Qui abbiamo una cifratura con la modalità CBC: viene scelto un IV casuale, poi si utilizza l'output di ciascun blocco per cifrare quello successivo.
Qui abbiamo una cifratura con la modalità CTR: F è una funzione pseudo-casuale e IV è casuale per ogni messaggio e viene incrementato per ogni blocco. F può essere applicato in parallelo a ogni blocco.
Tutti questi metodi sono efficaci contro gli intercettatori e ai fini della riservatezza, tuttavia nessuno può garantire l'integrità, l'autenticazione e la protezione contro gli attacchi attivi.
Codice di autenticazione del messaggio
L'integrità del messaggio si basa sul MAC (Message Authentication Code, codice di autenticazione del messaggio) Viene generato un tag sulla base del messaggio m e della chiave k. Una volta che il destinatario riceve il messaggio, può effettuare una verifica del tag il cui risultato è sì o no. Il calcolo MAC utilizza una PRF (Pseudorandom Function, funzione pseudo-casuale) quindi un aggressore non può produrre un tag valido per un nuovo messaggio. L'integrità richiede una chiave segreta e non deve essere confusa con un CRC (Cyclic Redundancy Code, codice di ridondanza ciclica) che è stato messo a punto per rilevare gli errori casuali, non dolosi.
I cifrari a flussi e i cifrari a blocchi consentono la riservatezza (in altre parole sono efficaci contro l'intercettazione ma non contro gli attacchi attivi) e il MAC garantisce l'integrità ma non la riservatezza. Tuttavia, se il MAC viene eseguito su un testo cifrato, si ottiene una cifratura autenticata. Gli aggressori non possono creare nuovi testi cifrati che si decriptino correttamente. È quindi possibile assicurare l'integrità, l'autenticazione e l'autorizzazione.
Tutti questi metodi utilizzano la stessa chiave per il mittente e il destinatario e vengono denominati cifrature simmetriche. Abbiamo dato per scontato che le chiavi venissero scambiate prima dell'inizio della comunicazione, ma nell'odierno mondo connesso a Internet, molte persone devono scambiarsi dati senza conoscersi, quindi non possono scambiarsi le chiavi prima. La cifratura asimmetrica è la soluzione a questo dilemma. Il protocollo Diffie-Hellman ci aiuta a spiegarlo:
Se p è un numero primo grande, g un intero in {1,…,p} and x is chosen randomly in {1,…, p-1}, conoscendo il risultato, non c'è nessun algoritmo efficiente noto per calcolare x. Quindi, con due numeri x e y, è molto facile effettuare un'operazione esponenziale che dia una chiave, ma è molto difficile invertire l'operazione per scoprire la chiave.
g^(x^y ) (mod p)=g^(y^x ) (mod p)= g^xy (mod p) = Chiave da utilizzare per la cifratura
Se Alice e Bob vogliono condividere una chiave e c'è un intercettatore tra loro, per effettuare la condivisione si procede come segue:

Vi sono anche alcune varianti Diffie-Hellman, come la risoluzione di una curva ellittica come segue y² = x³ + ax + b.
Alla fine, malgrado tutti questi sforzi, non c'è un modo garantito per comunicare in assoluta sicurezza. Il teorema di Shannon dimostra la sicurezza perfetta da un punto di vista teorico, ma sotto il profilo pratico, gli attacchi "side channel" (attacchi a canale laterale) possono rivelarsi molto potenti. Uno dei migliori esempi di attacco "side channel" ebbe luogo nel 2013, quando i ricercatori riuscirono a craccare la cifratura più solida del mondo ascoltando i suoni a frequenze alte (da 10 a 150kHz) emessi dalla CPU di un computer durante la decrittazione di un algoritmo RSA-4096. Daniel Genlin, Adi Shamir ed Eran Tromer riuscirono a produrre una chiave di decrittazione utilizzando questo tipo di sconosciuto, impossibile da prevedere.