Steganografia LSB

Una volta aghju scrittu u mo primu postu nantu à u hub. È quellu postu era dedicatu à un prublema assai interessante, à dì steganografia. Di sicuru, a suluzione pruposta in quellu vechju tema ùn pò esse chjamatu steganografia in u veru sensu di a parolla. Hè solu un ghjocu cù formati di fugliale, ma un ghjocu assai interessante.

Oghje avemu da pruvà à scavà un pocu più in fondu è fighjà l'algoritmu LSB. Sè vo site interessatu, vi sò benvenuti sottu cat. (Sutta u cut hè u trafficu: circa un megabyte.)

Prima di tuttu, hè necessariu di fà una breve introduzione. Tuttu u mondu sapi chì u scopu di a criptografia hè di rende impussibile di leghje l'infurmazioni secreti. Di sicuru, a criptografia hà e so applicazioni, ma ci hè un altru approcciu à a prutezzione di dati. Ùn avemu micca da criptà l'infurmazioni, ma pretendenu chì ùn l'avemu micca. Hè per quessa chì a steganografia hè stata inventata. Wikipedia ci assicura chì "a steganografia (da u grecu στεγανοσ - ammucciatu è u grecu γραφω - scrivu, letteralmente "scrittura segreta") hè a scienza di a trasmissione oculata di l'infurmazioni mantenendu u fattu stessu di a trasmissione secreta.

Di sicuru, nimu pruibisce di cumminà metudi criptografichi è steganografichi. Inoltre, in pratica facenu questu, ma u nostru compitu hè di capisce i principii. Se studiate attentamente l'articulu di Wikipedia, truverete chì l'algoritmi di steganografia includenu u chjamatu. cuntainer è missaghju. Un cuntinuu hè qualsiasi infurmazione chì aiuta à ammuccià u nostru missaghju sicretu.

In u nostru casu, u cuntinuu serà una maghjina in formatu BMP. Prima, fighjemu a struttura di stu schedariu. U schedariu pò esse divisu in 4 parti: l'intestazione di u schedariu, l'intestazione di l'imaghjini, a paleta è l'imaghjini stessu. Per i nostri scopi, avemu solu bisognu di sapè ciò chì hè scrittu in l'intestazione.

I primi dui bytes di l'intestazione sò a firma BM, dopu a dimensione di u schedariu in byte hè scritta in una parola doppia, i prossimi 4 byte sò riservati è deve cuntene zeri, è infine, una altra doppia parolla cuntene l'offset da u principiu di l'intestazione. file à i bytes attuali di l'imaghjini. In un schedariu bmp 24-bit, ogni pixel hè codificatu cù trè byte BGR.

Avà sapemu cumu ghjunghje à l'imaghjini, tuttu ciò chì resta hè di capisce cumu pudemu scrive l'infurmazioni chì avemu bisognu. Per questu avemu bisognu di u metudu LSB. L'essenza di u metudu hè a siguenti: rimpiazzà i bits menu significati in i bytes rispunsevuli di a codificazione di culore. Dicemu chì u prossimu byte di u nostru missaghju sicretu hè 11001011, è i byte in l'imaghjini sò ... 11101100 01001110 01111100 0101100111 ..., allora a codificazione serà cusì. Divideremu u byte di missaghju sicretu in 4 parti di dui bit: 11, 00, 10, 11, è rimpiazzà i bits di pocu ordine di l'imaghjini cù i frammenti resultanti: ...11101111 01001100 01111110 0101100111…. Un tali rimpiazzamentu ùn hè generalmente micca notu à l'ochju umanu. In più, assai vechji dispusitivi di pruduzzioni ùn sarà ancu capaci di vede tali cambiamenti minori.

Hè chjaru chì pudete cambià micca solu i 2 bits menu significativu, ma ogni numeru di elli. Ci hè u seguente mudellu: più bits cambiemu, più infurmazione pudemu ammuccià, è più interferenza questu pruvucarà in l'imaghjini originale. Per esempiu, quì sò dui imagine:

Steganografia LSB
Steganografia LSB

Malgradu i mo sforzi, ùn pudia vede a diffarenza trà elli, ma in ogni modu, in a seconda maghjina, cù u metudu descrittu, u puema di Lewis Carroll "A Caccia di Snark" hè oculatu. Sè avete lettu finu à quì, allora site probabilmente interessatu à amparà nantu à l'implementazione. Hè abbastanza sèmplice, ma vi avverteraghju subitu chì tuttu hè fattu in Delphi. Ci hè dui motivi per questu: 1. Pensu chì Delphi hè una bona lingua ; 2. Stu prugramma hè natu in u prucessu di priparà un corsu nantu à i principii di a visione di l'urdinatore, è i picciotti à quale sò insignatu stu corsu ùn sanu ancu nunda altru chè Delphi. Per quelli chì ùn sò micca familiarizati cù a sintassi, una cosa deve esse spiegata: shl x hè un shift bit à a manca da x, shr x hè un shift bit à a diritta da x.

Assumimu chì scrivemu testu guardatu in una stringa in u containeru è rimpiazzà i dui byte più bassi:
Codice di registrazione:

per i:=1 à longu (str) do
    principia
      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.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    fine;

codice da leghje:

per i:=1 à MsgSize do
    principia
      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);
    fine;

Ebbè, per i veramente pigri - ligame à u prugramma è u so codice fonte.

Спасибо.

Source: www.habr.com

Add a comment