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