Steganography ng LSB

Noong unang panahon, isinulat ko ang aking unang post sa hub. At ang post na iyon ay nakatuon sa isang napaka-kagiliw-giliw na problema, katulad steganography. Siyempre, ang solusyong iminungkahi sa lumang paksang iyon ay hindi matatawag na steganography sa tunay na kahulugan ng salita. Ito ay isang laro lamang na may mga format ng file, ngunit isang medyo kawili-wiling laro gayunpaman.

Ngayon ay susubukan naming maghukay ng kaunti pa at tingnan ang algorithm ng LSB. Kung interesado ka, welcome ka sa ilalim ng pusa. (Sa ilalim ng hiwa ay trapiko: mga isang megabyte.)

Una sa lahat, kinakailangan na gumawa ng isang maikling pagpapakilala. Alam ng lahat na ang layunin ng cryptography ay gawing imposibleng basahin ang lihim na impormasyon. Siyempre, may mga aplikasyon ang cryptography, ngunit may isa pang diskarte sa proteksyon ng data. Hindi namin kailangang i-encrypt ang impormasyon, ngunit magpanggap na wala kami nito. Ito ang eksaktong dahilan kung bakit naimbento ang steganography. Tinitiyak sa atin ng Wikipedia na ang "steganography (mula sa Greek στΡγανοσ - nakatago at ang Greek γραφω - sumulat ako, literal na "lihim na pagsulat") ay ang agham ng nakatagong paghahatid ng impormasyon sa pamamagitan ng pagpapanatiling lihim ng mismong katotohanan ng paghahatid.

Siyempre, walang nagbabawal sa pagsasama-sama ng mga pamamaraan ng cryptographic at steganographic. Bukod dito, sa pagsasanay ginagawa nila ito, ngunit ang aming gawain ay upang maunawaan ang mga pangunahing kaalaman. Kung maingat mong pag-aaralan ang artikulo sa Wikipedia, malalaman mo na kasama sa steganography algorithm ang tinatawag na. lalagyan at mensahe. Ang lalagyan ay anumang impormasyon na nakakatulong na itago ang aming sikretong mensahe.

Sa aming kaso, ang lalagyan ay magiging isang imahe sa BMP na format. Una, tingnan natin ang istraktura ng file na ito. Ang file ay maaaring nahahati sa 4 na bahagi: file header, image header, palette at ang imahe mismo. Para sa aming mga layunin, kailangan lang naming malaman kung ano ang nakasulat sa header.

Ang unang dalawang byte ng header ay ang lagda ng BM, pagkatapos ay ang laki ng file sa mga byte ay nakasulat sa isang dobleng salita, ang susunod na 4 na byte ay nakalaan at dapat maglaman ng mga zero, at sa wakas, isa pang dobleng salita ay naglalaman ng offset mula sa simula ng file sa aktwal na byte ng imahe. Sa isang 24-bit na bmp file, ang bawat pixel ay naka-encode ng tatlong BGR byte.

Ngayon alam namin kung paano makarating sa imahe, ang natitira na lang ay upang maunawaan kung paano namin maisusulat ang impormasyong kailangan namin doon. Para dito kakailanganin natin ang pamamaraan ng LSB. Ang kakanyahan ng pamamaraan ay ang mga sumusunod: pinapalitan namin ang hindi bababa sa makabuluhang mga bit sa mga byte na responsable para sa pag-encode ng kulay. Sabihin nating kung ang susunod na byte ng aming lihim na mensahe ay 11001011, at ang mga byte sa larawan ay...11101100 01001110 01111100 0101100111..., ang pag-encode ay magiging ganito. Hahatiin namin ang lihim na byte ng mensahe sa 4 na dalawang-bit na bahagi: 11, 00, 10, 11, at papalitan ang mga low-order na bit ng imahe ng mga resultang fragment: ...11101111 01001100 01111110 0101100111…. Ang ganitong kapalit ay karaniwang hindi napapansin ng mata ng tao. Bukod dito, maraming mas lumang mga aparatong output ang hindi man lang makakapagpakita ng mga maliliit na pagbabago.

Malinaw na maaari mong baguhin hindi lamang ang 2 hindi bababa sa makabuluhang mga piraso, ngunit ang anumang bilang ng mga ito. Mayroong sumusunod na pattern: mas maraming bit na binago natin, mas maraming impormasyon ang maaari nating itago, at mas maraming interference ang maidudulot nito sa orihinal na larawan. Halimbawa, narito ang dalawang larawan:

Steganography ng LSB
Steganography ng LSB

Sa kabila ng aking pinakamahusay na pagsisikap, hindi ko makita ang pagkakaiba sa pagitan nila, ngunit gayunpaman, sa pangalawang larawan, gamit ang inilarawan na pamamaraan, ang tula ni Lewis Carroll na "The Hunting of the Snark" ay nakatago. Kung nabasa mo na ito, malamang na interesado kang malaman ang tungkol sa pagpapatupad. Ito ay medyo simple, ngunit babalaan kita kaagad na ang lahat ay tapos na sa Delphi. Mayroong dalawang dahilan para dito: 1. Sa tingin ko ay isang magandang wika ang Delphi; 2. Ang program na ito ay ipinanganak sa proseso ng paghahanda ng isang kurso sa mga pangunahing kaalaman sa computer vision, at ang mga taong tinuturuan ko ng kursong ito ay wala pang alam maliban sa Delphi. Para sa mga hindi pamilyar sa syntax, isang bagay ang kailangang ipaliwanag: ang shl x ay isang bitwise shift sa kaliwa ng x, ang shr x ay isang bitwise shift sa kanan ng x.

Ipinapalagay namin na nagsusulat kami ng teksto na nakaimbak sa isang string sa lalagyan at pinapalitan ang mas mababang dalawang byte:
Recording code:

para sa i:=1 sa haba(str) gawin
    simulan
      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.Posisyon:=f.Posisyon-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisyon:=f.Posisyon-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisyon:=f.Posisyon-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Posisyon:=f.Posisyon-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    katapusan;

code na babasahin:

para sa i:=1 sa MsgSize gawin
    simulan
      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);
    katapusan;

Well, para sa mga talagang tamad - link sa program at source code nito.

Salamat sa inyo.

Pinagmulan: www.habr.com

Magdagdag ng komento