Esteganografia LSB

Hi havia una vegada que vaig escriure el meu primera publicació al hub. I aquest post estava dedicat a un problema molt interessant, és a dir, l'esteganografia. Per descomptat, la solució proposada en aquell vell tema no es pot anomenar esteganografia en el veritable sentit de la paraula. És només un joc amb formats de fitxer, però, tanmateix, un joc força interessant.

Avui intentarem aprofundir una mica més i mirar l'algorisme LSB. Si esteu interessats, sou benvinguts sota cat. (Sota el tall hi ha trànsit: aproximadament un megabyte.)

En primer lloc, cal fer una breu introducció. Tothom sap que l'objectiu de la criptografia és fer impossible la lectura d'informació secreta. Per descomptat, la criptografia té les seves aplicacions, però hi ha un altre enfocament de la protecció de dades. No hem de xifrar la informació, sinó fer veure que no la tenim. Precisament per això es va inventar l'esteganografia. La Viquipèdia ens assegura que “l'esteganografia (del grec στεγανοσ - ocult i del grec γραφω - escric, literalment "escriptura secreta") és la ciència de la transmissió oculta de la informació mantenint en secret el fet mateix de la transmissió.

Per descomptat, ningú prohibeix combinar mètodes criptogràfics i esteganogràfics. A més, a la pràctica ho fan, però la nostra tasca és entendre els fonaments. Si estudieu detingudament l'article de la Viquipèdia, descobrireu que els algorismes d'esteganografia inclouen els anomenats. contenidor i missatge. Un contenidor és qualsevol informació que ajuda a amagar el nostre missatge secret.

En el nostre cas, el contenidor serà una imatge en format BMP. Primer, mirem l'estructura d'aquest fitxer. El fitxer es pot dividir en 4 parts: capçalera del fitxer, capçalera de la imatge, paleta i la pròpia imatge. Per als nostres propòsits, només necessitem saber què hi ha escrit a la capçalera.

Els dos primers bytes de la capçalera són la signatura BM, després la mida del fitxer en bytes s'escriu en una paraula doble, els 4 bytes següents estan reservats i han de contenir zeros i, finalment, una altra paraula doble conté el desplaçament des del començament de la capçalera. fitxer als bytes reals de la imatge. En un fitxer bmp de 24 bits, cada píxel està codificat amb tres bytes BGR.

Ara ja sabem com arribar a la imatge, només queda entendre com hi podem escriure la informació que necessitem. Per a això necessitarem el mètode LSB. L'essència del mètode és la següent: substituïm els bits menys significatius en els bytes responsables de la codificació de colors. Suposem que si el següent byte del nostre missatge secret és 11001011 i els bytes de la imatge són... 11101100 01001110 01111100 0101100111..., la codificació tindrà aquest aspecte. Dividirem el byte del missatge secret en 4 parts de dos bits: 11, 00, 10, 11 i substituirem els bits de baix ordre de la imatge amb els fragments resultants: ...11101111 01001100 01111110 0101100111…. Aquest reemplaçament generalment no és perceptible a l'ull humà. A més, molts dispositius de sortida més antics ni tan sols podran mostrar canvis tan petits.

Està clar que podeu canviar no només els 2 bits menys significatius, sinó qualsevol nombre d'ells. Hi ha el següent patró: com més bits canviem, més informació podem amagar i més interferències provocarà a la imatge original. Per exemple, aquí teniu dues imatges:

Esteganografia LSB
Esteganografia LSB

Malgrat els meus esforços, no vaig poder veure la diferència entre ells, però tanmateix, a la segona imatge, utilitzant el mètode descrit, s'amaga el poema de Lewis Carroll "The Hunting of the Snark". Si heu llegit fins aquí, probablement us interessa conèixer la implementació. És bastant senzill, però us avisaré de seguida que tot es fa a Delphi. Hi ha dues raons per a això: 1. Crec que Delphi és una bona llengua; 2. Aquest programa neix en el procés de preparació d'un curs sobre els fonaments de la visió per computador, i els nois als quals imparteixo aquest curs encara no saben res més que Delphi. Per a aquells que no estiguin familiaritzats amb la sintaxi, cal explicar una cosa: shl x és un desplaçament de bits a l'esquerra per x, shr x és un desplaçament de bits a la dreta de x.

Suposem que estem escrivint text emmagatzemat en una cadena al contenidor i substituint els dos bytes inferiors:
Codi de gravació:

per i:=1 a length(str) do
    començar
      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.Posició:=f.Posició-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posició:=f.Posició-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posició:=f.Posició-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posició:=f.Posició-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    fi;

codi per llegir:

per i:=1 a MsgSize do
    començar
      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+char(l1+l2+l3+l4);
    fi;

Bé, per als realment mandrosos... enllaç al programa i al seu codi font.

Gràcies.

Font: www.habr.com

Afegeix comentari