Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Steganografia w BMP
Forum PHP.pl > Forum > PHP
Reigon
Mam do napisania aplikacje, ktora ma zakodowac informacje (text) w grafice np. BMP lub tez innym formacie, np. w wav, mpeg, itp. Generalnie polega to na tym, ze nalezy zmieniac najmniej znaczacy bit w kazdym pikselu (jesli chodzi o obrazek), tak aby obrazek zachowal oryginalny wizerunek (a przynajmniej zmiany byly nie dostrzegalne dla ludziego oka). Zaproponowano mi napisanie tego w Visual C++, C#, Javie lub Delphi... Wpadlem na pomysl, ze ciekawym rozwiazaniem bylo by napisanie tego w php i umieszczenie gdzies w necie (wtedy ktokolwiek by zakodowal z takiej strony ten obrazek, moglby informacje odkodowac rowniez spod danego url'a). Wtedy obydwie strony nie musialby posiadac odpowiedniego oprogramowania na dysku. Ale czy jest to w ogole mozliwe ? Jak nalezaloby podejsc do tej sprawy ? Na pewno trzeba by bylo skorzystac z funkcji czystego C (fopen, pozniej obejsc jakos naglowek BMP, pozniej zabawa z wskaznikami chyba), wtedy moze by to bylo wykonalne. Wiecej o Steganografi znajdziecie tutaj.
rogrog
no ja to widzę tak:

1. Wczytujesz dane za pomocą np. fopen" title="Zobacz w manualu PHP" target="_manual, fgets" title="Zobacz w manualu PHP" target="_manual - funkcje są binarnie bezpieczne oczywiscie..., możesz dodać flagę b do fopen (więcej w manualu) - równie dobrze a nawet lepiej możesz użyć file_get_contents" title="Zobacz w manualu PHP" target="_manual
2. parsujesz plik zgodnie ze specyfikacją BMP czy też DIP - to na pewno znasz jak sie tym zajmujesz... jak coś to google. Wczytujesz dane do stringów (nagłówki) i tablic (kolory i piksele)
3. wykonujesz te swoje operacje steganograficzne na wczytanych tablicach
4. z powrotem tworzysz plik bmp (łączysz nagłówki i implode" title="Zobacz w manualu PHP" target="_manualowane tablice) i już tongue.gif

chyba nic szczególnie odkrywczego tongue.gif

PS. wskaźników nie ma w php
bela
@lunter: jestes pewien że biblioteka gd wspiera bmp ?
Reigon
BMP nie wspiera, ale w PNG to moze byc nawet bardziej uzyteczne, bo kto w sieci posluguje sie bmp...a taki png mniejsze podejrzenia wzbudza, poza tym ogolnie program taki napisany w php i udostepniony w I-necie daje wieksze mozliwosci niz czysta aplikacja, np. w C#.

lunter -> gorzej bedzie, jak prowadzacy zabroni uzywac bibliotek i np. kaze wlasne napisac :/ jutro sie popytam

rogrog -> tez myslalem o tych tablicach :]

BTW: Dzieki wszystkim za jakiekolwiek odpowiedzi, myslalem, ze tego tematu nikt nie ruszy ;p Jednak zostalem mile zaskoczony, moze ktos jeszcze cos dopowie od siebie ?
theoden
Cytat(rogrog @ 2004-10-19 22:28:43)
PS. wskaźników nie ma w php

Wskaźniki są tyle że ich nie widać;)))) cool.gif
rogrog
Cytat(theoden @ 2004-10-20 00:33:21)
Wskaźniki są tyle że ich nie widać winksmiley.jpg

ok, zdawało mi się że mówimy o programowaniu w php a nie programowaniu silnika php tongue.gif smile.gif

Cytat(Reigon)
myslalem, ze tego tematu nikt nie ruszy ;p

na tym forum ciekawe tematy zawsze znajdą popularność winksmiley.jpg szczególnie że ludzie są już znudzeni odpowiadaniem na ciągle te same pytania początkujących biggrin.gif
Reigon
Cytat(rogrog @ 2004-10-20 14:40:43)
na tym forum ciekawe tematy zawsze znajdą popularność winksmiley.jpg szczególnie że ludzie są już znudzeni odpowiadaniem na ciągle te same pytania początkujących biggrin.gif

No to super, tyle, ze ja zaden PRO user nie jestem, dlatego przydalyby mi sie zrodla, ktorych lunter nie moze znalezc tongue.gif

Dzisiaj zagadalem do prowadzacego, generalnie na to przystal, aby to kodowac w PNG i zeby bylo to w php, tylko jako, ze bedzie to aplikacja klient-serwer, tak czy siak przesylamy tresc siecia...a wiec nie do konca jest to tak, jak powinno byc (bo nota bene tresc bedzie az tak bezpieczna)...zaproponowal SSL lub cos tam jeszcze... - no ale z tym chyba zadnego problemu nie powinno byc. Zabieram sie w piatek lub pon. do pisania, pisac do struk. czy obiektowo ? Z obiektowym php raczej nie mialem stycznosci, ale jak polepszy kod i dzialanie, to mozemy postawic sobie wyzwanie winksmiley.jpg
theoden
Cytat(Reigon @ 2004-10-20 17:21:58)
Zabieram sie w piatek lub pon. do pisania, pisac do struk. czy obiektowo ? Z obiektowym php raczej nie mialem stycznosci, ale jak polepszy kod i dzialanie, to mozemy postawic sobie wyzwanie winksmiley.jpg

To zależy jeżeli bawiłeś się OOP w innym języku to pewnie i tu sobie poradzisz jak nie to zawsze można się nauczyć cool.gif

Wady i zalety obu podejść - pełno tego na forum poszukaj.
Reigon
Cytat(theoden @ 2004-10-20 20:22:50)
Cytat(Reigon @ 2004-10-20 17:21:58)
Zabieram sie w piatek lub pon. do pisania, pisac do struk. czy obiektowo ? Z obiektowym php raczej nie mialem stycznosci, ale jak polepszy kod i dzialanie, to mozemy postawic sobie wyzwanie winksmiley.jpg

To zależy jeżeli bawiłeś się OOP w innym języku to pewnie i tu sobie poradzisz jak nie to zawsze można się nauczyć cool.gif

Wady i zalety obu podejść - pełno tego na forum poszukaj.

Chodzilo mi o wady i zalety podejsc do tego konkretnego programu...bo ogolnie to wiem co i jak winksmiley.jpg
rogrog
szczerze mowiac w tym konkretnym przypadku na poziomie samej podmiany bitów nie widzę szczególnych zalet z obiektówki...
zYm3N
moja stronka, dział portfolio.

Jeśli potrzebujesz kodów, pisz. (zymen@zymen.net).

Co prawda w c++, ale zbyt mocno to się nie różni.
Reigon
Program zaliczony, podaje zrodla, moze kiedys sie komus przydadza, algorytm kodowania:

  1. <?
  2.  $i=2; // w ile bitow wstawiac, od 1 do 8
  3.  
  4.  $im=imagecreatefrompng('1.png');
  5.  $ix=imagesx($im);$iy=imagesy($im);
  6.  
  7.  $t=file_get_contents('1.txt');
  8.  $s='';for($z=0;$z<strlen($t);$z++){$s.=str_pad(decbin(ord($t[$z])),8,'0',STR_PAD_LEFT);}
  9.  
  10.  $q=strlen($s)%(3*$i);
  11.  if($q){$s.=str_repeat('0',3*$i-$q);}
  12.  
  13.  $c=(256-pow(2,$i));
  14.  
  15.  for($a=0;$a<strlen($s)/$i/3;$a++){
  16. $x=$a%$ix;
  17. $y=floor($a/$ix);
  18.  
  19. $rgb=imagecolorat($im,$x,$y);
  20. $r=(($rgb>>16)&$c)+bindec(substr($s,$a*$i*3,$i));
  21. $g=(($rgb>>8)&$c)+bindec(substr($s,$a*$i*3+$i,$i));
  22. $b=($rgb&$c)+bindec(substr($s,$a*$i*3+2*$i,$i));
  23.  
  24. imagesetpixel($im,$x,$y,($r<<16)+($g<<8)+$b);
  25.  }
  26.  
  27.  imagepng($im,'2.png');
  28. ?>



Algorytm dekodowania

  1. <?
  2. // kod odpowiedzialny za dekodowanie tekstu w obrazku:
  3.  
  4. // pobranie pierwszych 10 bajtow informacji z obrazka oraz stopien upakowania
  5. $d = 10;
  6. // pobierz plik
  7.  
  8.  $im=@imagecreatefrompng('2.png');  //odczytuje obraz z adresu URL
  9. if (!$im)   //jeśli nie ma obrazu lub nie jest PNG wyswietl blad
  10.  {
  11.  echo &#092;"<center>Niestety wystąpił błąd podczas odczytu. Upewnij się, czy wczytujesz obraz PN
  12. </CENTER>\";
  13.  exit();
  14. }  
  15.  
  16. /***********************************************************************/
  17.  
  18.  $ix=imagesx($im);$iy=imagesy($im);
  19.  
  20.  $rgb=imagecolorat($im,0,0);
  21.  $i=(($rgb>>16)&1)*4+(($rgb>>8)&1)*2+($rgb&1)+1;  //odczyt pierwszego piksela, w którym mamy
  22.   //stopien upakowania jeśli 000, to $i=1, 111 = $i=8
  23.  
  24.  $c=pow(2,$i)-1;
  25.  
  26.  $s='';
  27.  for($a=0;$a<ceil($d*8/$i/3);$a++){  // odczyt jak w przypadku kodowania z pominieciem
  28.   //pierwszego piksela
  29. $x=($a+1)%$ix;
  30. $y=floor(($a+1)/$ix);
  31.  
  32. $rgb=imagecolorat($im,$x,$y);
  33. $r=decbin(($rgb>>16)&$c);
  34. $g=decbin(($rgb>>8)&$c);
  35. $b=decbin($rgb&$c);
  36.  
  37.  $s.=str_pad($r,$i,'0',STR_PAD_LEFT).str_pad($g,$i,'0',STR_PAD_LEFT).str_pad($b,$i,'0',STR_PAD_LEFT);
  38. // w s przechowujemy nasze zakodowane informacje, z lewej strony wypelniamy zerami
  39.  }
  40.  
  41.  $t='';
  42.  for($z=0;$z<$d;$z++) {$t.=chr(bindec(substr($s,$z*8,8)));} //zamien w kolejne bajty na liczbe dziesietna
  43.  //i pozniej ta liczbe na znaki
  44.  
  45. /***********************************************************************/ 
  46.  
  47. // sprawdza, czy w obrazie jest informacja na podstawie tego, czy pierwsze 10 bajt
  48. w to liczba
  49.  
  50.  $t+=0;  //konwersja z string na int
  51.  if(!is_integer($t))   //sprawdza czy jest liczba
  52.  {
  53. echo \"<center>W tym obrazie nie jest zakodowana infromacja</CENTER>\";
  54. exit();
  55.  }
  56.  
  57. /***********************************************************************/ 
  58.  
  59. // algorytm dekodowania informacji - analogicznie, jak deszyfracja pierwszych 10 bajtow
  60.  
  61.  $d=$t+10;   // dlugosc calej zakodowanej infromacji
  62.  
  63.  $s='';
  64.  for($a=0;$a<ceil($d*8/$i/3);$a++){
  65. $x=($a+1)%$ix;
  66. $y=floor(($a+1)/$ix);
  67.  
  68. $rgb=imagecolorat($im,$x,$y);
  69. $r=decbin(($rgb>>16)&$c);
  70. $g=decbin(($rgb>>8)&$c);
  71. $b=decbin($rgb&$c);
  72.  
  73. $s.=str_pad($r,$i,'0',STR_PAD_LEFT).str_pad($g,$i,'0',STR_PAD_LEFT).str_pad($b,$i,'0',STR_PAD_LEFT);
  74.  }
  75.  
  76.  $t='';
  77.  for($z=0;$z<$d;$z++){$t.=chr(bindec(substr($s,$z*8,8)));}
  78.  
  79.  // w $t mamy cala informacje + 10 bajtow dlugosci na samym poczatku, wycinamy 10 p
  80. erwszych liczb
  81.  $t=substr($t,10);
  82.  
  83.  
  84. // zapis do pliku
  85.  
  86.  // file_put_contents('2.txt',$t); // tylko dla >= php 5.0 
  87.  $p=fopen('2.txt','w');
  88.  fputs($p,$t);
  89.  fclose($p);
  90. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.