Steganografia, in cosa consiste?

Parole
Federico Di Filitto
Immagini
Corinna Stacchini
Tempo di lettura
5

Come nascondere un messaggio segreto all’interno di un’immagine

T

Steganografia, cos’è?

Per spiegare meglio la differenza, possiamo immaginare la crittografia come una scatola chiusa da un lucchetto e con al suo interno un messaggio importante che non vogliamo rivelare. La steganografia è invece più simile a scrivere il proprio messaggio con inchiostro invisibile. Nel primo caso il messaggio viene reso inaccessibile da chi non è in possesso della chiave del lucchetto, mentre nel secondo caso viene nascosto a occhi estranei, ma rimane comunque facilmente leggibile da chiunque sappia della sua esistenza. 

Ci sono diversi modi per applicare la steganografia, ma quello più comune è senza dubbio incapsulare il messaggio segreto dentro un altro dato che fa da contenitore. Per poter fare questo è necessario che il contenitore abbia particolari caratteristiche e non può essere un qualsiasi file. Per essere un contenitore, un file deve essere in grado di essere modificato (anche se di poco) senza che tali modifiche possano essere riconosciute. 

Perché proprio un’immagine

Un'immagine è un perfetto esempio di contenitore. Date un’occhiata all’immagine sotto, la parte sinistra e quella destra sono dello stesso colore o sono colori diversi?

img1

Un'immagine è fatta da migliaia di pixel. Ogni pixel è un quadratino di un certo colore. Quanti colori diversi può avere questo quadratino? Se prendiamo in esame un'immagine semplice, il colore di un pixel viene determinato da tre valori numerici che vanno ciascuno da 0 a 255. Questi rappresentano il valore RGB del pixel (red, green, blue). Questi numeri definiscono la tonalità di rosso, verde e blu del colore. Facendo due conti scopriamo che un pixel può assumere 16.7 milioni di colori. Sono un bel po' di colori. 

La cosa più interessante è che se proviamo a confrontare colori che hanno un valore RGB molto vicino, non siamo in grado di riconoscere la differenza ad occhio nudo molto facilmente. Infatti, i colori raffigurati prima sono differenti.

img2

Possiamo modificare leggermente i colori di un'immagine senza che questa cambi molto. Questa è la caratteristica che cercavamo per il nostro contenitore.

Come funziona la codifica

L'obiettivo adesso è quello di manipolare di poco questi numeri in modo da poter codificare un messaggio.

Ogni informazione digitale è fatta da 0 e 1, e un messaggio di testo non fa eccezione. Ad esempio il testo "ok" in binario equivale a 0110111101101011. Il messaggio in formato binario è molto più semplice da codificare nell'immagine. 

Per farlo, cominciamo con prendere il primo valore RGB del primo pixel. Come spiegato prima questo non è altro che un numerino da 0 a 255. Qualsiasi sia il numerino, possiamo sommare di 1 in modo tale da renderlo pari o dispari a nostro piacimento. E possiamo quindi decidere che se la prima cifra del messaggio in binario è 0 allora rendiamo il valore RGB pari, se è 1 lo rendiamo dispari. 

Il messaggio "ok" ha come prima cifra in binario uno 0. Questo significa che il valore RGB dovrà essere convertito a pari. Mettiamo caso che il primo valore sia 125, che è un numero dispari. Siccome noi vogliamo un numero pari allora sostituiamo 125 con 126.

La prossima cifra del messaggio è un 1. Se il secondo valore RGB è 67, allora non c'è bisogno di fare nulla dato che è già dispari e lo lasciamo così com'è.

Proseguiamo in questo modo finchè non terminiamo tutti i 0 e 1 del messaggio segreto.

Per capire meglio, aiutatevi con lo schema qua sotto. La prima riga contiene i valori dell’immagine originale, la seconda i valori del messaggio e infine la terza rappresenta l’immagine con il messaggio codificato.

img3

E il gioco è fatto! Per decodificare il messaggio dall'immagine ottenuta, basterà eseguire il processo inverso. Quindi si prende il primo valore RGB che è 126 e notiamo che è pari, questo significa che il nostro messaggio segreto inizia per 0. Successivamente abbiamo 67 che è un numero dispari, allora aggiungiamo 1 al messaggio segreto. E proseguiamo così fino a terminare il messaggio.

Uno sguardo più da vicino

Per i più esperti cerchiamo di fornire una spiegazione più tecnica. Vediamo come i bit vengono manipolati nel dettaglio.

Eseguiamo questi passaggi per ogni bit del messaggio:

  1. Selezioniamo il byte dell’immagine corrispondente al bit del messaggio. Quindi se siamo al primo bit del messaggio prendiamo il primo byte dell’immagine, se siamo al secondo prendiamo il secondo, e così via.
  2. Portiamo a 0 il bit meno significativo del byte dell’immagine. Se ad esempio abbiamo 10101011 come byte, per portare a 0 il bit meno significativo basta eseguire un AND con 11111110. Esempio: 10101011 & 11111110 = 10101010
  3. Eseguiamo un OR con il bit del messaggio segreto e con il byte ottenuto nel passaggio precedente. Mettiamo caso che il bit del messaggio sia 1, allora facciamo 10101010 | 000000001 = 10101011. Se fosse stato 0: 10101010 | 000000000 = 10101010.
  4. Siamo riusciti a produrre il primo byte della nuova immagine! Adesso ripetiamo tutti i passaggi per tutti i bit da codificare.

Durante la decodifica è necessario sapere quanto è lungo il messaggio, per sapere fino quale byte leggere prima di fermarsi. Basta aggiungere un header al messaggio che contiene la lunghezza in byte di quanto è lungo. Ma non ho voluto trattare questo aspetto per non complicare ulteriormente l’articolo.

Per i più curiosi, vi lascio qui un collegamento a un programma scritto da me in grado di fare esattamente quanto descritto. Si chiama ‘strega’, è scritto in rust ed utilizzabile da linea di comando o anche in una web app attraverso web assembly.

Il metodo spiegato è molto semplice e banale. Ci sono molte implementazioni di steganografia più efficienti e migliori. Questo è solo un modo che ho scelto io per cercare di mantenere una bassa complessità.

Sì, ma a cosa serve?

La steganografia non viene proprio usata all’ordine del giorno. È uno strumento che si usa molto più di rado rispetto alla crittografia.

Un’applicazione legittima è quella di aggiungere un cosiddetto ‘watermark’ a un file multimediale come una canzone, un video o un’immagine. Tutti questi sono ottimi potenziali contenitori. Applicando il watermark viene assegnato un marchio che identifica il file e specifica come deve essere condiviso. In questo modo è possibile prendere un file che è stato condiviso senza permesso e scoprirne la sua vera sorgente.

La steganografia occasionalmente viene sfruttata dagli hacker. Capita che un malintenzionato possa nascondere il codice di un virus all’interno di un’immagine. Questo rende la rilevazione del virus davvero difficile. Scaricare l’immagine con il codice del virus non è comunque sufficiente per attivare il virus, l’attaccante avrebbe comunque bisogno di un modo per eseguire il codice nascosto. Il che non è impossibile, ma comunque non è abbastanza pericoloso da dover cancellare tutte le immagini e i video dai nostri dispositivi.

Anche noi possiamo usare la steganografia a nostro vantaggio. Banalmente se vogliamo tenere un testo nascosto come delle password o delle chiavi segrete.

Prima di fare questo sarebbe bene prima criptare queste informazioni e poi applicarci sopra la steganografia.

Se vi interessa una cosa del genere, vi consiglio di informarvi e fare le dovute ricerche per capire i vantaggi e i rischi di questa tecnica. Specialmente se avete intenzione di salvare dati molto sensibili. Ad esempio vi state prendendo la responsabilità di conservare il file in modo sicuro, perché ovviamente se dovesse capitare di cancellare per sbaglio il file con le informazioni a noi tanto care, queste verrebbero perse.

Detto questo, la steganografia è un ottimo modo per nascondere questo genere di dati.

Analizza la tua presenza online.

Scrivici per una consulenza gratuita



Richiedi consulenza

Federico Di Filitto

Backend Developer

Scrivere non è il mio forte, ma proprio per niente. Le parole sono difficili, cambiano di significato in base al contesto, le emozioni, la tonalità e soprattutto chi ascolta.

Profilo e articoli