Steganografia w PHP

Ciekawe czy ktoś to jeszcze pamięta ;) (bo mnie technika deko kurzem zarosła). Dla niewtajemniczonych i tych których szare komórki zawierające informacje na ten temat poumierały z takich czy innych powodów, słów kilka.

Steganografia jest nauką o komunikacji w taki sposób by obecność komunikatu nie mogła zostać wykryta, czyli deko inaczej niż w kryptografii (gdzie fakt zaistnienia informacji jest jawny, ale treść już nie).

Za Wikipedią:

Klasyfikacja systemów steganograficznych:

steganografia czysta (pure steganography) – siła techniki opiera się na nieznajomości metody przez stronę atakującą. Systemy te nie spełniają Zasady Kerckhoffsa dlatego nie są polecane
steganografia z kluczem prywatnym (private key steganography) – metoda jest jawna i powszechnie dostępna, przez rozpoczęciem komunikacji strony uwzględniają klucz steganograficzny wykorzystywany w sposób zależny od metody, istnieje jednek problem przekazania klucza w bezpieczny sposób
steganografia z kluczem publicznym (public key steganography) – podobnie jak w asymetrycznych systemach kryptograficznych używane są dwa klucze – publiczny i prywatny. Klucz publiczny (jawny) wykorzystywany jest przy osadzaniu wiadomości w nośnej, natomiast klucz prywatny przy jej wyodrębnianiu

Metoda modyfikacji najmniej znaczącego bitu:

Modyfikacja najmniej znaczącego bitu jest klasycznym przedstawicielem metod zastępujących. Wykorzystuje nadmiarowość w nośnej. Ostatni bit (np. wartości składowych piksela) zastępowany jest bitem (lub bitami) z wiadomości. Metoda ta daje się zastosować dla plików grafiki rastrowej oraz cyfrowo zapisanego dźwięku. Większość komercyjnego oprogramowania korzysta właśnie z niej (np. CryptArkan). Przy wykorzystaniu tej metody bardzo łatwo jest wykryć obecność komunikatu. Proste jest także zniszczenie zapisanego komunikatu (wystarczy np. wyzerować najmniej znaczące bity).

O tej ostatniej w ujęciu PHP

W prosty sposób można wykorzystać modyfikację najmniej znaczącego bitu w PHP ot tak dla zabawy.

Zapisujemy dane do otwaretgo wcześniej pliku graficznego:

function Write( $data )
{
  $bits=$this->_asc2bin($data);
  $lenbit=strlen($bits);
  $nx=imagesx($this->img_object);
  $ny=imagesy($this->img_object);
  for($x=0,$bit=0; $x<$nx; $x++)
  {
    for($y=0; $y<$ny; $y++)
    {
      $pix=$this->_getcolor($this->img_object,$x,$y);
      foreach(array('R','G','B') as $C)
      $col[$C]=$bit<$lenbit?($pix[$C]|$bits[$bit])&(254|$bits[$bit++]):$pix[$C];
      imagesetpixel($this->img_object,$x,$y,$this->_setcolor($this->img_object,$col['R'],$col['G'],$col['B']));
    }
  }
  imagepng($this->img_object,$this->img_path);
}

A jak chcemy odczytać zapisane dane możemy zrobić tak:

function Read()
{
  $nx=imagesx($this->img_object);
  $ny=imagesy($this->img_object);
  for($x=0; $x<$nx; $x++ )
  {
    for($y=0; $y<$ny; $y++)
    {
      $pix=$this->_getcolor($this->img_object,$x,$y);        
      $data.=($pix['R']&1).($pix['G']&1).($pix['B']&1);
    }
  }
  return $this->_bin2asc($data);
}

Powyższe odświerzyło mi moją pamięć i odkurzyło stare rozwiązania tworzone jeszcze na gentoo. Wtedy człowiek miał wiecej czasu na tzw. “pierdoły”.
Zainteresowanych tematem i samą klasą PHP odsyłam do PHPClasses:

http://www.phpclasses.org/browse/package/6027.html