Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Steganografia w BMP
Reigon
post
Post #1





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 19.10.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Reigon
post
Post #2





Grupa: Zarejestrowani
Postów: 33
Pomógł: 0
Dołączył: 19.10.2004

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował Reigon 17.11.2004, 23:13:25
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 12.10.2025 - 01:36