Crittografia
cripto.png

"Esistono due tipi di crittografia: quella che impedirà a tua sorella di leggere il tuo diario e quella che lo impedirà al tuo governo"1 Bruce Schneier

La crittografia è un campo di studi che ha come obiettivo l'occultamento del significato di un messaggio o di dati generici. Sebbene metodi per trasmettere messaggi nascosti o incomprensibili sono stati sviluppati anche nel lontano passato (vedere Crittografia classica), solo con l'avvento dell'informatica la crittografia ha espanso notevolmente il proprio ambito.

I moderni sistemi crittografici si avvalgono di tecniche matematiche per modificare un messaggio in modo da renderlo incomprensibile a chiunque non sia autorizzato. Per messaggio si intende del testo o dei dati binari, in pratica un qualunque file. La crittografia non è legata alla segretezza del messaggio, che può essere a disposizione di chiunque, ma alla segretezza delle cosiddette chiavi crittografiche, dati che permettono di ottenere dal messaggio cifrato dei dati comprensibili, detti anche in chiaro.

Un concetto fondamentale nella moderna crittografia consiste nel mettere a disposizione pubblicamente gli algoritmi crittografici. La sicurezza di un buon algoritmo infatti è intrinseca e non viene diminuita dalla conoscenza dello stesso. Un algoritmo segreto in genere non è sinonimo di un buon livello di sicurezza. Questo concetto è noto come Principio di Kerckhoffs, e fu affermato da Auguste Kerckhoffs alla fine del 1880. La disponibilità pubblica permette a chiunque di studiare l'algoritmo e di portarne alla luce le eventuali debolezze.

In un sistema crittografico, l'unico componente del sistema ad essere tenuto nascosto è quindi solo la chiave.

La crittografia è ormai utilizzata diffusamente nelle comunicazioni, tra cui le transazioni con siti di e-commerce (per le comunicazioni di dati sensibili come il numero di carta di credito) e con istituti bancari, le trasmissioni di telefonia mobile, le reti wireless. Fondamentale è il vantaggio strategico in ambito militare, che è stato dimostrato in modo lampante durante la Seconda Guerra Mondiale con la decifrazione del sistema chiamato ENIGMA.

Introduzione

La crittografia si occupa di sviluppare metodi matematici, implementati su calcolatori, per creare una comunicazione sicura tra un mittente e un destinatario, caratterizzata dalle seguenti proprietà:

  1. Sicurezza: nessuno tranne il destinatario deve essere in grado di leggere i dati
  2. Autenticità: il destinatario deve avere la certezza che è stato il mittente a trasmettere i dati e nessun altro
  3. Integrità: il destinatario deve essere sicuro che i dati non siano stati modificati successivamente da qualcuno che non sia il mittente

Un messaggio viene chiamato anche "messaggio in chiaro" (in inglese cleartext o plaintext). La procedura di criptazione (encryption) trasforma il messaggio in chiaro in un altro messaggio cifrato (ciphertext) che contiene le informazioni trasformate in modo tale che solo il destinatario possa recuperarle. Questa operazione inversa è detta decifrazione (decryption).

Se M è un messaggio, allora le operazioni di cifratura E e decifratura D implementano le funzioni seguenti:
C = E(M)
M = D(C) = D(E(M))

dove C è il messaggio cifrato.
Gli algoritmi di crittografia si suddividono in due principali tipi: gli algoritmi a crittografia simmetrica e gli algoritmi a crittografia asimmetrica o a chiave pubblica.

La crittografia simmetrica prende il nome dalla simmetria tra le operazioni di cifratura E e decifratura D, che vengono effettuate utilizzando una chiave unica. La stessa chiave viene utilizzata sia dal mittente che dal destinatario.

La crittografia asimmetrica o a chiave pubblica utilizza due chiavi diverse, dette chiave privata e chiave pubblica. Il messaggio viene cifrato dal mittente utilizzando la chiave pubblica e decifrato dal destinatario utilizzando la chiave privata.

Tipicamente, la crittografia viene utilizzata per inviare messaggi attraverso i cosiddetti canali non sicuri, ovvero canali di comunicazione dove teoricamente chiunque può intercettare i messaggi scambiati. Un utente che intercetta messaggi cifrati e cerca di recuperare il contenuto originale senza essere il vero destinatario viene chiamato attaccante.

Crittografia simmetrica

Vedi anche Algoritmi di crittografia simmetrici

Siano Alice e Bob due utenti che vogliono scambiarsi un messaggio cifrato. Attraverso la crittografia simmetrica dovranno effettuare queste operazioni:

  1. Concordare un algoritmo
  2. Concordare una chiave
  3. Alice cifra il messaggio con l'algoritmo concordato nel punto 1 e con la chiave concordata nel punto 2
  4. Alice invia il messaggio cifrato a Bob
  5. Bob, utilizzando l'algoritmo e la chiave concordati nei punti 1 e 2 decifra il messaggio

La chiave utilizzata deve rimanere segreta: solo Alice e Bob possono conoscerla. Chiunque altro la conosca può utilizzarla per cifrare e decifrare i messaggi. Per questo motivo, mentre il punto 1 viene effettuato attraverso un canale non sicuro, il punto 2 deve essere effettuato in segreto. Banalmente, se Alice e Bob concordassero una chiave attraverso un canale non sicuro, un potenziale attaccante potrebbe intercettare la chiave e utilizzarla in seguito per decifrare il messaggio inviato nel punto 4.

crypto01.png

Inoltre, l'attaccante potrebbe anche decifrare un messaggio, creare un nuovo messaggio fasullo, cifrarlo attraverso la chiave e spedirlo a Bob. Quest'ultimo non potrebbe capire che il messaggio non proviene da Alice: questo è un attacco chiamato "uomo in mezzo" (Man in the middle).

Quindi i problemi sono i seguenti:

  • Le chiavi devono essere comunicate in segreto, attraverso un canale sicuro
  • Se la chiave è compromessa (ovvero un attaccante riesce a entrarne in possesso) allora tutti messaggi possono essere compromessi, ovvero decifrati e/o sostituiti
  • Se si devono comunicare messaggi cifrati a molti utenti, è necessario concordare una chiave per ogni coppia di utenti, in modo che un destinatario non possa decifrare messaggi inviati ad un altro destinatario. Tuttavia, il numero delle chiavi da utilizzare e distribuire diventa velocemente molto grande.

Alcuni algoritmi di crittografia simmetrica sono: Data Encryption Standard e varianti, Advanced Encryption Standard

Crittografia asimmetrica

Vedi anche Algoritmi di crittografia asimmetrici

Nella crittografia asimmetrica, Alice e Bob si scambiano un messaggio cifrato attraverso l'utilizzo di una chiave pubblica e una chiave privata attraverso le seguenti operazioni:

  1. Bob genera una coppia di chiavi pubblica/privata
  2. Bob comunica ad Alice la sua chiave pubblica
  3. Alice usa la chiave pubblica di Bob per cifrare un messaggio
  4. Alice spedisce il messaggio ad Bob
  5. Bob decifra il messaggio con la chiave privata

Si supponga che un attaccante possa intercettare tutte le comunicazioni tra Alice e Bob. Egli intercetta la chiave pubblica nel punto 2 e il messaggio cifrato nel punto 4. Tuttavia non può decifrare il messaggio, perché è necessaria la chiave privata, che non viene mai trasmessa. Inoltre, diversi utenti possono utilizzare la stessa chiave pubblica di Bob per cifrare messaggi, perché la conoscenza della chiave pubblica non permette la decifrazione. Con questo sistema si risolvono di colpo i due problemi della crittografia simmetrica relativi alle chiavi da distribuire.

crypto02.png

Algoritmi

Fattorizzazione Interi Logaritmo Discreto Curve Ellittiche
Cifratura RSA, Rabin ElGamal, DHIES

Tramite le proprietà matematiche impiegate dagli algoritmi asimmetrici, si sono sviluppati algoritmi per lo scambio sicuro delle chiavi. Con questi algoritmi è possibile scambiare in modo sicuro una chiave simmetrica attraverso un canale insicuro.

Algoritmi

Fattorizzazione Interi Logaritmo Discreto Curve Ellittiche
Scambio Chiave Protocollo Diffie-Hellman, Protocollo Menezes-Qu-Vanstone Diffie-Hellman su Curve Ellittiche, Menezes-Qu-Vanstone su Curve Ellittiche

Algoritmi ibridi

Vedi anche Implementazione

Sembrerebbe che la crittografia asimmetrica, sia molto migliore di quella simmetrica, in virtù dei vantaggi illustrati precedentemente. Tuttavia non è esente da alcuni problemi come la lentezza: gli algoritmi simmetrici sono molto più veloci di quelli asimmetrici nel cifrare e decifrare i dati. Quindi nella pratica si utilizzano algoritmi ibridi che combinano i vantaggi degli algoritmi simmetrici e di quelli asimmetrici.

L'idea consiste nel generare una chiave simmetrica casuale e cifrarla con la chiave pubblica asimmetrica del destinatario. Il mittente invierà la chiave cifrata. Il destinatario decifrerà con la propria chiave privata asimmetrica la chiave simmetrica casuale. La procedura è la seguente:

  1. Bob invia ad Alice la sua chiave pubblica
  2. Alice genera una chiave simmetrica casuale K e la cifra con la chiave pubblica di Bob
  3. Bob riceve la chiave K cifrata e la recupera con la sua chiave privata
  4. A questo punto sia Bob che Alice si sono accordati su una comune chiave K simmetrica con cui cifrare i messaggi

I vantaggi sono diversi: per prima cosa le comunicazioni saranno cifrate e decifrate con la chiave simmetrica K, molto più veloce e lo scambio della chiave K avviene in modo sicuro: solo il destinatario potrà decifrarla. Inoltre, per una maggiore sicurezza, si può generare una nuova chiave K quando si desidera e la si può inviare con lo stesso sistema. La chiave K viene generalmente detta chiave di sessione.

Algoritmi di hash

Vedi anche Algoritmi di Hash

Le funzioni di hash sono fondamentali nella crittografia e in altre applicazioni collegate ad essa. Matematicamente, una funzione di hash H calcola, a partire da un messaggio M di lunghezza arbitraria, un valore h detto codice di hash

h = H(M)

il codice di hash h ha particolari proprietà, tra cui:

  1. dato il codice h, è molto difficile ricostruire il messaggio M da cui è stato generato
  2. ogni codice h è univoco per ogni messaggio

La seconda proprietà è teorica: poiché in genere il codice ha una lunghezza prefissata di n bit, esistono 2n codici diversi. Tuttavia il numero dei messaggi è potenzialmente infinito, quindi esistono sicuramente due messaggi diversi M ed M' tali che H(M) = H(M'). Questo fatto, chiamato collisione hash, non costituisce un grosso problema, poiché è molto difficile creare un secondo messaggio che generi, per la funzione H, il codice h del messaggio originale. Inoltre, il numero n degli algoritmi di hash attualmente utilizzati è sufficientemente elevato da impedire dei problemi di questo tipo. Uno degli algoritmi più utilizzati, l'MD5, utilizza 128 bit (che corrispondono a 3.4 1038 codici di hash) e sono stati introdotti successivamente gli algoritmi della famiglia SHA (Secure Hash Algorithm) che impiegano da 160 a 512 bit.

Alcuni algoritmi di hash utilizzati: MD5, Secure Hash Algorithm

Firma digitale

Vedi anche Algoritmi di firma digitale

Una firma digitale è un meccanismo con cui si ottiene l'autenticazione e l'integrità dei dati utilizzando delle funzioni di hash e un algoritmo di crittografia asimmetrica. Anche se viene utilizzata la crittografia, e per la firma digitale è necessario disporre di chiavi crittografiche, non è detto che il messaggio firmato è necessariamente anche cifrato: un messaggio può essere firmato ma trasmesso in chiaro. Ovviamente si può associare alla firma digitale anche la crittografia standard, per mantenere segreto il messaggio.

La firma digitale cerca in qualche modo di essere un analogo della firma calligrafica su un documento cartaceo. Idealmente, una firma calligrafica ha (o cerca di avere) le seguenti proprietà:

  • È autentica: conferma a chi la esamina che il firmatario ha deliberatamente firmato il documento
  • Non può essere contraffatta: conferma che solo il firmatario ha firmato il documento e non qualcun'altro
  • Non è riutilizzabile: la firma è parte del documento
  • Rende il documento inalterabile
  • Non può essere ripudiata: il firmatario non può affermare che non ha firmato il documento

Una firma digitale è costituita da un blocco di dati che vengono allegati al messaggio da firmare. Chi riceve il messaggio è in grado di verificare che il blocco di dati rappresenta una firma di un particolare mittente. Un algoritmo di firma digitale verifica il documento in base alla firma e indica se la firma è valida oppure no.

La firma digitale sfrutta le proprietà degli algoritmi di hash con quelle degli algoritmi di crittografia e permette di ottenere i seguenti risultati:

  • Non è possibile allegare i dati di una firma valida di un documento A e allegarli ad un documento B: ogni firma è diversa. Essendo la firma un codice hash, è diverso per ogni file: al momento della verifica non coinciderebbero il codice hash del documento A (contenuto nella firma originale) con quello del documento B (a cui è stata allegata la firma)
  • Dato un documento con una firma valida, non è possibile alterare il documento. Se esso viene modificato in qualunque modo, anche lasciando inalterato il blocco di dati che costituisce la firma, la verifica della firma avrà esito negativo. Anche in questo caso la proprietà deriva da quelle delle funzioni di hash: un minimo cambiamento, anche di un solo bit, comporta la generazione di un codice diverso che non coincide più con quello cifrato contenuto nella firma
  • L'algoritmo di verifica indica chi è il proprietario della firma. Infatti la decifratura corretta avviene solo utilizzando la chiave pubblica (che chiunque può ottenere) accoppiata alla chiave privata di chi ha firmato e nessun'altra chiave pubblica potrebbe decifrare il codice hash.

Se si desidera combinare riservatezza e autenticazione dei dati, si può firmare e cifrare un messaggio. Ad esempio, quando Alice vuole inviare un messaggio cifrato e firmato a Bob, desidera che:

  1. Solo Bob possa decifrare il messaggio
  2. Bob possa verificare che è stata effettivamente Alice ad inviarglielo

La procedura funziona in questo modo:

  1. Alice firma il messaggio, utilizzando la sua chiave privata
  2. Alice cifra il messaggio firmato per Bob utilizzando la chiave pubblica di Bob
  3. Infine invia il tutto a Bob

Quando Bob riceve il messaggio egli effettua queste operazioni

  1. Decifra il messaggio utilizzando la propria chiave privata e ottiene un messaggio in chiaro con la firma
  2. Verifica la firma di Alice usando la chiave pubblica di Alice

Algoritmi

Fattorizzazione Interi Logaritmo Discreto Curve Ellittiche
Firma RSA, Rabin-Williams, ESIGN DSA, Nyberg-Rueppel ECDSA, Nyberg-Rueppel su Curve Elittiche

Message Authentication Codes

Vedi anche Message Authentication Codes

Un Message Authentication Code è un algoritmo che permette di verificare l'integrità dei dati. Un algoritmo MAC impiega una chiave segreta condivisa tra il mittente e il destinatario. Analogamente alla firma digitale, il mittente calcola tramite la chiave K il codice e lo trasmette assieme al messaggio. Lo stesso algoritmo viene applicato al messaggio tramite la stessa chiave e viene confrontato il codice risultante.

Autenticazione

Vedi anche Algoritmi di autenticazione

Con i meccanismi di autenticazione, un utente o un sistema è in grado di verificare l'identità di un utente o di un altro sistema.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License