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.
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:
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:
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:
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.
Ćwiczenie 2. Odczytywanie informacji za pomocą programu steganograficznego.
Uruchamiamy załączony program
Otwieramy Nośnik (plik graficzny) odebrany od kolegi
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).
Odszyfrowujemy dane (Steganografia// Odszyfruj) – wybieramy plik i format do zapisu i
odczytujmy podgląd z edytora decymalnego :
Oraz otwieramy zapisany przed chwilą plik:
Ć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:
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.
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)