# Cifrario

Un cifrario, nella crittografia, è un algoritmo utilizzato per eseguire operazioni o una serie di passaggi ben definiti che possono essere eseguiti come una procedura, volte a rendere oscuro, ossia semanticamente non leggibile, un testo di un messaggio in chiaro (plain text) o, al contrario, al ripristino in chiaro di un messaggio precedentemente cifrato.
Con la locuzione "codice segreto" si intende lo stesso che "cifrario", mentre le operazioni che richiedono l'utilizzo di tale codice sono dette cifratura.

## Etimologia

La parola "cifra" deriva dal termine arabo صفر, ṣifr, che significa vuoto, che gli Arabi usavano per indicare il numero "0" (vedi Storia dello Zero). Dopo l'introduzione in Europa dei numeri arabi, si diffuse l'uso di definire come "cifra" qualunque numero, non solo lo zero. Si può forse ritenere che i cifrari furono definiti così perché comprensibili solo a coloro che sapevano come ricostruire il testo in chiaro, un po' come la numerazione araba che era ben diversa da quella romana e quindi nota solo a chi l'aveva studiata.

## Descrizione

Spesso "cifrario" viene confuso con il termine "codice", ma i due concetti, in crittografia, sono molto distinti. Nella crittografia classica i codici operano per sostituzione dei termini usando un vasto libro codice, un elenco di sostituti per rimpiazzare parole e frasi. Ad esempio "UQJHSE" potrebbe significare "Procedere fino alle seguenti coordinate". Quando si usa un cifrario, l'informazione originale è nota come testo in chiaro mentre quella cifrata come testo cifrato. Il testo cifrato contiene tutte le informazioni del testo in chiaro, ma espresse in un formato illeggibile dagli esseri umani o dai computer senza un determinato algoritmo di decifrazione: a chi non è in grado di leggerlo, dovrebbe apparire come una sequenza di caratteri senza senso.
L'operazione svolta da un cifrario dipende normalmente da un'informazione ausiliaria chiamata chiave. La chiave influenza il processo di cifratura: chiavi diverse producono versioni cifrate differenti dello stesso testo in chiaro. La chiave deve essere scelta prima di cifrare il messaggio e senza la sua conoscenza, dovrebbe essere difficile, se non impossibile, decifrare il testo cifrato, sia conoscendo (security without obscurity) sia non conoscendo l'algoritmo di cifratura (security through obscurity).

### Cifrari e codici

Nell'accezione comune, codice generalmente indica "cifrario". Nella terminologia tecnica, le parole "codice" e "cifrario" fanno invece riferimento a due concetti differenti: un codice lavora a livello di significato, cioè parole o frasi vengono convertite in qualcosa di differente, spesso con il risultato di rendere più brevi i messaggi. Un esempio è il codice telegrafico Morse, creato per trasmettere i messaggi via cavo tramite impulsi elettrici.
I cifrari, invece, lavorano ad un livello più basso, il livello di singole lettere o, come nei moderni cifrari, a livello di bit. Alcuni sistemi usano sia codici che cifrari uniti in un unico sistema di cifratura per aumentare la sicurezza degli schemi. In alcuni casi i termini codice e cifrario sono sinonimo di "sostituzione" e "trasposizione".
A causa di alcuni suoi limiti, come la suscettibilità alla crittanalisi e la difficoltà di maneggiare voluminosi libri codice, la codifica nei tempi recenti è caduta in disuso in favore della moderna crittografia, ed i cifrari sono oggi la tecnica dominante.

## Tipi di cifrari

C'è una gran varietà negli schemi di cifratura: i metodi usati nella crittografia più antica sono sostanzialmente differenti dai moderni sistemi.

### Cifrari storici

I cifrari antichi, quelli basati sull'uso di carta e penna, sono spesso indicati come cifrari classici. Essi includono i semplici cifrari a sostituzione e quelli a trasposizione. Ad esempio la frase "BUON GIORNO" può essere cifrata come "ATNM FHNQMN" dove ogni lettera è sostituita da quella che la precede nell'alfabeto, oppure può essere cifrata come "BNOO UGROIN" utilizzando una semplice trasposizione.
All'inizio del XX secolo furono inventate delle macchine elettro-meccaniche capaci di eseguire operazioni di cifratura e decifratura usando cifrari polialfabetici ed a trasposizione, come la cifratrice Lorenz o la macchina Enigma. Queste macchine facevano parte delle cosiddette "macchine a rotori", il cui funzionamento si basava su dischi rotanti, che provvedevano alla sostituzione polialfabetica delle lettere, combinati con l'uso di collegamenti elettrici, che provvedevano alla loro sostituzione. Le chiavi di cifrature erano impostate mediante la disposizione iniziale dei dischi e dei collegamenti elettrici. Nonostante queste macchine fossero molto più complesse di qualunque schema fino ad allora visto, i loro cifrari furono violati con l'uso di altre macchine calcolatrici appositamente inventate all'occorrenza, come il calcolatore Colossus.

### Cifrari moderni

I moderni sistemi di cifratura si dividono in base al tipo di chiave usata ed al tipo di dato fornito in ingresso. A seconda del tipo di chiave usata, i cifrari sono divisi in:
* algoritmi a chiave simmetrica, o a chiave privata, dove la stessa chiave è usata sia per la cifratura che per la decifratura del messaggio;
* algoritmi a chiave asimmetrica, o a chiave pubblica, dove una chiave è usata per la cifratura ed un'altra per la decifratura.
Negli algoritmi a chiave simmetrica (come il DES e l'AES), il mittente ed il destinatario del messaggio devono essere in possesso di un sistema sicuro per potersi scambiare la chiave segreta senza che questa possa essere intercettata da altri; il mittente, poi, utilizza questa chiave per la cifratura del messaggio, ed il destinatario la riutilizza per ottenere il testo decifrato. Negli algoritmi a chiave asimmetrica (come l'RSA), invece, ci sono 2 chiavi distinte: la chiave pubblica, di pubblico dominio ed utilizzata da chiunque voglia cifrare un messaggio, ed una chiave privata, nota solo al destinatario del messaggio e da lui utilizzata per recuperare il testo in chiaro.
A seconda del tipo di dati che i cifrari trattano, essi sono divisi in:
* cifrari a blocchi, che operano su blocchi di dati di lunghezza prefissata;
* cifrari a flusso, che cifrano flussi continui di dati.

## Dimensione della chiave e vulnerabilità

Nel caso di un attacco di natura matematica (come nel caso dell'assenza di qualsiasi informazione utile a violare il cifrario) ci sono 3 fattori estremamente importanti
* gli sviluppi matematici che portano alla conoscenza di nuove tipologie di attacco o alla scoperta ed utilizzo di eventuali debolezze del cifrario;
* la potenza computazionale che è disponibile, cioè la potenza di calcolo di cui si dispone per operare sul problema. È importante notare che non si deve tener conto solo delle prestazioni o delle capacità di un singolo computer di media potenza: un attaccante potrebbe utilizzare contemporaneamente diverse macchine in modo da incrementare la velocità di una ricerca esaustiva di tutte le possibili chiavi;
* la dimensione della chiave, cioè la lunghezza effettiva della chiave usata per cifrare un messaggio. Al crescere della dimensione della chiave cresce anche la complessità della ricerca esaustiva, fino ad arrivare al punto in cui diventa praticamente impossibile violare in maniera diretta il cifrario.
La sola dimensione della chiave, però, non esprime in realtà l'effettiva robustezza di un cifrario, dato che entrano in gioco diversi fattori legati alla struttura stessa dell'algoritmo ed al tipo di cifratura adottato: ecco perché un cifrario simmetrico con una chiave lunga 128 bit offre lo stesso livello di sicurezza di un cifrario asimmetrico che adotti una chiave lunga 3072 o di un sistema a curve ellittiche con chiave di 512 bit.
Claude Shannon dimostrò con la teoria dell'informazione che l'unico cifrario teoricamente inviolabile ("cifrario perfetto") è quello che adotta una chiave segreta "usa-e-getta" (nel senso che non deve essere mai riutilizzata), veramente casuale e lunga quanto il messaggio da cifrare: è il caso dei cifrari one-time pad, di cui il più famoso è il cifrario di Vernam.