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