Dentro l’Immagine: L’Arte Segreta della Steganografia Digitale

13 Gennaio 2026  di  Tech News


Immagina di inviare un messaggio segreto nascosto dentro una foto di un gatto. Nessuna crittografia visibile, nessun file allegato. Solo un’immagine apparentemente innocua. Fantascienza? No: è steganografia.

Benvenuti nel mondo affascinante della steganografia digitale, dove i pixel diventano messaggeri silenziosi.

Cos’è la Steganografia?

La steganografia è l’arte di nascondere informazioni all’interno di altri contenuti. A differenza della crittografia, che rende i dati illeggibili, la steganografia nasconde l’esistenza stessa del messaggio.

Nel mondo digitale, il mezzo più comune per nascondere dati è un file immagine. Perché? Perché un’immagine contiene milioni di pixel, e ognuno può essere leggermente modificato senza che l’occhio umano se ne accorga.

Origini della Steganografia

La steganografia affonda le sue radici nell’antichità, molto prima dell’era digitale. Il termine deriva dal greco steganos (“coperto”) e graphein (“scrivere”), cioè “scrivere nascosto”. Le prime forme documentate risalgono all’antica Grecia: Erodoto racconta di messaggi incisi su tavolette di legno poi ricoperte di cera, così da apparire completamente vuote. Nel Medioevo si usavano inchiostri invisibili ricavati da sostanze naturali, mentre durante le guerre mondiali venivano nascosti messaggi in microfilm, ricami, fotografie o persino all’interno di lettere apparentemente innocue. Con l’avvento dell’informatica, la steganografia si è trasformata: non più parole celate sotto la cera, ma bit nascosti dentro immagini, audio, video o altri file digitali. L’obiettivo, però, è rimasto identico nei secoli: non proteggere il contenuto del messaggio, ma nasconderne l’esistenza stessa, rendendo la comunicazione invisibile agli occhi di chi non sa cosa cercare.

Come Funziona: Il Potere dei Bit Invisibili

Ogni pixel in un’immagine RGB è composto da tre valori: Rosso, Verde e Blu (RGB). Ognuno di questi è rappresentato da 8 bit (valori da 0 a 255). La tecnica più usata per la steganografia è la Least Significant Bit (LSB), ovvero la modifica del bit meno significativo.

Esempio:

Un valore di rosso puro:

R = 11111111 (255)

Cambiare l’ultimo bit:

R = 11111110 (254)

La differenza è invisibile, ma quel singolo bit può contenere un frammento di messaggio.

Ripetendo questo processo su migliaia di pixel, è possibile nascondere interi testi, file, o persino altri media.

Strumenti per Nascondere Dati nelle Immagini

1. Steghide

Un classico della steganografia da terminale. Supporta file JPEG e BMP, compressione e password.

steghide embed -cf immagine.jpg -ef segreto.txt -p password123
steghide extract -sf immagine.jpg -p password123

2. OpenStego

Interfaccia grafica semplice, perfetta per chi non ama la riga di comando. Supporta watermarking e file nascosti.

3. zsteg

Strumento avanzato per PNG e BMP, molto usato nei CTF (Capture The Flag) e nell’analisi forense.

zsteg immagine.png

4. Python + PIL

Per i più smanettoni, è possibile scrivere uno script in Python che codifica un messaggio nei bit LSB di ogni pixel. Vuoi un esempio? Te lo preparo volentieri.

import sys
import os
from PIL import Image

END_MARKER = "§"  # carattere di fine messaggio


# ------------------------------------------------------------
# 1. Se l'immagine è JPG, convertila in PNG per evitare perdita dati
# ------------------------------------------------------------
def ensure_png(image_path):
    ext = os.path.splitext(image_path)[1].lower()
    if ext in [".jpg", ".jpeg"]:
        img = Image.open(image_path).convert("RGB")
        png_path = "converted_input.png"
        img.save(png_path)
        print(f"[INFO] Convertito {image_path} in {png_path}")
        return png_path
    return image_path


# ------------------------------------------------------------
# 2. Codifica LSB (solo canale R per semplicità e stabilità)
# ------------------------------------------------------------
def encode_message(image_path, message, output_path="stego_output.png"):
    img = Image.open(image_path).convert("RGB")
    encoded = img.copy()
    width, height = img.size

    # prepara messaggio + marcatore
    message += END_MARKER
    bits = ''.join(format(ord(c), '08b') for c in message)

    capacity = width * height  # 1 bit per pixel

    if len(bits) > capacity:
        raise ValueError(
            f"Messaggio troppo lungo ({len(bits)} bit). "
            f"L'immagine può contenere solo {capacity} bit."
        )

    data_index = 0
    for y in range(height):
        for x in range(width):
            if data_index >= len(bits):
                break

            r, g, b = encoded.getpixel((x, y))
            r = (r & ~1) | int(bits[data_index])
            encoded.putpixel((x, y), (r, g, b))

            data_index += 1

        if data_index >= len(bits):
            break

    encoded.save(output_path)
    print(f"[OK] Messaggio nascosto in {output_path}")


# ------------------------------------------------------------
# 3. Decodifica LSB
# ------------------------------------------------------------
def decode_message(image_path):
    img = Image.open(image_path).convert("RGB")
    width, height = img.size

    bits = []
    for y in range(height):
        for x in range(width):
            r, g, b = img.getpixel((x, y))
            bits.append(str(r & 1))

    message = ""
    for i in range(0, len(bits), 8):
        byte = bits[i:i+8]
        if len(byte) < 8:
            break

        char = chr(int("".join(byte), 2))

        if char == END_MARKER:
            break

        message += char

    print("[OK] Messaggio estratto:")
    print(message)


# ------------------------------------------------------------
# 4. Main
# ------------------------------------------------------------
def main():
    if len(sys.argv) < 2:
        print("Uso:")
        print("  python stego.py immagine.png \"messaggio da inserire\"")
        print("  python stego.py immagine_stego.png")
        return

    image_path = ensure_png(sys.argv[1])

    if len(sys.argv) == 3:
        message = sys.argv[2]
        encode_message(image_path, message)
    else:
        decode_message(image_path)


if __name__ == "__main__":
    main()


Salva il codice sopra scritto col nome stego.py ed usalo in questo modo:
# python3 -m venv .venv
# . .venv/bin/activate
# pip install pillow
# 
# python stego.py gatto.png "Questo è un messaggio segreto"
# python stego.py stego_output.png

Il risultato è il messaggio nascosto dentro l’immagine gatto.png.

Quando Usarla (Legalmente)

  • Attivismo digitale: comunicazioni sicure in contesti oppressivi
  • Puzzle e giochi: sfide hacker e CTF
  • Arte concettuale: messaggi nascosti in opere digitali
  • Didattica: quiz o indizi nascosti per studenti

Attenzione: Etica e Limiti

Come ogni tecnologia potente, la steganografia può essere usata per il bene o per il male. È importante ricordare che:

  • I file compressi (come JPEG) possono danneggiare i dati nascosti
  • I sistemi di steganalisi possono rilevare anomalie statistiche
  • L’uso improprio può avere implicazioni legali

Conclusione

Prova a trovare il codice nascosto dentro l’immagine in copertina!

La prossima volta che guarderai una foto online, chiediti:

Cosa c’è davvero dentro quei pixel?

Forse un messaggio. Forse un segreto. O forse solo un tramonto… con qualcosa in più.

Potrebbe Interessarti


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *