In questo articolo dedicato alla serie sulle reti di elaboratori, parliamo brevemente della sicurezza delle comunicazioni.
La sicurezza delle comunicazioni, si preoccupa di tre campi:
- Riservatezza (o confidenzialità): Solo mittente e destinatario dovrebbero poter capire il contenuto dei messaggi che si scambiano.
- Autenticazione: Il mittente e destinatario dovrebbero essere sicuro delle rispettive identità.
- Integrità del messaggio: Gli interlocutori devono avere la certezza che i loro messaggi non vengano alterati durante la trasmissione.
Di fatto, un malintenzionato può:
- Spiare la conversazione
- Aggiungere messaggi
- Sovraccaricare un sistema
- Dirottare una sessione e sostituirsi ad un interlocutore
- Negare un servizio
- Impersonare un’altra persona
Attacchi passivi e Attacchi attivi
Possiamo suddividere i tipi di attacchi, in attivi e passivi.
Gli attacchi passivi sono quello che si preoccupano di intercettare o monitorare le trasmissioni. Fra le altre cose, si occupano di intercettare il contenuto dei messaggi ed analizzare il traffico della rete.
Per la loro natura, gli attacchi passivi sono difficili da rilevare perchè di fatto non comportano alcuna modifica del traffico. Per difendersi da questo tipo di attacchi, si utilizzata la crittografia (che vedremo fra poco).
Gli attacchi attivi invece, sono quelli che prevedono una modifica del flusso dei dati o la creazione di un falso flusso. E’ necessario rilevarli e recuperare qualsiasi alterazione.
Per cercare di prevenire questo genere di attacchi, possiamo riuscere a proteggersi (solo per alcuni di essi) anche in questo caso implementando la crittografia.
Rispondiamo quindi alla domanda: che cos’è la crittografia?
Crittografia
La crittografia è la scienza che si occupa dello studio delle scritture “segrete” (significato della parola crittografia dal greco).
E’ nata come una branca della matematica e dell’ informatica grazie all’ utilizzo di tecniche di teorie dei numeri e di teoria dell ‘informazione.
A causa del continuo avanzamento delle capacità di calcolo, la crittografia è una scienza in continua espansione che cerca di aumentare sempre la difficoltà di decriptazione.
La crittografia si basa su un Cifrario. Esso è un sistema, di qualsiasi tipo, in grado di trasformare un testo in chiaro (plaintext) in un testo non leggibile (testo cifrato o crittogramma).
Esistono due sistemi di cifratura:
- Sistemi a chiave simmetrica: In questo caso, la chiave per la cifratura e decifratura è la stessa e può essere usata per una comunicazione bidirezionale (da quì il termine “simmetrica”).
- Sistemi a chiave asimmetrica: Si utilizza in questo sistema una coppia di chiavi, associate al destinatario. A prende il messaggio da inviare a B, lo cripta con la chiave pubblica di B e glie lo invia in un canale non sicuro (es. la rete internet). Una volta arrivato il messaggio, B utilizza la sua chiave privata per decriptarlo e leggerlo.
Il secondo sistema utilizza una comunicazione unidirezionale, ovvero c’è bisogno di una coppia di chiavi per ogni interlocutore.
Crittografia a chiave simmetrica
- Per cifrare il messaggio, è necessario un algoritmo di cifratura e una chiave simmetrica condivisa.
- Per decifrare il messaggio è necessario un algoritmo di decifratura, e la chiave simmetrica condivisa.
Prima di continuare, un pò di notazioni:
- P: Testo in chiaro (o plaintext)
- C: Testo cifrato (ciphertext)
- k: Chiave
- Ek(x): Algoritmo di cifratura
- Dk(x): Algoritmo di decifratura
- Cifratura: C=Ek(P)
- Decifratura: P=Dk(C)
Mentre gli algoritmi di decifratura e cifratura sono pubblici, la chiave deve rimanere privata.
Cifrario a sostituzione monoalfabetico
In questo tipo di cifrario, ogni carattere del plaintext viene sempre sostituito dallo stesso carattere nel testo cifrato, indipendentemente dalla sua posizione nel testo.
Un esempio di questo tipo di cifrario, è il Cifrario di Cesare.
Questi cifrari a scorrimento monoalfabetico, come è spiegato anche nell’ articolo del cifrario di cesare, è vulnerabile ad attacchi a forza bruta ovvero programmi che ricercano esaustivamente tutte le possibili chiavi.
Lo spazio delle chiavi è estremamente limitato: 25 chiavi (la chiave 0 è inutile perchè il testo cifrato risulta uguale a quello in chiaro).
Per risolvere questo problema, potremmo fare il mapping fra ciascun carattere del testo in chiaro e un corrispondente carattere nel testo cifrato.
Ovvero ogni carattere dell’ alfabeto viene associato con un carattere a caso: questo fà si che ogni permutazione dell’ alfabeto costituisca una chiave (26!).
Un’altro tipo di attacco a cui questo sistema è debole, è la determinazione della frequenza relativa delle lettere e confrontarla con la frequenza standard delle lettere della lingua in questione.
Cifrario a sostituizione polialfabetico
Volendo, le diverse occorrenze dello stesso carattere possono corrispondere a un sostituto differente.
Sistemi di chiavi k=(k1, k2, k3….) dove ki viene utilizzata per codificare l’ i-esimo carattere del testo in chiaro.
Quindi per cifrare facciamo:
Ci = (Pi + ki) mod 26
Pi = (Ci – ki) mod 26
Cifrario a trasposizione
Questo tipo di cifrario, consiste non nel sostituire i simbolo del messaggio ma scambiarli di posizione.
Si creano blocchi di parole (tipo n lettere mod 7) e si scambiano le colonne di posizione. La chiave è costituita dalla posizione iniziale di ogni colonna.
Cifrari moderni
Quando si parla di computer, è più facile crittografare un documento (che può essere un immagine, un file di testo, audio, video ecc) trattandolo a livello di bit.
Infatti ad esempio per quanto riguarda i caratteri, operando a livello di bit abbiamo 8 bit per carattere da criptare aumentando di molto la sicurezza.
Inoltre, i cifrari si dividono in:
- Cifrari a flusso, cifrano un flusso di bit
- Cifrari a blocchi, cifrano un blocco di n bit per volta con una chiave di k bit
Cifrari a blocchi
Un cifrario a blocchi ricorre al padding in caso il blocco da criptare abbia meno di n bit, ed è una combinazione di diverse unità:
- Permutazione: Permuta i bit (ne cambia l’ordine). Può essere diretta (presi n bit, ritorna una sequenza di n bit), ad espansione (presi n bit, ritorna una sequenza maggiore di n bit) o compressione (presi n bit, ritorna una sequenza minore di n bit).
- Sostituzione,
- Xor,
- Scorrimento: verso sinistra e verso destro (shift left o shift right),
- Scambio: Scambia la posizione a blocchi di bit (es: la metà sinistra con la metà destra)
- Suddivisione: separa un blocchi in blocchi separati,
- Unione: unisce due blocchi separati in uno solo
Un esempio di cifrario a blocchi molto famoso è il DES
DES: Data Encryptation Standard
Il DES è un cifrario molto potente, basato su una cifratura a blocchi, che riceve un blocco da 64 bit di testo in chiaro e produce un blocco di 64 bit di testo cifrato.
La chiave, a 56 bit, viene utilizzata sia per la cifratura che per la decifratura: il DES è infatti un cifrario a chiave simmetrica.
In pratica, preso questo blocco da 64 bit, il DES esegue inizialmente una permutazione diretta del blocco.
Dopo di che, esegue per 16 volte queste operazioni (round) :
- Divide il blocco in due sottoblocchi da 32 bit
- Preso il lato destro, lo cripta con una funzione usando la Ki-esima (vedremo dopo da dove viene) chiave a 48 bit
- Col risultato, esegue lo XOR con il lato sinistro
- Il risultato dello XOR lo inserisce nel risultato sul lato destro, sul lato sinstro inserisce la parte di destra presa in input dalla fase precedente.
Eseguite queste operazioni per 16 volte, esegue una ulteriore permutazione prima di restituire il blocco cifrato.
La funzione di criptazione funziona così:
- Prende in input il blocco a 32 bit, e lo espande a 48 bit.
- Esegue lo XOR con la Ki-esima (vedremo dopo da dove la prende) chiave lunga 48 bit
- Ogni s-box (scatola di sostituizione) prende in input 6 bit e genera 4 bit di output
- Esegue del risultato una permutazione diretta
- Etvoilà, il blocco è cifrato e lungo 32 bit
Partendo dalla chiave iniziale, per ogni round viene generata una chiave a 48 bits: