Strona Główna Forum Translate Regulamin Buttony strony
 
Nawigacja
Strona Główna
Forum
Shoutbox
Konkurs (pkt.)
Rangi
Regulamin
Szukaj
jak zakodowac tekst, plik, lub jaki kolwiek inny dok??
ROZWIĄZANIE




Metoda ukrywania danych w obrazie to jeden ze sposobów utajnienia informacji. Mało kto spodziewa się w niewinnie wyglądającym obrazku jakiegoś innego przekazu niż to, na co patrzy. Tymczasem ukrywanie danych w obrazkach to całkiem poważne zajęcie wykorzystywane na dużą skalę...

Ukrywać można wszystko - teksty, pliki, dokumenty, inne obrazy, wirusy i co tylko zechcesz.Pokażę Ci, jak ukryć zwykły, jawny tekst. Oczywiście tekst można zakodować i zakodowany ukryć w obrazku na różne sposoby.

Na oko nikt nie zauważy, że w obrazie znajduje się coś jeszcze... Zresztą widzisz powyżej dwa obrazki. Różnią się czymś? Nie, dla człowieka są identyczne. Ten po prawej zawiera zakodowaną wiadomość. Pokażę Ci jak ją zakodować i potem odczytać.

W zależności od sposobu kodowania i wielkości obrazka możesz ukryć określoną długość tekstu/przekazu. Moja metoda modyfikuje najmniej znaczący bit każdej składowej koloru. Ponieważ piksel składa się z trzech składowych, w obrazku o rozdzielczości 200x200 pikseli mogę ukryć 120000 bitów, a więc 15000 znaków/bajtów. To mniej więcej 8 kartek A4 tekstu! W obrazku 800x600 pikseli ukryjesz 180000 znaków/bajtów.

Do ukrywania danych nadają się wyłącznie obazki zapisane metodą bezstratną, np. PNG lub GIF. JPG stosuje kompresję kolorów, więc modyfikuje bity i przekaz nie może być w nich przechowywany. Natomiast możesz odczytać JPG, w nim zakodować treść i zapisać potem jako PNG. To co? Kodujemy?

Oto skrypt, który odczytuje obrazek, koduje w nim podaną treść i wyświetla obrazek na ekranie. Możesz go potem zapisać pod dowolną nazwą - będzie zawierał zakodowaną treść, którą pod koniec również odkoduję.

kod

?
$im = imagecreatefromjpeg('samolot.jpg');

// tekst do zakodowania w obrazku
$t = "Oto kilka zdań, które umieszczę w obrazku. Sam obrazek nie ulegnie
zmianie - wciąż będziesz widział dokładnie takie same kolory. Dla
ludzkiego oka modyfikacja jednego bitu dla każdej składowej koloru RGB
nie ma żadnego znaczenia. Inny skrypt odkoduje przekaz znajdujący się
w obrazku. Oczywiście możesz ukrywać w obrazku dowolne znaki, również
polskie. Możesz też umieścić w obrazku ukryte pliki binarne! Fajne?";

for($i=0;$i
$tb .= str_pad(decbin(ord($t{$i})), 8, '0', STR_PAD_LEFT);
}
$tb .= '00000000'; // znak null, określam nim koniec tekstu
$ti = strlen($tb); // ilość bitow w stringu

$szerokosc = imagesx($im);
$wysokosc = imagesy($im);
for ($x=0;$x<$szerokosc;$x++) {
for ($y=0;$y<$wysokosc;$y++) {
$c = imagecolorsforindex($im, imagecolorat($im, $x, $y));
$r = $c['red']; $g = $c['green']; $b = $c['blue'];
if ($j<$ti) {
if (($r & 1) == 1 and $tb{$j}==0) $r &= 254;
else if (($r & 1) == 0 and $tb{$j}==1) $r |= 1;
$j++;
}
if ($j<$ti) {
if (($g & 1) == 1 and $tb{$j}==0) $g &= 254;
else if (($g & 1) == 0 and $tb{$j}==1) $g |= 1;
$j++;
}
if ($j<$ti) {
if (($b & 1) == 1 and $tb{$j}==0) $b &= 254;
else if (($b & 1) == 0 and $tb{$j}==1) $b |= 1;
$j++;
}
imagesetpixel($im, $x, $y, imagecolorallocate($im, $r, $g, $b));
}
}

header('Content-type: image/jpg');
imagepng($im);
imagedestroy($im);
?>




Pobieram plik JPG. Następnie zamieniam tekst na ciąg zer i jedynek w postaci ciągu tekstowego. Na końcu tego ciągu dodaję osiem zer - tak oznaczam koniec przekazu dla programu dekodującego.

Następnie w pętli odczytuję każdy piksel obrazka i rozbijam piksel na trzy składowe koloru RGB. Dla każdej składowej zmieniam najmniej znaczący (skrajnie prawy) bit na kolejny, pochodzący z przygotowanego ciągu zer i jedynek.

Zmiana bitu to dodanie lub odjęcie 1 w definicji koloru, np. 87-1 lub 221+1. Tak mała zmiana odcienia składowej R, G lub B jest nie do zauważenia przez człowieka, więc nie wpływa na postrzeganie obrazu.

Operację wykonuję tak długo aż skończy się tekst do zakodowania lub skończą się piksele w obrazie. Całość jest potem wypisywana na ekran. Mamy już obrazek z zakodowanym przekazem. U nas przekaz jest tekstem, ale mogą to być dowolne znaki, np. pobrane z pliku binarnego.



Odkodowanie



Tak samo, jak tekst został zakodowany trzeba go odkodować. Nie jest to trudne. Oto skrypt:

$im = imagecreatefrompng('zakodowany.png');
$szerokosc = imagesx($im);
$wysokosc = imagesy($im);
for ($x=0;$x<$szerokosc;$x++) {
if ($z==8 and $bit%8==0) break;
for ($y=0;$y<$wysokosc;$y++) {
$c = imagecolorsforindex($im, imagecolorat($im, $x, $y));
if (($c['red'] & 1) == 1) { $t .= '1'; $z=0; }
else if (($c['red'] & 1) == 0) { $t .= '0'; $z++; }
$bit++; if ($z==8 and $bit%8==0) break;
if (($c['green'] & 1) == 1) { $t .= '1'; $z=0; }
else if (($c['green'] & 1) == 0) { $t .= '0'; $z++; }
$bit++; if ($z==8 and $bit%8==0) break;
if (($c['blue'] & 1) == 1) { $t .= '1'; $z=0; }
else if (($c['blue'] & 1) == 0) { $t .= '0'; $z++; }
$bit++; if ($z==8 and $bit%8==0) break;
}
}
for($i=0;$i
$znak .= $t{$i};
if (strlen($znak)==8) {
$tekst .= chr(bindec($znak));
$znak = '';
}
}
echo $tekst;
?>



Tu również odczytuję w pętli kolejne piksele, a z nich pobieram kolejne, najmniej znaczące bity i dodaję je do zmiennej $t tak długo, aż trafię na osiem kolejnych zer (modulo 8, aby wykryć pełne bajty), czyli znak pusty (to był mój znacznik końca danych, pamiętasz?)

Mając komplet odczytanych bitów w zmiennej, w pętli odczytuję je po 8 sztuk (aby stworzyć bajt) i zamieniam każdy bajt na znak, dodając go do zmiennej $tekst. Gotowe - tekst już tam jest, mogę go wypisać na ekran.




Nie odpowiadam za skutki waszego dalszego postepowania, jak jakies pytania to pisac na pw

Dodane przez freshbanana dnia kwiecień 16 2009 19:21:152 Komentarzy ˇ 1925 Czytań - Drukuj

Komentarze

Administratorzy all dnia kwiecień 16 2009 19:47:11
Bardzo miły wczytaniu, Bardzo mi się podoba smiley
Myślę że paru osobom może się przydać smiley
Oczywiście daje ocenę "Bardzo dobre" jak to wcześniej napisałem smiley
Hale dnia listopad 27 2012 15:42:13
rolex watches replica
Dodaj komentarz

Zaloguj się, żeby móc dodawać komentarze.
Oceny

Dodawanie ocen dostępne tylko dla zalogowanych Użytkowników.

Proszę się zalogować lub zarejestrować, żeby móc dodawać oceny.

Świetne! Świetne! 0% [Żadnych głosów]
Bardzo dobre Bardzo dobre 100% [1 Głos]
Dobre Dobre 0% [Żadnych głosów]
Przeciętne Przeciętne 0% [Żadnych głosów]
Słabe Słabe 0% [Żadnych głosów]
Logowanie
Nazwa Użytkownika

Hasło



Nie jesteś jeszcze naszym Użytkownikiem?
Kilknij TUTAJ żeby się zarejestrować.

Zapomniane hasło?
Wyślemy nowe, kliknij TUTAJ.






Powered by: PHP-Fusion v6.01.6
Theme DX-Cortex by: Daemon-X
Theme Graphics from PHP-Nuke Cortex Theme

171783 Unikalnych wizyt




Załóż : Własne Darmowe Forum | Własną Stronę Internetową | Zgłoś nadużycie