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 0
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:
Aumentando il numero di LSB utilizzati, diminuisce la qualità. Difatti, più il bit si trova alla sinistra della sequenza, più vale, e quindi più altera il colore e di conseguenza l'immagine. E' necessario considerare che con 4 LSB la qualità dell'immagine peggiora visibilmente.
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