articoli

"La steganografia nelle bitmap a 24bit"
7.7.2000

Supponendo che il lettore abbia già qualche idea sul formato bitmap, ma soprattutto che sappia cosa sia la steganografia, qui cercherò di spiegare, nel modo più chiaro possibile, come sia possibile nascondere all'interno di un'innoucua immagine bitmap grandi quantità di dati.

Non tutto è importante
Ogni numero ha una parte cosiddetta "meno significativa", ovvero delle cifre la cui alterazione modifica in maniera minima il numero. Considerando ad esempio 1.000.000.003 (un miliardo e tre), la prima cifra vale 1*10^9, mentre la seconda solo 3. La variazione, quindi, di quest'ultima cifra poco influisce sull'intero numero. Lo stesso vale nel sistema binario: nel numero 1100010 base2 (98 base10), la variazione dell'ultimo bit (da 0 a 1) fa variare il numero in (base 10) da 98 a 99.

La parte meno significativa di un'immagine
Detto questo, il collegamento con le immagini bitmap è rapido. Tali immagini (nel formato 24bit) sono create salvando ordinatamente il colore di ogni pixel in tre byte (questo grazie al formato RGB: 1 byte per il rosso [Red], 1 per il verde [Green] e 1 per il blu [Blue]). I byte hanno dei valori che possono variare da 0 a 255 (totale 256), e quindi (in binario) da 00000000 (cioè 0) a 11111111. L'ultimo bit di una sequenza è definito LSB (Least Significant Byte), e, come detto sopra, la sua variazione influenza ben poco l'intera sequenza di bit (in questo caso il byte). Detto questo, per inserire delle informazioni in un'immagine bitmap senza grandi alterazioni, è possibile utilizzare l'ultimo bit (e non solo, come si vedrà in seguito) di ogni byte, ricavando così un byte ogni 8 byte effettivi dell'immagine. In questo modo si ricavano (Larghezza * Altezza * 3) / 8 byte per inserire le informazioni volute.

Ma ecco un esempio...
Ipotizziamo di avere un'immagine bitmap 8x1 (larghezza x altezza). In base a quanto detto in precedenza, essa occuperà 8x1x3+54, ovvero 78 byte (i 54 byte sono quelli dell'header). Dovremmo quindi essere in grado di inserirvi (Largh*Alt*3)/8 byte, ovvero 3 byte. Ipotizziamo che sia formata dai primi quattro pixel verdi e gli ultimi quattro blu. Nel body avremmo quanto segue

Pixel: 1,1            2,1           3,1            4,1           5,1            6,1             7,1            8,1
Colore:   0 255 0    0 255 0    0 255 0     0 255 0    0 0 255    0 0 255     0 0 255    0 0 255

In binario avremmo

                     Colore                                 Pixel
0000000 0    1111111 1    0000000 0             1,1
0000000 0    1111111 1    0000000 0             2,1
0000000 0    1111111 1    0000000 0             3,1
0000000 0    1111111 1    0000000 0             4,1
0000000 0    0000000 0    1111111 1             5,1
0000000 0    0000000    1111111 1             6,1
0000000 0    0000000 0    1111111 1             7,1
0000000 0    0000000 0    1111111 1             8,1

Decidiamo di inserire il testo "Web". E' inanzitutto necessario convertire ogni lettera in byte, e quindi ogni byte in bit

Lettera         Codice ASCII         Binario         Sequenza di 8 bit (byte)
   W                    87               1010111                 01010111
   e                    101              1100101                 01100101
   b                     98               1100010                 01100010

Detto questo, la nostra immagine diventerà

                      Colore                                Pixel
0000000 0    1111111 1    0000000 0             1,1
0000000 1    1111111 0    0000000 1             2,1
0000000 1    1111111 1    0000000 0             3,1
0000000 1    1111111 1    0000000 0             4,1
0000000 0    0000000 1    1111111 0             5,1
0000000 1    0000000 0    1111111 1             6,1
0000000 1    0000000 0    1111111 0             7,1
0000000 0    0000000 1    1111111 0             8,1

Che in byte diventa

Pixel:      1,1            2,1            3,1            4,1           5,1            6,1             7,1            8,1
Colore:   0 255 0    1 254 1    1 255 0     1 255 0    0 1 254    1 0 255     1 0 254    0 1 254

Ecco le differenze di tonalità tra le due immagini
Originalellllllll
Alterata llllllll

Se state pensando che sto cercando di barare, e credete che le due righe di palline (che rappresentano i pixel dell'immagine) siano dello stesso colore, visualizzate il codice HTML di questa pagina, cercate questo punto e convertite i codici dei colori da esadecimale a RGB...

Visto il risultato, perchè non aumentare il numero di LSB da utilizzare?
In effetti è possibile utilizzare anche più bit, ma occorre effettuare le presenti considerazioni:

Allora che si fa?
Beh, questo tocca a voi deciderlo! In ogni caso, vi ricordo che esistono delle librerie di compressione (chi non conosce la zLib di Jean-Loup Gailly e Mark Alderin?), e che quindi è consigliabile comprimere il file prima di inserirlo all'interno dell'immagine.

Ma ecco il problema sicurezza...
Un problema che non è certo da trascurare è la sicurezza: infatti, se putacaso si scoprisse che l'immagine è contiene informazioni nascoste (cosa non difficile), non sarebbe molto complesso estrarle. E' per questo che è necessario anche criptare i dati (prima o dopo averli compressi, logicamente) con un'altra libreria (ad esempio la CryptLib).

Non solo bitmap, anzi... non solo immagini
Ci tengo a precisarlo, perchè ho paura di avere dato questa impressione: la steganografia può essere effettuata anche con altri tipi di file. Oltre le bitmap (24, 8 o 4 bit che siano) si possono utilizzare anche i file di interscambio GIF e JPEG, i file WAV e MP3, e anche altri formati. In questo articolo ho analizzato solo il formato bitmap in quanto è forse il più facile da capire, ma soprattutto perchè per altri formati (tipo JPEG) è necessario conoscere l'algoritmo di compressione...

Se desiderate approfondire questo argomento la rete pullula di siti sulla steganografia, ed esistono anche diversi libri.
Per quanto riguarda invece la compressione e la criptazione dei file prima di stenografarli, e possibile utilizzare librerie freeware come la Zlib (compressione ZIP) e la CryptLib (criptazione).

Per maggiori informazioni scrivetemi a
ausoftware@iol.it