background image

Ochrona danych w systemach i sieciach komputerowych 

 

Temat: Steganografia 

 

 

Do  zakodowania  informacji  binarnej  w  obrazie  wykorzystujemy  bajty  odpowiedzialne  za 

przechowywanie  danych  o  pikselu.  Oznacza  to  że  wpisując  szyfrant  do  obrazu  zmieniamy  obraz. 

Jednak  ilość  informacji  przechowywanej  przez  plik  bitmapy  –  nawet  przy  jej  dużej  modyfikacji  – 

sprawi ze zmienione bajty pozostaną dla oka nie wychwycone. 

 

Według teorii najbardziej niewidoczne zmiany są wtedy gdy operujemy na najstarszym bicie 

bajtu składowej B piksela. Oznacza to, że w typowym obrazie gdzie występuje względnie duża ilość 

kolorów  (obraz  nie  jest  monochromatyczny)  praktycznie  nie  możliwe  jest  wychwycenie  zmian  w 

obrazie.  Najbardziej  widoczne  są  zmiany  wykonywane  na  składowej  R  kanałów  RGB.    W  przypadku 

zakodowania dużej informacji (duża część informacji na składowych zostanie zmieniona) na obrazie 

może  pojawić  się  widoczny  szum  (mniej  lub  bardziej  zniekształcające  kolor  względnie  losowe  w 

rozmieszczeniu kropki). Efekt ten jest szczególnie widoczny przy gładkich powierzchniach.  

Ćwiczenie 1. Zapisywanie informacji do mapy bitowej za pomocą programu steganograficznego. 

Uruchamiamy załączony program 

 

Do  uruchomienia  tego  programu  niezbędne  jest  zainstalowanie  Microsoft  Framework  w 

wersji 2.0 lub wyższej. 

 

background image

Otwieramy  Nośnik  (plik  graficzny)  //  sugeruję  (ze  względu  na  używanie  w  kodzie 

wolnychfunkcji GetPixel PutPixel operacje na względnie małych plikach graficznych. 

(Plik/Otwórz Nośnik)

 

 

Oczom naszym powinien ukazać się podobny widok: 

 

 

Testujemy  plik  w  celu  sprawdzenia  czy  przypadkiem  nie  nadpiszemy  już  istniejącej 

zaszyfrowanej informacji w obrazie. (Steganografia/Testuj) 

 

W przypadku nowo utworzonego pliku powinniśmy zobaczyć komunikat: 

 

background image

Otwieramy plik binarny który będziemy chcieli zaszyfrować (Plik / Otwórz Binaria) 

Dla pliku: 
 

 

Podgląd  w  edytorze  decymalnym  wygląda 
następująco: 

 

 
 

 

A widok programu następująco: 

 

background image

Widzimy,  jakie  jest  potrzebne  miejsce  oraz  czerwone  światło  (obok  symboli  RGB) 

sygnalizujące,  że  dostępne  miejsce  jest  zbyt  małe.  Zwiększamy  więc  ilość  bitów  wymienianych 

podczas  szyfrowania  :  w  naszym  wypadku  wystarczy  jeden  bit  na  składowej  B.  Przesuwamy  suwak 

znajdujący się po lewej stronie symbolu składowej B o jedną pozycję w lewo. Proszę zauważyć, że gdy 

program  uzna,  że  wymieniliśmy  względnie  dużo  informacji  –  zapali  się  żółte  światło  sygnalizujące 

nam, że zmiany mogą być widoczne gołym okiem. 

Przetestujmy pojemność nośnika (wizualizacje – Pojemność Nośnika) 

Przykładowy otrzymany efekt: 

 

Widzimy całe dostępne miejsce – miejsce zajęte przez składowe zarówno procentowo 

(wykres tort) jak i liczbowo (wykres słupkowy). 

Przetestujmy Zajęte Miejsce  

Przykładowy uzyskany efekt: 

 

 

background image

Przystąpmy do zaszyfrowania danych z pliku: 

Oryginalne dane wymienione - podglądnięte w 
edytorze decymalnym wyglądają następująco: 

 

Te same tylko że już zmienione informacje w edytorze 
decymalnym wyglądają następująco: 

 

 

Możemy obserwować zmiany w obrazie przed i po szyfrowaniu. W głównym oknie programu. 

 

Zapisujemy obraz i wyłączamy program. Teraz możemy na przykład przesłać mapę bitową z 

zaszyfrowaną informacją do kolegi. 

 

 

 

 

 

background image

Ćwiczenie 2. Odczytywanie informacji za pomocą programu steganograficznego. 

Uruchamiamy załączony program 

 

 

Otwieramy Nośnik (plik graficzny) odebrany od kolegi 

 

 

 

 

background image

Oczom naszym powinien ukazać się podobny widok: 

 

 

Testujemy plik w celu sprawdzenia czy nie zawiera zaszyfrowanej informacji (Steganografia/ 

Testuj) 

Oczom naszym powinien ukazać się następujący widok: 

 

Widzimy że program przechowuje w pliku niezbędne do odszyfrowania informacje – klucz – 

weryfikujący – czy obraz posiada zakodowaną informację, Rozmiar piku szyfrowanego i ustawienia 

programu (ustawienia dotyczące wartości suwaków znajdujących się obok symboli składowych 

podczas szyfrowania). 

 

 

 

 

 

 

background image

Odszyfrowujemy dane (Steganografia// Odszyfruj) – wybieramy plik i format do zapisu i 

odczytujmy podgląd z edytora decymalnego : 

 

Oraz otwieramy zapisany przed chwilą plik: 

 

 

 

background image

Ćwiczenie nr 3. Analiza obrazu z zaszyfrowaną informacją. 

Otwieramy otrzymany plik za pomocą np. programu Paint. Program nie zawiera żadnych 

algorytmów haszujących i kodujących – po prostu zapisuje informacje w pliku graficznym – zapisuje je 

od góry w dół w kolejnych kolumnach.  

Powiększamy obraz: 

 

Pierwszym i najprostszym testem jest „wylanie koloru” – Paint zamienia wszystkie identyczne 

piksele na kolor którym wylewamy: 

Wylałem kolor czarny na swój obrazek i otrzymałem następujący efekt: 

 

background image

 Widzimy, że program nie wypełnił całego „rogu” obrazu – niektóre piksele mają inny kolor 

gdyż przechowują zakodowaną informację.  

Spróbujmy zweryfikować jakość zmian używamy polecenia wybierz kolor i wybieramy piksel z 

obszaru zakodowanego – tego na który kolor się nie wylał. (Zaznaczam że algorytm programu 

zapisuje w rogu obrazu informację do dekodowania na 4 najmniej ważnych bitach składowej R). 

Informacje z pliku szyfrowanego są zapisywane od drugiej kolumny w dół.  By sprawdzić składowe 

wybranego koloru klikamy w paincie na Kolory/edytuj  kolory/definiuj kolory niestandardowe – 

domyślnie będzie zaznaczony wybrany kolor. Biel ma składowe R255 G255 B255 jeśli któryś z 

zaznaczonych pikseli będzie mieć R255 G255 B254 oznacza że został wymieniony ostatni bit 

składowej B. Jeśli mamy np. zdjęcie bez „jednolitych” obszarów musimy porównać nasz nośnik z 

oryginalnym obrazem piksel po pikselu.  

Spróbujmy domalować kilka białych kropek na zakodowanym obszarze (proszę uważać na 

pierwszą kolumnę w której ukrywają się dane dla dekodera) zapisać zmiany jako inny plik i 

odszyfrować jako nośnik.  

 

Widzimy, że zmieniliśmy jakieś przypadkowe dane ale informację dało się odczytać w 

większości. 

 

 

 

background image

Zadania do samodzielnego wykonania: 

 1 - Odszyfrować stały klucz, według którego program testuje czy program zawiera zakodowaną 

informację. Porównać kilka Nośników by wykryć „co się nie zmienia”. 

2 -Oszukać program – „namalować” obraz który nie będzie mieć informacji zapisanej w swoim 

„wnętrzu” ale program odczyta go jako nośnik ukrytych Binariów. 

3 – Zapisać różnej długości informacje na różnych składowych lub na kilku składowych z różnymi 

parametrami. Przeanalizować pliki np. w Gimpie poprzez zmianę kontrastu czy jasności – w celu 

wykrycia czy plik zawiera zaszyfrowaną informację czy nie.  

4 – Zmieniać informacje w noośniku i sprawdzać w jakim stopniu wpływają na deszyfrację. 

 

Życzę miłej zabawy. Program powstał w celach akademickich – nie jest profesjonalnym 

oprogramowaniem, może zawierać błędy i niedociągnięcia (za które przepraszam) – załączam kod 

programu.  Do stworzenia programu wykorzystałem środowisko Visual Studio Express Edition. A 

program powstał w języku C#. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Podpowiedź do zadania 1: (Informacja jest zapisana na pierwszych pikselach w kolumnie pierwszej – na 4 najmniej ważnych bitach 

składowej R) – klucz zawiera 5 bajtów => 10 pikseli zawiera tą informację (wynik 1FACC)