Steganografia LSB

Una volta scrivevo il mio primo post su hub. E quel post era dedicato a un problema molto interessante, ovvero la steganografia. Naturalmente la soluzione proposta in quel vecchio argomento non può essere definita steganografia nel vero senso della parola. È solo un gioco con formati di file, ma è comunque un gioco piuttosto interessante.

Oggi proveremo a scavare un po' più a fondo e a guardare l'algoritmo LSB. Se sei interessato, sei il benvenuto nella cat. (Sotto il taglio c'è il traffico: circa un megabyte.)

Innanzitutto è necessario fare una breve introduzione. Tutti sanno che lo scopo della crittografia è rendere impossibile la lettura delle informazioni segrete. Naturalmente la crittografia ha le sue applicazioni, ma esiste un altro approccio alla protezione dei dati. Non dobbiamo crittografare le informazioni, ma fingere di non averle. Questo è esattamente il motivo per cui è stata inventata la steganografia. Wikipedia ci assicura che “la steganografia (dal greco στεγανοσ - nascosto e dal greco γραφω - scrivo, letteralmente “scrittura segreta”) è la scienza della trasmissione nascosta delle informazioni mantenendo segreto il fatto stesso della trasmissione.

Naturalmente nessuno vieta di combinare metodi crittografici e steganografici. Inoltre, in pratica lo fanno, ma il nostro compito è comprenderne le basi. Se studi attentamente l'articolo di Wikipedia, scoprirai che gli algoritmi di steganografia includono il cosiddetto. contenitore e messaggio. Un contenitore è qualsiasi informazione che aiuta a nascondere il nostro messaggio segreto.

Nel nostro caso il contenitore sarà un'immagine in formato BMP. Innanzitutto, diamo un'occhiata alla struttura di questo file. Il file può essere diviso in 4 parti: intestazione del file, intestazione dell'immagine, tavolozza e l'immagine stessa. Per i nostri scopi, dobbiamo solo sapere cosa c'è scritto nell'intestazione.

I primi due byte dell'intestazione sono la firma BM, poi la dimensione del file in byte è scritta in una doppia parola, i successivi 4 byte sono riservati e devono contenere zeri e infine un'altra doppia parola contiene l'offset dall'inizio dell'intestazione file nei byte effettivi dell'immagine. In un file bmp a 24 bit, ogni pixel è codificato con tre byte BGR.

Ora sappiamo come arrivare all'immagine, non resta che capire come possiamo scrivere lì le informazioni di cui abbiamo bisogno. Per questo avremo bisogno del metodo LSB. L'essenza del metodo è la seguente: sostituiamo i bit meno significativi nei byte responsabili della codifica dei colori. Diciamo che se il byte successivo del nostro messaggio segreto è 11001011 e i byte nell'immagine sono...11101100 01001110 01111100 0101100111..., la codifica sarà simile a questa. Divideremo il byte del messaggio segreto in 4 parti da due bit: 11, 00, 10, 11, e sostituiremo i bit di ordine inferiore dell'immagine con i frammenti risultanti: ...11101111 01001100/01111110…. Generalmente tale sostituzione non è visibile all'occhio umano. Inoltre, molti dispositivi di output più vecchi non saranno nemmeno in grado di visualizzare modifiche così piccole.

È chiaro che è possibile modificare non solo i 2 bit meno significativi, ma un numero qualsiasi di essi. Esiste il seguente schema: più bit modifichiamo, più informazioni possiamo nascondere e maggiore sarà l'interferenza che ciò causerà nell'immagine originale. Ad esempio, ecco due immagini:

Steganografia LSB
Steganografia LSB

Nonostante i miei migliori sforzi, non sono riuscito a vedere la differenza tra loro, ma tuttavia, nella seconda immagine, utilizzando il metodo descritto, la poesia di Lewis Carroll “La caccia allo Snark” è nascosta. Se hai letto fin qui, probabilmente sei interessato a conoscere l'implementazione. È abbastanza semplice, ma ti avverto subito che tutto è fatto in Delphi. Ci sono due ragioni per questo: 1. Penso che Delphi sia un buon linguaggio; 2. Questo programma è nato durante la preparazione di un corso sulle basi della visione artificiale, e i ragazzi a cui insegno questo corso non sanno ancora altro che Delphi. Per coloro che non hanno familiarità con la sintassi, è necessario spiegare una cosa: shl x è uno spostamento bit a sinistra di x, shr x è uno spostamento bit a destra di x.

Supponiamo di scrivere il testo memorizzato in una stringa nel contenitore e di sostituire i due byte inferiori:
Codice di registrazione:

for i:=1 to length(str) do
    iniziare
      l1:=byte(str[i]) shr 6;
      l2:=byte(str[i]) shl 2; l2:=l2 shr 6;
      l3:=byte(str[i]) shl 4; l3:=l3 shr 6;
      l4:=byte(str[i]) shl 6; l4:=l4 shr 6;
 
      f.ReadBuffer(tmp,1);
      f.Posizione:=f.Posizione-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posizione:=f.Posizione-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posizione:=f.Posizione-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posizione:=f.Posizione-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    fine;

codice da leggere:

for i:=1 a MsgSize do
    iniziare
      f.ReadBuffer(tmp,1);
      l1:=tmp shl 6;
      f.ReadBuffer(tmp,1);
      l2:=tmp shl 6; l2:=l2 shr 2;
      f.ReadBuffer(tmp,1);
      l3:=tmp shl 6; l3:=l3 shr 4;
      f.ReadBuffer(tmp,1);
      l4:=tmp shl 6; l4:=l4 shr 6;
      str:=str+car(l1+l2+l3+l4);
    fine;

Beh, per i più pigri... collegamento al programma e al suo codice sorgente.

Grazie.

Fonte: habr.com

Aggiungi un commento