In questa lezione impari a
- distinguere steganografia e crittografia
- nascondere ed estrarre un messaggio dentro un'immagine
- combinare cifratura e steganografia
- ragionare sugli usi leciti e sugli abusi di questi strumenti
Nascondere invece di cifrare
La crittografia rende un messaggio illeggibile, ma è evidente che esiste un segreto: chi lo intercetta vede dei dati cifrati. La steganografia fa l'opposto: nasconde il messaggio dentro un contenitore dall'aspetto innocuo — tipicamente un'immagine — in modo che non si sospetti nemmeno che ci sia qualcosa.
| Crittografia | Steganografia | |
|---|---|---|
| Obiettivo | Rendere illeggibile il contenuto | Nascondere l'esistenza del messaggio |
| Si nota? | Sì, i dati cifrati sono visibili | No, sembra un file normale |
| Massima sicurezza | Insieme: prima cifrare, poi nascondere |
Come funziona (idea di base): un'immagine è fatta di pixel, ognuno con valori di rosso, verde e blu da 0 a 255. Cambiando l'ultimo bit di questi valori (la tecnica LSB, Least Significant Bit) il colore varia in modo impercettibile all'occhio, ma in quei bit si può «scrivere» un messaggio.
Lab: nascondere un messaggio in un'immagine
Il modo più rapido è la libreria stepic, insieme a Pillow per aprire le immagini. Serve un'immagine PNG (il JPEG comprime e rovinerebbe i bit nascosti).
pip install Pillow stepic
from PIL import Image
import stepic
# --- NASCONDERE ---
immagine = Image.open("python.png")
immagine2 = stepic.encode(immagine, b"messaggioSuperSegreto")
immagine2.save("immagine_con_segreto.png", "PNG")
# --- ESTRARRE ---
immagine2 = Image.open("immagine_con_segreto.png")
segreto = stepic.decode(immagine2)
print("Il segreto è:", segreto)
Le due immagini sembreranno identiche, ma la seconda contiene il messaggio.
Se
pip install stepicnon funziona (succede con le versioni più recenti di Python), usa questa versione che richiede solo Pillow e fa la stessa cosa con la tecnica LSB.
Versione senza stepic (solo Pillow)
Mostra il codice
from PIL import Image
def nascondi(file_in, testo, file_out):
img = Image.open(file_in).convert("RGB")
dati = testo.encode("utf-8")
# 32 bit per la lunghezza + i bit del messaggio
flusso = f"{len(dati):032b}" + "".join(f"{b:08b}" for b in dati)
pixel = list(img.getdata())
if len(flusso) > len(pixel) * 3:
raise ValueError("Immagine troppo piccola per il messaggio")
nuovi = []
i = 0
for (r, g, b) in pixel:
canali = [r, g, b]
for c in range(3):
if i < len(flusso):
canali[c] = (canali[c] & ~1) | int(flusso[i])
i += 1
nuovi.append(tuple(canali))
img.putdata(nuovi)
img.save(file_out, "PNG")
def estrai(file_in):
img = Image.open(file_in).convert("RGB")
bit = "".join(str(canale & 1) for px in img.getdata() for canale in px)
n = int(bit[:32], 2) # lunghezza del messaggio
corpo = bit[32:32 + n * 8]
byte = bytes(int(corpo[j:j+8], 2) for j in range(0, len(corpo), 8))
return byte.decode("utf-8")
nascondi("python.png", "messaggioSuperSegreto", "immagine_con_segreto.png")
print("Estratto:", estrai("immagine_con_segreto.png"))
Il massimo: cifrare e poi nascondere
Steganografia e crittografia non sono alternative: insieme sono più forti. Se prima cifri il messaggio con AES (lezione 2) e poi nascondi il testo cifrato nell'immagine, ottieni il meglio dei due mondi: anche se qualcuno scopre che nell'immagine c'è qualcosa, senza la chiave non può leggerlo.
Strumenti neutri, usi non neutri
Hashing, cifratura e steganografia sono strumenti: di per sé non sono né buoni né cattivi. Proteggono la privacy di cittadini, aziende e istituzioni, ma gli stessi strumenti possono essere usati per nascondere attività illecite (per esempio, dati esfiltrati nascosti dentro immagini innocue, come abbiamo accennato parlando dei keylogger).
Vale quindi il principio visto in tutto il percorso di educazione civica: ciò che fa la differenza è l'uso e il rispetto della legge e degli altri. Conoscere questi strumenti ti rende un cittadino digitale più consapevole — capace sia di proteggere i propri dati, sia di riconoscere quando qualcosa non va.
La verifica a risposta multipla ti aspetta su Athena, nell'applicazione Verifiche.
Esercizio finale
Esercizio – Messaggio doppiamente protetto. Unendo le due lezioni: cifra una frase con AES, nascondi il testo cifrato in un'immagine PNG, poi dall'immagine estrai i dati e decifrali per riottenere la frase originale. Descrivi a parole perché questo è più sicuro del solo cifrare o del solo nascondere.
Traccia della soluzione
Si cifra la frase con AES (ottenendo dei byte), si converte il testo cifrato in una forma adatta e lo si nasconde nell'immagine con la funzione nascondi (o stepic); poi si estrae e si decifra con la stessa chiave e IV. È più sicuro perché un attaccante dovrebbe prima accorgersi che nell'immagine c'è un messaggio (steganografia) e poi decifrarlo senza la chiave (crittografia): due barriere invece di una.