Vai al contenuto

Laboratorio: steganografia

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 stepic non 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.