La crittografia è l’insieme di tecniche che permettono di scrivere messaggi in un codice che può essere compreso solo da chi conosce la chiave.
La crittoanalisi è lo studio dei metodi per decifrare i messaggi cifrati senza conoscere la chiave. Essa è una disciplina fondamentale per valutare la robustezza degli algoritmi crittografici esistenti e per determinare come progettare nuovi algoritmi robusti.
Lo scenario tipicamente utilizzato per illustrare le tecniche di crittografia è quello in cui due entità peer, chiamate Alice e Bob ($A$ e $B$), vogliono inviarsi un messaggio in segreto su un canale non protetto. In generale, un canale è un qualsiasi segnale che permette di trasmettere messaggi/dati d una parte all’altra, e il fatto che in questo caso esso sia non protetto significa che un attaccante può avere il controllo totale su di esso, ovvero può intercettare, modificare e cancellare i messaggi che vi transitano.
Il messaggio originale che Alice vuole inviare a Bob è chiamato testo in chiaro (plain-text). Per evitare che un attaccante possa leggerlo, Alice cifra il messaggio usando un apposito algoritmo di cifratura (cipher), che produce come output un messaggio codificato, detto testo cifrato (ciphertext). Il testo cifrato prodotto dipende non solo dal testo in chiaro, ma anche da un secondo input dell’algoritmo, una chiave di cifratura (che in genere è una sequenza di bit, ed è indipendente dal messaggio da cifrare).
Una volta ottenuto il testo cifrato, Alice lo invia a Bob tramite il canale. Infine, Bob dà il testo cifrato e una chiave di decifratura in input a un algoritmo di decifratura: così annulla le trasformazioni fatte dall’algoritmo di cifratura, ridando in input il testo in chiaro, ovvero consentendo a Bob di leggere il messaggio. Un eventuale attaccante, invece, non potrebbe decifrare il messaggio perchè non sarebbe in possesso della chiave di decifratura.
In notazione formale, si indicano:
Un sistema crittografico comprende un algoritmo di cifratura, un algoritmo di decifratura, un metodo per la generazione delle chiavi, ecc.
I sistemi crittografici sono caratterizzati da vari aspetti. Un aspetto molto importante è il numero di chiavi utilizzate: