La parola crittografia, che affonda le sue radici nel greco kryptos (nascosto) e graphè (scrittura), identifica l'arte di proteggere le informazioni rendendole incomprensibili ai non autorizzati. In questo ambito, l'algoritmo di cifratura viene definito cifrario, il quale trasforma il testo in chiaro (il messaggio originale) in un testo cifrato attraverso l'uso di una chiave, ovvero una sequenza di lunghezza finita che funge da parametro fondamentale per l'operazione.
L'adozione di queste tecniche mira a soddisfare tre scopi principali: la confidenzialità, che assicura la segretezza dei dati; l'integrità, che garantisce che le informazioni non vengano alterate; e l'autenticità, verificata tramite sistemi di chiavi e certificati.
I sistemi crittografici possono essere classificati secondo diverse logiche operative. Una prima distinzione riguarda il metodo di trasformazione: nella crittografia a sostituzione ogni elemento del testo viene mutato in un altro, mentre nella crittografia a trasposizione (o per mutazione) i caratteri originali vengono semplicemente riorganizzati.
Dal punto di vista dell'elaborazione, si parla di crittografia a blocchi quando il testo viene suddiviso in unità di dimensione fissa ($n$ bit) elaborate indipendentemente, e di crittografia a flusso quando l'algoritmo lavora su un quantitativo di bit variabile senza una lunghezza predefinita. Infine, la distinzione più moderna riguarda la gestione delle chiavi: i sistemi simmetrici utilizzano la stessa chiave per cifrare e decifrare, mentre quelli asimmetrici impiegano una coppia di chiavi distinte, una pubblica e una privata.
Il metodo più elementare è il Cifrario di Cesare, basato su uno shift fisso. In questo sistema si sceglie un numero che funge da chiave per traslare ogni lettera del messaggio in avanti nell'alfabeto (ad esempio, con chiave 1, la A diventa B). Trattandosi di un cifrario molto semplice, risulta estremamente debole poiché presenta solo 25 chiavi possibili. Una sua evoluzione è il Cifrario di Vigenère, che utilizza una parola chiave invece di un numero. Ogni lettera della parola chiave rappresenta uno spostamento diverso in base alla sua posizione nell'alfabeto (A=1, B=2, ecc.). Se la chiave è più corta del messaggio, viene ripetuta ciclicamente, rendendo il sistema più robusto rispetto a quello di Cesare.
In alternativa al cambio dei caratteri, il Cifrario a Trasposizione agisce rimescolandone l'ordine. In un'implementazione colonare semplice, si decide un numero di colonne (chiave) e si scrive il messaggio in una tabella riga per riga. Il testo cifrato si ottiene leggendo la tabella colonna per colonna, cambiando così la posizione originale delle lettere senza però alterarne l'identità.
A livello informatico, la Cifratura XOR è un esempio di cifrario a flusso che lavora direttamente sui bit. Sfrutta l'operazione logica eXclusive OR, dove il risultato è 0 se i bit sono uguali e 1 se sono diversi. La particolarità dello XOR è la sua reversibilità: applicando la chiave ai dati si ottiene il testo cifrato, e applicando nuovamente la stessa chiave al testo cifrato si ritorna ai dati originali. In pratica, il messaggio viene convertito in binario e ogni bit viene messo in relazione con quello della chiave.
L'RSA rappresenta il pilastro della sicurezza moderna (utilizzato in HTTPS e firme digitali) e si basa su una coppia di chiavi. La Chiave Pubblica viene distribuita liberamente e serve a chiunque voglia cifrare un messaggio destinato a noi; la Chiave Privata, invece, deve rimanere segreta e serve unicamente al proprietario per decifrare quanto ricevuto. Questo sistema si fonda sul "problema della fattorizzazione": è matematicamente semplice moltiplicare due grandi numeri primi per ottenere un prodotto $N$, ma è quasi impossibile per un computer risalire ai due numeri primi originali partendo solo da $N$.
Immaginiamo di scegliere due numeri primi $p=3$ e $q=11$. Il loro prodotto $N=33$ diventa parte delle chiavi. Calcoliamo un valore intermedio $V = (p-1)(q-1) = 20$. Scegliamo quindi un esponente pubblico $Npub = 7$ (un numero primo tra 1 e $V$). Per trovare l'esponente privato $Npriv$, dobbiamo cercare un numero che, moltiplicato per $Npub$ e diviso per $V$, dia come resto 1; in questo caso $Npriv = 3$ (infatti $37=21$, che diviso 20 dà resto 1).
Se vogliamo cifrare il messaggio $m=5$, applichiamo la formula $C = (m^{Npriv}) \pmod N$, ottenendo 26. Per decifrare e tornare al messaggio originale, il destinatario utilizzerà la formula $m = (C^{Npub}) \pmod N$, riottenendo esattamente il valore 5. La sicurezza del sistema garantisce che, con numeri primi sufficientemente grandi, nessuno possa calcolare $Npriv$ anche conoscendo $N$ e $Npub$.