domenica 20 marzo 2016

Basi Di Crittografia #4 - Funzioni Non Reversibili

In questa quarta parte vediamo nel dettaglio cos'è e come creare un funzione di cifratura che non sia reversibile, ovvero non è possibile (o meglio, è molto complicato e dispendioso) decriptarla mentre è molto più facile criptarla. Iniziamo subito.

Funzioni non reversibili

Ipotizziamo tu sia il gestore di un famoso Social Network. Molte persone si sono registrate al tuo sito e, quindi, hai le email e le password di tutti gli utenti memorizzate in un database.

Un hacker riesce a trovare una vulnerabilità nel tuo sito. Penetra nel database e ora lui possiede tutte le email e le password.

Le email sono in chiaro (non criptate) mentre le password sono criptate.

Le email sono criptate secondo una funzione di cifratura non reversibile. Ovvero le password criptate non possono ritornare in chiaro (non possono essere decriptate). In realtà è possibile tentare (e ripeto, tentare) di decriptare una stringa cifrata con una funzione non reversibile (ad esempio attraverso una tecnica di bruteforce, come vedremo in futuro) ma occorre molto tempo (anche anni, dipende dalla complessità della funzione).

Da questo esempio capisci quanto siano importanti le funzioni di cifratura non reversibili.

Ma come funzionano?

Parliamo un po' di matematica (conoscere le basi di matematica è uno dei requisiti di questa guida se ricordi). Prendiamo due numeri primi (ovvero due numeri divisibili solo per 1 e per sé stessi), ad esempio:
x = 311
y = 109
Moltiplichiamoli tra loro (* è il simbolo per indicare la moltiplicazione, in informatica così come in Python) e il risultato lo chiamiamo z:
x * y = z = 33899
Quanto ci abbiamo messo per calcolare z (ovvero per moltiplicare x e y)? Pochissimo tempo, esistono le calcolatrice apposta per questo.

Ora consideriamo il processo inverso: conosciamo z e dobbiamo trovare x e y, cioè i due numeri che moltiplicati tra loro ci danno z come risultato. Quanto tempo ed energie impieghiamo? Molte di più. E in questo caso x e y sono numeri abbastanza piccoli, quindi ti lascio immaginare che impresa sarebbe trovarli se fossero numeri più grandi.

Bene. Le funzioni non reversibili si basano su questo concetto matematico: è facile moltiplicare due numeri primi ma è più difficile partendo dal risultato trovare i due numeri primi che moltiplicati ci danno il risultato stesso.

Chiave pubblica e privata

In una delle scorse parti di questa guida sulla crittografia abbiamo parlato di chiavi e abbiamo visto nel dettaglio cosa è una chiave e qual è il suo scopo. Se ancora non hai letto la parte precedente in questione ti consiglio di farlo.

Chiave pubblica e privata è un argomento strettamente correlato con le funzioni non reversibili visto che ne fa largo uso.

Per comprendere il concetto di chiave pubblica e privata, partiamo da questa domanda: come fanno a comunicare due PC in una rete in modo sicuro?

Consideriamo il PC A e il PC B. A invia il messaggio "ciao" a B.

Ad un certo punto si intromette (si connette alla stessa rete) il PC C, il quale riesce ad intercettare il messaggio inviato da A a B. Lo legge, il messaggio è: "ciao". Ora immagina se quel messaggio fosse stato una password o un qualunque altro dato sensibile. Questo metodo di comunicazione non è per niente sicuro (ecco perché la freccia è rossa). A e B devono trovare un modo più sicuro per comunicare.

Ecco che entrano in azione la chiave pubblica e la chiave privata. A e B hanno entrambi una chiave pubblica che mettono a disposizione di chiunque e chiunque può venirne a conoscenza, e una chiave privata che solo il possessore può conoscere.

Quindi sia A che B hanno 2 chiavi. Quella disegnata più grande è la chiave pubblica, mentre quella più piccola è la chiave privata. Se A vuole inviare un messaggio a B deve prendere la chiave pubblica di B e criptare il messaggio con tale chiave. Poi invia il messaggio criptato a B. Tale messaggio potrà essere decriptato solo con la chiave privata di B, di cui solo B ne è a conoscenza.

Viceversa, se B volesse inviare un messaggio ad A, dovrebbe prendere la chiave pubblica di A e criptare il messaggio con tale chiave. Poi lo invia ad A. Tale messaggio potrà essere decriptato solo con la chiave privata di A, di cui solo A ne è a conoscenza.

Nel nostro esempio A vuole inviare a B il messaggio "ciao". Prende la chiave pubblica di B e cripta il messaggio "ciao" con tale chiave. Il messaggio criptato che ne risulta, ad esempio, è "hjkl" (come nell'immagine di sopra). B riceve il messaggio, lo visualizza e lo decripta con la sua chiave privata (ricordo che il messaggio può essere decriptato solo con la chiave privata di B). B vede che il messaggio in chiaro (decriptato) che A ha voluto inviargli è "ciao". Il PC B, a questo punto, può decidere cosa rispondere ad A criptando la risposta con la chiave pubblica di A e inviando la risposta criptata ad A.

Se C si intromettesse mentre A invia il messaggio (criptato ovviamente) a B?

Il PC intercetterebbe il messaggio. Il messaggio è "hjkl". Ma C non potrà mai sapere cosa significa visto che non possiede la chiave per decriptarlo (ovvero la chiave privata di B). Quindi possiamo definire sicuro questo metodo di comunicazione (ecco perché la freccia è verde).

Per chi non lo sapesse, questo è il metodo di comunicazione delle nostre reti (LAN, WiFi, ecc..).

Possiamo considerare, quindi, la chiave privata come se fosse i due numeri primi x e y dell'esempio precedente. Mentre la chiave pubblica come se fosse il numero z (ovvero il risultato di x * y).

È facile criptare un messaggio con z, però poi per decriptarlo occorrono i due numeri primi x e y che moltiplicati ci diano come risultato z.

Ecco perché il metodo di comunicazione con chiave pubblica e privata è strettamente correlato alle funzioni non reversibili.

Conclusioni

Capisco che questo articolo è stato principalmente teorico (anche se gli esempi sono abbastanza pratici). Nella prossima parte non vedremo come creare una funzione di cifratura non reversibile (questo è compito degli informatici teorici e dei matematici, e non è neanche semplice), noi ci limiteremo a capire come criptare un messaggio con una funzione non reversibile utilizzando funzioni moderne e all'avanguardia, e come è possibile decriptare le stringhe cifrate.

Se hai dubbi, domande o problemi col codice non esitare a scrivere nei commenti.

0 commenti:

Posta un commento