Introduzione alla crittografia - storia e classificazione | Anno 5 Modulo 2 Lezione 5
Anno 5 · Modulo 2 · Lezione 5
✍ Autore: Prof. Giagnotti · Materia: Sistemi e Reti

Introduzione alla crittografia - storia e classificazione

Dal kryptós greco ai principi di Shannon: come funziona un crittosistema, perché Cesare si rompe in un secondo e perché il One-Time Pad è l'unico cifrario perfetto. Fondazione per DES, AES, RSA e tutta la sicurezza computazionale.

⏱ 30 min lettura 📚 Anno 5 🧩 Modulo 2 - Sicurezza 🔐 Crittografia classica 🎯 Livello: Fondamentale
// OBIETTIVI DI APPRENDIMENTO
✓Definire il concetto di sistema crittografico e spiegare i suoi elementi fondamentali: testo in chiaro, chiave, crittogramma, funzioni di cifratura e decifratura
✓Classificare i sistemi crittografici per tipo di trasformazione (sostituzione/trasposizione), modalità di elaborazione (blocchi/flusso) e numero di chiavi (simmetrica/asimmetrica)
✓Descrivere il cifrario di Cesare, il cifrario Rail Fence e il cifrario di Vigenère, spiegandone il funzionamento con esempi e le rispettive vulnerabilità
✓Spiegare i principi di Shannon (diffusione e confusione) e la distinzione tra sicurezza incondizionata e computazionale

1. Cos'è la crittografia: modello del crittosistema

📌 Definizione da ricordare

Un sistema crittografico è un sistema in cui un mittente trasforma un testo in chiaro T in un crittogramma X mediante una funzione di cifratura C e una chiave K, per inviarlo su un canale potenzialmente intercettabile. Il destinatario applica D(K,X) per ricostruire T. La chiave è il segreto, non l'algoritmo.

Sin dall'antichità l'essere umano si è confrontato con il problema di comunicare in modo sicuro su canali non affidabili. Il termine crittografia deriva dal greco kryptós (nascosto) e graphía (scrittura) — letteralmente scrittura nascosta. Indica l'insieme delle tecniche per proteggere le informazioni durante trasmissione o conservazione.

🎯 Esempio in classe

Pensa al registro elettronico: quando la tua password viaggia verso il server, non deve essere leggibile se qualcuno intercetta il WiFi della scuola. Il client applica C(K,T) con TLS, il server decifra con la chiave negoziata. Se togli la cifratura (http), Wireshark in laboratorio mostra tutto in chiaro.

Modello generale di un crittosistema

T Plaintext MITTENTE C(K,T) cifratura X Crittogramma CANALE NON SICURO X Intercettato D(K,X) decifratura T Plaintext DESTINATARIO ATTACCANTE legge solo X T = testo in chiaro • K = chiave segreta • X=C(K,T) • T=D(K,X) • Principio di Kerckhoffs: solo K è segreta
01 · INPUT

T - Plaintext

Messaggio originale comprensibile. Può essere testo, immagine, file binario.

02 · SEGRETO

K - Chiave

Sequenza di bit che parametrizzza C e D. 2^n combinazioni se lunga n bit.

03 · OUTPUT

X - Crittogramma

Risultato di C(K,T). Senza K deve essere indistinguibile da rumore casuale.

💬 Tip del docente

All'interrogazione ripeti la formula: X = C(K, T) e T = D(K, X). Poi aggiungi subito Kerckhoffs: "L'algoritmo può essere pubblico, la sicurezza dipende solo dalla chiave". È la frase che ti fa prendere il punto pieno.

2. La chiave crittografica e il costo della forza bruta

La chiave è l'informazione segreta che rende unica la trasformazione crittografica. Nei sistemi informatici moderni è tipicamente una sequenza di bit. La sua lunghezza influisce direttamente sulla sicurezza: una chiave da n bit genera 2n combinazioni possibili da esplorare in attacco a forza bruta.

Lunghezza chiaveCombinazioniTempo medio (10^9 try/s)Stato 2025
5 bit (Cesare) - 26 alfabeti26Istantaneo (<1ms)❌ Insicuro
56 bit (DES)7,2 × 10¹⁶~ 1 anno (hardware moderno)⚠️ Obsoleto
128 bit (AES-128)3,4 × 10³⁸Miliardi di anni✅ Sicuro
256 bit (AES-256)1,2 × 10⁷⁷Più dell'età dell'universo✅ Post-quantum safe
🎯 Esempio in classe

Lab rapido: scrivi in Python un brute force su Cesare. 26 chiavi → 3 righe di for. Poi prova su DES 56 bit: lo stesso programma impiegherebbe 2284 anni su un singolo PC. Questo gap ti fa capire perché AES-128 è il minimo odierno per TLS 1.3.

PYTHON · BRUTE FORCE CESARE
def caesar_crack(ciphertext): for k in range(26): # spazio chiavi = 26 plain = "" for ch in ciphertext: if 'A' <= ch <= 'Z': plain += chr((ord(ch)-65 - k) % 26 + 65) else: plain += ch print(f"K={k:2d} -> {plain}") caesar_crack("DWWDFFDUH") # ATTACCARE con K=3 # Output: K=3 -> ATTACCARE -> chiave trovata istantaneamente # Confronto: AES-128 richiederebbe 2**128 tentativi # 2**128 = 340282366920938463463374607431768211456 # Anche con 1 miliardo di GPU parallele: >1e22 anni

3. Classificazione a tre assi dei sistemi crittografici

I sistemi crittografici si classificano secondo tre criteri indipendenti che è importante tenere distinti. Un cifrario può essere ad esempio: sostituzione + block + simmetrico (AES) oppure trasposizione + stream + simmetrico (Rail Fence).

ASSE 1 · TRASFORMAZIONE

Sostituzione vs Trasposizione

Sostituzione: ogni simbolo viene rimpiazzato da un altro (A→D). Struttura preservata, simboli cambiano.
Trasposizione: simboli invariati ma riorganizzati (permutazione).

ASSE 2 · ELABORAZIONE

Block vs Stream

Block cipher: diviso in blocchi fissi (es. 128 bit), ogni blocco cifrato con stessa chiave.
Stream cipher: flusso continuo bit per bit XOR con keystream.

ASSE 3 · CHIAVI

Simmetrica vs Asimmetrica

Simmetrica: stessa chiave segreta per cifrare/decifrare. Veloce ma distribuzione difficile.
Asimmetrica: coppia pubblica/privata. Risolve distribuzione, più lenta.

TRASFORMAZIONE SOSTITUZIONE A→D, B→E ... Monoalfabetica o polialfabetica (Vigenère). Confusione. TRASPOSIZIONE Permutazione posizioni. Simboli invariati, ordine cambia. Diffusione. ELABORAZIONE BLOCK CIPHER Blocco 64/128 bit, padding, modalità ECB/CBC/CTR. Es: AES. STREAM CIPHER Flusso bit + keystream XOR. Es: ChaCha20, One-Time Pad. NUMERO CHIAVI SIMMETRICA Stessa K segreta. Veloce: AES, ChaCha20. Problema: scambio chiavi. ASIMMETRICA Pubblica + privata. Risolve key distribution. Es: RSA, ECC.

4. Tipi di attacco crittoanalitico

Un crittoanalista è un attaccante che cerca di recuperare il testo in chiaro o la chiave intercettando le comunicazioni. A seconda delle informazioni disponibili, distinguiamo cinque livelli:

Tipo di attaccoCosa conosce il crittoanalistaDifficoltà / Esempio storico
Ciphertext onlySolo il crittogramma XMassima — caso reale di intercettazione passiva
Known plaintextCoppie (T,X) con stessa chiaveAlta — usato per violare Enigma (frasi standard tedesche)
Chosen plaintextPuò scegliere T e osservare XMedia — individua debolezze AES in modalità ECB
Chosen ciphertextPuò scegliere X e ottenere TBassa se ha accesso al dispositivo (HSM)
Open key modelInfo parziali sulla struttura KBassa — riduce spazio ricerca (password umane)
🎯 Caso storico in classe

Enigma fu decifrata a Bletchley Park da Alan Turing con known plaintext: i messaggi tedeschi iniziavano sempre con KEINE BESONDEREN EREIGNISSE (nessun evento speciale) ogni mattina. Quella frase forniva coppie T/X che riducevano enormemente le configurazioni giornaliere dei rotori. In lab usa CrypTool 2 per replicare l'attacco su Vigenère.

5. Cifrari classici a sostituzione: Cesare

📌 Definizione

Il cifrario di Cesare è una sostituzione monoalfabetica con scorrimento fisso K (0-25). C(K,T)= (T+K) mod 26. Chiave usata da Giulio Cesare: K=3. È il primo esempio storico di crittografia simmetrica.

Ogni lettera del testo in chiaro viene sostituita con quella che si trova K posizioni più avanti nell'alfabeto con riavvolgimento circolare. La decifratura è lo scorrimento inverso.

FORMULA · CESARE
Alfabeto: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Indici: 0 1 2 3 4 5 6 7 8 9 ... Cifratura: C = (P + K) mod 26 Decifratura: P = (C - K) mod 26 Esempio K=3: Chiaro: A T T A C C A R E 0 19 19 0 2 2 0 17 4 Cifrato: D W W D F F D U H -> DWWDFFDUH 3 22 22 3 5 5 3 20 7 Python one-liner: def caesar(s,k): return ''.join(chr((ord(c)-65+k)%26+65) if c.isupper() else c for c in s)
⚠️ Errore comune

Non dire "Cesare è sicuro se cambio la K spesso". Con 26 chiavi totali, la sicurezza è zero anche con rotazione oraria. La vulnerabilità strutturale è anche analisi delle frequenze: in italiano 'E' compare ~11.8%, in inglese 'E' ~12.7%. Cerca la lettera più frequente nel crittogramma → è la E cifrata → ricavi K istantaneamente.

ATTACCO 1

Brute Force 26 chiavi

Provi tutte le 26. Con script Python < 0.001s. Dimostrazione perfetta di spazio chiavi insufficiente.

ATTACCO 2

Analisi frequenze

Cuenta occorrenze lettere. Mappa la più frequente → E italiana. Bypassa anche se K ignota e messaggio lungo.

6. Cifrari classici a trasposizione: Rail Fence (staccionata)

Esempio classico di crittografia per trasposizione: i simboli non vengono modificati ma riordinati. Il testo viene scritto in diagonale su un numero fisso di righe (la chiave) e poi ricomposto leggendo riga per riga.

RAIL FENCE - Testo: VEDIAMOCIALLEOTTO | Chiave: 4 righe | Zig-Zag R1 R2 R3 R4 V O E E M C L O D A I L T O I A T CIFRATO (lettura righe): VOEEMCLODAILTOIAT R1: VOE R2: EMCLO R3: DAILTO - R4: IAT • Nessuna lettera modificata → conserva frequenze • Vulnerabile ad anagramming se breve • Chiave = numero righe (piccolo spazio)
🎯 Esempio in classe

Scrivi VEDIAMOCIALLEOTTO sulla lavagna con 4 righe a zig-zag. Fai leggere agli studenti riga per riga → ottieni VOEEMCLODAILTOIAT. Poi chiedi: quante combinazioni di chiavi? Solo 2-8 righe → forza bruta banale. Se intercetti e conosci che è Rail Fence, provi 7 possibilità e hai finito.

7. Cifrari polialfabetici: Vigenère e One-Time Pad

Per contrastare l'analisi delle frequenze, nel XV secolo Leon Battista Alberti introdusse i cifrari polialfabetici, che usano più alfabeti di sostituzione diversi. Il più celebre è il cifrario di Vigenère: la chiave è una parola che determina, lettera per lettera, lo scorrimento da applicare.

ESEMPIO · VIGENERE
Testo: ILCIFRARIODIVIGENEREUSAALFABETIDIVERSI Chiave: ESEMPIODICHIAVELUNGAESEMPIODICHIAVELUN (ripetuta) I(8) + E(4) = N(13) -> prima lettera L(11)+ S(18)= D(3) -> wrap mod 26 Cifrato: NEHVVAPVRRLRWELQISYFZLFNBOPFNWQMJRJDNW Proprietà chiave: - Stessa 'I' in plaintext -> N in pos 1, Q in pos 18 -> polialfabetico ✓ - Sicurezza = lunghezza chiave - K=1 -> equivale a Cesare - K = len(T) random mai riusata -> One-Time Pad inviolabile Decifratura: P = (C - K) mod 26
💬 Tip del docente

Per Vigenère ricorda la frase: "Chiave lunga = sicurezza lunga". Se ti chiedono perché è meglio di Cesare, rispondi: "Perché la stessa lettera in chiaro produce lettere diverse cifrate, quindi rompe l'analisi delle frequenze". Poi citi subito il limite: se la chiave è corta e ripetuta, Kasiski la rompe cercando trigrammi ripetuti.

One-Time Pad — l'unico cifrario perfetto

Il One-Time Pad (OTP) è un caso speciale di cifrario a flusso in cui il keystream ha la stessa lunghezza del messaggio, è completamente casuale e non viene mai riutilizzato. Claude Shannon dimostrò nel 1949 che è l'unico sistema incondizionatamente sicuro.

✅ VANTAGGI TEORICI

Sicurezza incondizionata

Proven secure matematicamente. Usato hotline USA-URSS Guerra Fredda. Nessun attacco possibile nemmeno con computer infinito.

❌ LIMITI PRATICI

Distribuzione impossibile

Chiave lunga quanto messaggio, mai riutilizzabile, veramente casuale. Problema del key exchange irrisolto su larga scala — ecco perché usiamo AES+RSA.

PYTHON · OTP DEMO
import secrets def otp_encrypt(plaintext: bytes): key = secrets.token_bytes(len(plaintext)) # random vera cipher = bytes(p ^ k for p,k in zip(plaintext, key)) return cipher, key msg = b"ATTACCO ALLE 8" c, k = otp_encrypt(msg) print(f"Cifrato: {c.hex()}") print(f"Chiave: {k.hex()} # lunga quanto il messaggio!") # Se riutilizzi k per due messaggi m1,m2: # c1 xor c2 = m1 xor m2 -> attacco immediato!

8. I principi di Shannon: diffusione, confusione e tipi di sicurezza

Nel 1949 Claude Shannon pubblicò "Communication Theory of Secrecy Systems", fondando la crittografia moderna. Individuò due proprietà essenziali:

PRINCIPIO 1 · DIFFUSIONE 🌊

Ogni bit di T influenza molti bit di X

Una singola modifica nel plaintext deve propagarsi su tutto il crittogramma. Nasconde relazione statistica T-X. Realizzata con permutazioni (P-box).

PRINCIPIO 2 · CONFUSIONE 🔀

Relazione K-X complessa e non lineare

Ogni bit della chiave influenza molti bit di X in modo non lineare. Impossibile dedurre K da coppie T/X. Realizzata con sostituzioni S-box.

Questi due principi sono alla base di tutti gli algoritmi moderni: AES combina S-box (confusione) e ShiftRows/MixColumns (diffusione) in 10-14 round.

CriterioSicurezza INCONDIZIONATASicurezza COMPUTAZIONALE
DefinizioneNon violabile nemmeno con risorse infiniteCosto violazione > valore informazione
EsempioSolo One-Time PadAES, RSA, ECC, ChaCha20
RealismoTeorico, non scalabileModello reale di Internet (TLS 1.3)
AttaccoImpossibile matematicamenteRichiede 2^128 operazioni → infattibile
⚠️ Confusione da evitare

Non confondere cifrario simmetrico (stessa chiave) con simmetrico nel senso di semplice. AES è simmetrico ma molto più complesso di RSA. La distinzione simmetrica/asimmetrica riguarda SOLO il numero di chiavi, non la difficoltà.

9. Verifica / Esercizio guidato

🔬 Attività — decifra come un crittoanalista

Hai intercettato tre messaggi sul WiFi del lab. Applica quanto studiato e documenta il ragionamento.

  1. Cesare: C= KHOOR ZRUOG - sai che K=3 storico. Decifra e spiega perché lo spazio chiavi è banale. Come lo romperesti con analisi frequenze se K ignota?
  2. Rail Fence: C= VOEEMCLODAILTOIAT - sai che è Rail Fence 4 righe per messaggio "VEDIAMOCIALLEOTTO". Ricostruisci la griglia zig-zag e verifica il cifrato.
  3. Vigenère: T= ATTACCA, K= LEMON. Cifra passo-passo (A=0). Poi spiega perché la stessa A in ATTACCA produce lettere diverse in uscita e quale proprietà di Shannon introduce.
  4. Shannon: Un sistema usa solo sostituzione monoalfabetica senza permutazione. Quale principio manca (diffusione/confusione)? Perché AES ne usa entrambi per 10 round?
✅ Soluzione ragionata

1) Cesare KHOOR → HELLO WORLD: Decifratura (C-K) mod26. H(7)-3=E(4), K(10)-3=H(7)... Spazio 26 chiavi → brute force <1ms. Analisi frequenze: in inglese 'O' è 2° più frequente; in "KHOOR ZRUOG", O è più frequente (3 volte) → O cifrata → risali a K=3 perché E(4)+3=H(7) ma O(14) è R(17)? Conta reale: cerca lettera più frequente → R? Calcoli shift fino a formare parola sensata.

2) Rail Fence: Griglia 4 righe zig-zag: R1 indice 0,6,12; R2 1,5,7,11,13; R3 2,4,8,10,14,15; R4 3,9. Ricomposizione righe: VOE + EMCLO + DAILTO + IAT = VOEEMCLODAILTOIAT verifica OK. Spazio chiavi = numero righe 2..len/2 → 7 prove per len 16 → insicuro.

3) Vigenère: ATTACCA (0,19,19,0,2,2,0) + LEMONLE (11,4,12,14,13,11,4) = 11,23,5,14,15,13,4 → L X F O P N E? Ricalcolo: A+L=L, T+E=X, T+M=F, A+O=O, C+N=P, C+O=Q, A+L=M? Output LXFOPQM. Polialfabetico → confusione, rompe frequenze. Ogni A (0) + chiavi diverse → L,O,Q... → confusione di Shannon.

4) Shannon: Manca diffusione (nessuna permutazione dei bit). Solo sostituzione = confusione. AES usa 10 round di SubBytes (confusione via S-box) + ShiftRows/MixColumns (diffusione) perché un principio solo lascia correlazioni statistiche sfruttabili (vedi attacco lineare/differenziale).

✓Sistema crittografico = T,K,C,D,X + principio di Kerckhoffs: la sicurezza sta solo in K, non nell'algoritmo segreto
✓Classificazione a 3 assi: trasformazione (sostituzione/trasposizione), elaborazione (block/stream), chiavi (simmetrica/asimmetrica) — gli assi sono ortogonali
✓Cesare = 26 chiavi → brute force istantaneo + vulnerabile ad analisi frequenze; Rail Fence = trasposizione, conserva frequenze, chiave = n righe
✓Vigenère = polialfabetico: chiave parola → stessa lettera in chiaro → lettere diverse cifrate; se |K|=|T| random mai riusata → One-Time Pad perfetto
✓Shannon: diffusione (nasconde T-X) + confusione (nasconde K-X) + distinzione sicurezza incondizionata (solo OTP) vs computazionale (AES,RSA) base di TLS 1.3

📚 Prossimo passo — Crittografia simmetrica DES 3DES AES

Ora che sai cos'è un crittosistema e perché Cesare e Vigenère non bastano, vedremo come AES applica diffusione e confusione in 10-14 round per ottenere sicurezza computazionale reale. Porta con te la tabella forza bruta e le formule C=(P+K) mod26.