Sandra Lewandowska

Witaj w mojej przestrzeni!

St3g0 v.0.3

O aplikacji

Aplikacja St3g0 v.0.3 służy do steganografii plików graficznych i jest częścią programu pisanego w ramach studiów.

Więcej szczegółów na temat algorytmu LSB we wpisie: https://sandralewandowska.pl/steganografia/383/lsb/

Po wybraniu przycisku Next zostaje wywołana metoda validate() danego kontrolera. Jeśli brakuje pola lub jest uzupełnione nieprawidłowo, wyświetlony zostaje komunikat o błędzie a przejście do kolejnego kroku jest blokowane.

Użyte technologie/narzędzia/biblioteki:

JavaFX 8 – odpowiada za graficzny interfejs aplikacji z pomocą Gluon Scene Builder,
Java 8 – jako minimalny wymóg do współpracy z JavaFX 8,
Maven – do pobrania bibliotek wymaganych w projekcie,
Google Guice – użycie adnotacji @Inject dla pól pozwala otrzymać udostępniony obiekt WindowData. Ułatwia to przedstawienie poszczególnych kroków formularza na osobnych widokach,
slf4j z log4j – wyświetlanie/zapis logów.

Prezentację aplikacji można zobaczyć na poniższych filmach.
W pierwszym wideo ukrywaną informacją jest plik graficzny, a w drugim zwykły tekst.

Link do kodu: Kod – https://github.com/sanlew/st3g0

Uruchomienie aplikacji

1. mvn clean install -U
2. mvn jfx:jar
3. cd target/jfx/app
4. java -jar stego-0.0.1-SNAPSHOT-jfx.jar

Steganografia sieciowa

Kolejną popularną odmianą steganografii jest steganografia sieciowa, poświęcona technikom tworzenia ukrytych kanałów w protokołach sieciowych. Użycie ukry- tego kanału pozwala na przekazanie sekretnej wiadomości poprzez sieć, która może być narażona na podsłuch lub manipulację. Przesyłane pakiety danych pozwalają jednak na ukrycie względnie krótkich informacji. Przestrzeń do wykorzystania często wynosi tylko kilka bitów. Samo utworzenie dodatkowego kanału komunikacji polega na podważeniu bezpieczeństwa protokołu sieciowego [1] i znalezieniu takich obszarów, których modyfikacja nie zakłóci poprawnej transmisji danych. Do wprowadzenia zmian idealnie nadają się fragmenty obecnie nieużywane – pola wchodzące w skład specyfikacji nagłówka danego protokołu, jednak niemające znaczenia. Jako główny przykład wykorzystania fragmentów nagłówków pakietów w tym rozdziale posłuży stos TCP/IP.

Budowa protokołów TCP i IP

TCP/IP (ang. Transmission Control Protocol / InternetProtocol) to rodzina protokołów sieciowych służących do wymiany danych pomiędzy urządzeniami w sieci.

Model TCP/IP implementuje najważniejsze funkcjonalności standardowego modelu OSI1 , jednak składa się z mniejszej ilości warstw.

Każda wiadomość wysłana przez aplikację przechodzi przez wszystkie warstwy TCP/IP, od warstwy aplikacji do najniższej – dostępu do sieci. Kolejne warstwy dodają kontrolną informację jako nagłówek (ang. header). Proces ten nazywa się kapsułkowaniem. Następnie wiadomość jest transmitowana przez sieć do drugiego komputera. Przy odbiorze przechodzi przez wszystkie warstwy i nagłówki w przeciwnym kierunku (również pola poszczególnych nagłówków są odczytywane w kolejności odwrotnej – od prawej strony do lewej – 5.1), aż do warstwy aplikacji i docelowego procesu. Tajne informacje mogą być ukryte i przesyłane właśnie w nagłówkach, zawierających losowe liczby. Wielkość oraz zawartość poszczególnych nagłówków zależą od użytych protokołów.

Wysyłanie i odbieranie wiadomości

Wysyłanie i odbieranie wiadomości

TCP (ang. Transmission Control Protocol) – jest to strumieniowy protokół połączeniowy, który jest częścią protokołu TCP/IP. Protokół TCP umożliwia detekcję i korekcję przesyłanych pakietów. Składa je w całość i steruje ich ruchem. TCP jest protokołem niezawodnym, co oznacza, że każda wysłana wiadomość wymaga potwierdzenia przez odbiorcę jej dostarczenia, w przeciwnym razie następuje retransmisja pakietu danych.

Nagłówek protokołu TCP

Grafika prezentuje zawartość nagłówka TCP. Pola, które mogą być potencjalne użyte do celów steganograficznych, pozostały w kolorze białym.

Struktura nagłówka TCP

Struktura nagłówka TCP

Początkowy numer sekwencyjny
Numer porządkowy (ang. Initial Sequence Number, w skrócie ISN) to numer bajtu w strumieniu przesyłanych danych, który identyfikuje pierwszy bajt danych w kolejnych segmentach TCP. ISN jest liczbą losową, mieszczącą się na 32 bitach. Pole to nie musi być unikatowe, ponieważ jest używane tylko raz, podczas nawiązywania połączenia. Powoduje to, że przesyłanie ukrytych danych w dalszej transmisji nie jest możliwe. Do efektywnego przesłania ukrytych informacji w ten sposób należy jednocześnie przesyłać je w wielu połączeniach, na przykład przez stronę WWW bogatą w dane multimedialne i wykorzystującą protokół HTTP 1.0. Każdy zasób strony (strona HTML, arkusz CSS, obrazek, dźwięk itp.) powoduje otwarcie nowego połączenia TCP. Wykrycie powyższej metody jest trudne,
ponieważ konieczne jest monitorowanie wszystkich nawiązywanych połączeń TCP i analiza każdego numeru sekwencyjnego. Zapobieganie ukrytej transmisji polega na zastosowaniu technik proxy dla wszystkich połączeń podejrzanych o przenoszenie ukrytych informacji. Nie jest to łatwe zadanie i może się zdarzyć, że maszyna realizująca to zadanie potrzebuje znacznych zasobów przy intensywnej transmisji danych.

Pole zarezerwowane
Aktualnie sześciobitowe pole zarezerwowane nie jest wykorzystywane. Według dokumentu RFC2 definiujacego protokół TCP, pole to musi mieć zawsze wartość zero. Sieć jednak zazwyczaj ignoruje to pole i przepuszcza również inne wartości. Sytuacja wygląda podobnie jak w przypadku niewykorzystanych bitów pola TOS oraz flagi RF. Wykrycie i ograniczenie dodatkowej transmisji jest łatwe — wystarczy wyzerować pole zarezerwowane.

Wskaźnik ważności
Pole Urgent Pointer składa się z 16 bitów i jest bardzo rzadko stosowane. Według definicji protokołu pole to ma zastosowanie, tylko gdy jednocześnie zostanie
ustawiona flaga URG w nagłówku segmentu TCP. Przy próbie wysłania ukrytych danych przez pole wskaźnika ważności flagę URG należy zostawić wyzerowaną.
Wówczas wskaźnik ważności nie będzie interpretowany. Taki pakiet zostanie przesłany, mimo braku zgodności z dokumentem RFC.

Ukryty kanał w takiej formie warto ograniczyć i nie wykorzystywać całych 16 bitów pojemności pola. Pole wskaźnika ważności jest przesunięciem, wskazuje na ostatni „ważny” bajt w segmencie i jest dodawane do numeru sekwencyjnego w nagłówku segmentu TCP. Wielkość Maximum Transmission Unit (MTU) ogranicza rozmiar datagramu IP i dla sieci TCP/IP, ma na ogół wartość 1500 oktetów. Po pomniejszeniu tej wartości o minimalne rozmiary nagłówków IP i TCP uzyskamy 1460. Chcąc, aby nasza wiadomość była prawdopodobna i wiarygodna musi być krótsza od 1460 bajtów. Inna wartość pola wskaźnika ważności niż 0 przykuwa uwagę i jest podejrzana; jeśli do tego flaga URG jest ustawiona na 0, to łatwo jest dostrzec stworzony ukryty kanał.

Pole opcji
Występuje zarówno w nagłówku IP jak i TCP. Opcje protokołu TCP mają jednak zastosowanie w przeciwieństwie do nagłówka IP. Możliwe jest również tworzenie własnych opcji, nieuwzględnionych w protokole. Ograniczeniem wielkości jest jedynie maksymalna pojemność segmentu TCP. Użycie niecodziennych opcji wzbudzi jednak zainteresowanie, przez co fakt przesyłu dodatkowych informacji stanie się łatwy do wykrycia.

Protokół IP
IP służy do przesyłania pakietów danych przez sieć. Obecnie używane są dwie wersje tego protokołu: IPv4 (IP version 4) i IPv6 (IP version 6). IP w przeciwieństwie do TCP nie zapewnia żadnego systemu potwierdzania dostarczenia wiadomości. Pakiety danych otrzymywane z warstwy transportowej są dzielone na mniejsze datagramy. Każdy datagram zawiera nagłówek IP oraz bajty otrzymane z warstwy transportowej.

Struktura nagłówka IP

Struktura nagłówka IP

W nagłówku protokołu IP można wskazać kilka elementów, które mogą stanowić budulec ukrytego kanału. Na rysunku pozostały one w kolorze białym.

Typ obsługi
Pierwszym wyróżnionym polem nagłówka jest „Typ obsługi” (ang. Type of Service, w skrócie TOS). Jest to pole o pojemności 8-bitów i nie ma jednoznacznie określonej budowy, co oznacza, że może zostać wykorzystane w protokole, ale nie musi. Zależy to od używanego sprzętu lub oprogramowania.

  • użyć wszystkich 8 bitów do przesyłania danych;
  • wykorzystać jeden, nieużywany (najmłodszy) bit, by nie wpływać na wartości już wpisane do pola i nie zaburzać sposobu transmisji;
  • wykorzystać jeden bit, który normalnie jest stosowany, na przykład bit określający małe opóźnienie (bit 4.);
  • użyć trzech skrajnie lewych (najstarszych) bitów pola TOS, określających pierwszeństwo, a w praktyce ignorowanych w większości sieci;
  • wykorzystać dwa najmłodsze, nieużywane bity pola DSCP (ang. Differentiated Services Code Point) w sieciach wykorzystujących techniki przypisania różnych poziomów usług.

Powyższe metody różnią się pojemnością utworzonego ukrytego kanału oraz stopniem wykrywalności. Kanał utworzony w polu TOS jest podatny na zamazanie lub usunięcie. Jeśli w danej sieci pole to nie jest obsługiwane, routery mogą je ignorować lub zerować, czyli zamazywać. Natomiast jeśli pole jest używane, możliwe jest automatyczne ustawianie go w routerze zgodnie z wcześniejszą konfiguracją.

Pole identyfikacji
Kolejne pole to 16-bitowe pole identyfikacji, które musi być unikalne w ramach jednej transmisji (nadawca-odbiorca). Nie istnieje narzucona zależność pomiędzy kolejnymi numerami identyfikacyjnymi pakietów, więc można dowolnie zmieniać wartości tego pola. Jeżeli numery identyfikacji będą niepowtarzalne, a wartości pól identyfikacji będą niezależne od siebie i analiza statystyczna niemożliwa do wykonania, to tak utworzony kanał będzie stosunkowo bezpieczny. Jeśli jednak modyfikacja pola identyfikacji zostałaby wykryta, atak na taki kanał jest znacznie trudniejszy niż dla pola Type of Service.

Pole flag fragmentacji
W protokole IP występują trzy flagi, określające pożądane traktowanie data-
gramu w przypadku wystąpienia konieczności przeprowadzenia jego fragmentacji.
Kolejno od lewej (od najstarszego bitu) są to:

  • RF – (Reserved Flag) to najstarszy, nieużywany bit, posiada zawsze wartość 0. Ustawienie tego bitu nie wpływa na sposób traktowania diagramów przez routery, więc jest możliwe wykorzystanie nieużywanej flagi fragmentacji do transmisji danych.
  • DF – (Don’t Fragment) – ustawienie tej flagi oznacza brak zgody na przeprowadzanie fragmentacji tego datagramu (jeśli datagram musi być poddany fragmentacji, a flaga DF jest ustawiona, to datagram zostanie odrzucony);
  • MF – (More Fragments), ustawiona oznacza, że dla datagramu nastąpiła fragmentacja i występują po nim kolejne pakiety. Ostatni fragment datagramu ma tę flagę wyzerowaną.

Kanały oferowane przez flagi mają bardzo małą pojemność i są łatwo wykrywalne.

Pole opcji
W większości przypadków pozostaje nieużywane i posiada zmienną długość. Za pomocą tego pola możliwe jest definiowanie własnych opcji, które są numerowane
i dzielone według własnego upodobania. Umożliwia to wykorzystanie numerów dotąd nieużywanych do przesyłania danych. Pojemność jest wtedy ograniczona jedynie przez rozmiar danych niesionych przez datagram oraz maksymalną wielkość jednostki transportowej. W przypadku wykorzystania opcji zdefiniowanych na podstawie dokumentacji RFC, która opisuje protokół IP, wielkość ukrytego kanału waha się od jednego bitu na opcję do kilku bądź kilkunastu bajtów dla opcji z parametrami. Korzystanie z opcji definiowanych w RFC niesie jednak ryzyko, że dane mogą zostać usunięte przez poprawnie skonfigurowane routery. W przypadku definiowania własnych opcji dane zostaną przepuszczone przez router, jednak mogą wydać się podejrzane ze względu na brak zgodności z dokumentem RFC.

Metoda RSTEG

Jednak steganografia sieciowa to nie tylko modyfikacja nagłówków. Do przesłania steganogramu można użyć również mechanizmu retransmisji utraconych pakietów. Metoda RSTEG (ang. Retransmission STEGanography) opiera się na protokole TCP i wykorzystuje fakt, że brak potwierdzenia odebrania pakietu oznacza, że pakiet nie dotarł do odbiorcy. Obie strony tajnej komunikacji muszą być wtajemniczone w plan i działać świadomie. Jeśli w pewnym momencie host pełniący funkcję odbiorcy, mimo otrzymania pakietu nie wyśle potwierdzenia, dla nadawcy jest to sygnał, że musi przeprowadzić retransmisję danych. W tym momencie zamiast właściwego pakietu wysyłany jest pakiet ze steganogramem. Odbiorca wie, że kolejny pakiet będzie zawierał tajne informacje, więc bez problemu go odbiera. Procedurę można powtórzyć dowolną ilość razy a z uwagi na to, że retransmisje w sieciach komputerowych są powszechnym zjawiskiem, rozpoznanie tak przeprowadzonej wymiany danych jako anomalii jest dość trudne.

Protokół VoIP

VoIP (ang. Voice over Internet Protocol) to protokół do przesyłania informacji głosowych w formie pakietów IP. Komunikacja VoIP składa się z trzech faz. Najpierw nawiązywane jest połączenie między nadawcą a odbiorcą, później następuje faza z wymianą właściwych informacji. Trzecią fazę stanowi rozłączanie. Rozwiąznie VoIP bazuje również na innych protokołach, w których możliwa jest steganografia.

Najpopularniejsze są dwa sposoby steganografii z wykorzystaniem VoIP i protokołów pomocniczych w nim używanych.

  • Ukrywanie informacji w protokole SIP (ang. Session Initialization Protocol), będącym standardem inicjalizacji sesji wymiany danych pomiędzy węzłami chcącymi się ze sobą komunikować. Nagłówek pakietu zaproszenia, wysyłany podczas nawiązywania połączenia, zawiera pola nieużywane.
  • Metoda LACK (ang. Lost Audio PaCKets Stenography), opierająca się na protokołach transportowych, służących do przesyłu konwersacji RTP (ang. Realtime Transport Protocol) oraz wchodzący w jego skład UDP. Protokół UDP nie korzysta z mechanizmów potwierdzenia i retransmisji pakietów da-
    nych. Po przekroczeniu określonego czasu są uznawane za zaginione i nawet jeśli w końcu dotrą, to są ignorowane. Podczas rozmowy VoIP utrata części
    pakietów jest normalna i zazwyczaj użytkownik tego nie zauważa. Wykorzystując tę zależność można celowo tak manipulować pakietami danych
    ze steganogramem, aby były klasyfikowane jako opóźnione. Węzły sieciowe nieświadome tego działania będą je ignorować, natomiast odbiorca wtajemniczony w plan ukrytej komunikacji może taki pakiet przetworzyć i odebrać wiadomość.

1Model odniesienia łączenia systemów otwartych (ang. ISO Open Systems Interconnection Reference Model), standard zdefiniowany przez ISO oraz ITU-T opisujący strukturę komunikacji sieciowej, stawiany często za wzór dla protokołów sieciowych.
2RFC to zbiór technicznych dokumentów związanych z sieciami komputerowymi, niektóre z nich przekształciły się poźniej w oficjalne standardy. Za ich publikację odpowiada Internet Engineering Task Force. Każdy nowy dokument otrzymuje indywidoalny numer. Protokół TCP definiuje RFC 793

Metoda modyfikacji kolorów indeksowanych

Akrykuł wyjaśnia budowę pliku GIF i przykład steganografii metodą modyfikacji kolorów indeksowanych.

Obraz w formacie GIF jest plikiem indeksowanym. Oznacza to, że piksele nie zawierają bezpośrednio informacji o kolorach RGB, tylko numer indeksu do tablicy,
w której ten kolor się znajduje. Wiadomość zostaje ukryta według wcześniejszego schematu algorytmem LSB, jednak zmianie nie ulegają wartości składowe danego koloru, ale numery indeksów. Zmiana tylko jednego najmłodszego bitu powoduje przesunięcie wartości numeru indeksu co najwyżej o 1. Z tego powodu
obok siebie w tablicy kolorów powinny występować barwy o podobnych własnościach, aby ich podmiana nie była zauważalna. Dodatkowo informacje o pikselach są kompresowane metodą słownikową LZW (Lempel-Ziv-Welch), co pozwala na uzyskanie mniejszego rozmiaru pliku w formacie GIF, jednak nieco komplikuje sposób wydobycia informacji o numerach indeksów w pikselach. Powyższe czynniki wpływają na konieczność wstępnego przetworzenia pliku przed zastosowaniem algorytmu LSB.

Obraz GIF przekształcony w tablice bajtów składa się z kilku bloków informacji. Na potrzeby ukrycia informacji konieczne jest wydobycie indeksowanej tablicy kolorów oraz samych danych dotyczących indeksu w danym pikselu. Stałe elementy w budowie formatu pozwalają łatwo wyodrębnić potrzebne informacje z obrazu w formie tablicy bajtów.

Plik rozpoczyna się blokiem nagłówkowym. Pierwsze 6 bajtów zawsze określa format pliku, na przykład GIF89a. W programie sprawdzenie formatu pliku odbywa się poprzez odczytanie typu pliku mimetype,np:

String mimetype = new MimetypesFileTypeMap().getContentType(inputFile)

Istotny jest 11 bajt z kolei (indeks 10), który zawiera 4 pola spakowanych danych. Najbardziej znaczący bit to informacja czy w pliku występuje globalna tabela kolorów. Ustawienie tej flagi na 1 potwierdza, że obraz zawiera indeksowaną tablicę kolorów globalnych. Przydatną informację zawierają również 3 ostatnie bity w tym bloku, określające rozmiar tablicy kolorów. Jeśli wartość tego pola jest równa N, to liczba wpisów w globalnej tablicy kolorów będzie wynosić $2^{(N + 1)}$. Tablica kolorów w formacie GIF może mieć więc maksymalnie 256 kolorów, a jej rozmiar to $3*2^{(N + 1)}$, ponieważ każdy kolor zapisany jest za pomocą trzech składowych RGB.

Tablica kolorów w obrazie GIF nie jest domyślnie w żaden sposób sortowana. Kolory można by uporządkować tak, aby obok siebie znajdowały się podobne odcienie z palety, jednak oko ludzkie jest bardziej czułe na różnicę w jasności pikseli niż na zmianę koloru, więc w projekcie tablica została posortowana według wzoru na relatywną luminancję w przestrzeni kolorów RGB:
luminance = (r ∗ 0.2126f + g ∗ 0.7152f + b ∗ 0.0722f )1

Po lewej grafika stworzona na podstawie tablicy kolorów wczytanej z pliku, po prawej kolejność barw w posortowanej tablicy

Po lewej grafika stworzona na podstawie tablicy kolorów wczytanej
z pliku, po prawej kolejność barw w posortowanej tablicy

Dzięki sortowaniu globalnej tablicy kolorów podmiana barw na sąsiednie przy użyciu LSB w tablicy indeksów nie jest tak zauważalna.

Po posortowaniu tablicy kolorów kolej na podmianę indeksów w pikselach obrazu. Po wczytaniu tablicy kolorów przesunięcie numeru indeksu danych wynosi $12 + 3*2^{(N + 1)}$. Kolejny może być opcjonalny blok sterowania rozszerzeniami graficznymi. Łatwo rozpoznać czy wystęþuje, ponieważ zawsze rozpoczyna się taką samą parą bajtów w notacji heksadecymalnej 21 oraz F9, czyli $33_{(10)}$ i $-7_{(10)}$. Jeśli blok jest obecny, dodajemy do przesunięcia kolejne 8 bajtów i przechodzimy do bloku danych obrazu, który standardowo zaczyna się od bajtu $2C_{(16)}$, czyli $44_{(10)}$. Odczytanie danych dotyczących szerokości i wysokości obrazu pomoże upewnić się, że do tej pory dane pliku były odczytane prawidłowo. Jeśli obraz składa się z ruchomej sekwencji, mogą wystąpić lokalne tablice kolorów, zbudowane podobnie jak główna tablica kolorów.

Następny blok zawiera w końcu szukaną informację, czyli tablicę z indeksami kolorów pikseli. Dla dużych obrazów kolejne wartości pikseli zajęłyby dużo miejsca, więc dane są skompresowane algorytmem LZW. W skrócie LZW tworzy pomocniczy słownik, w którym występującym w obrazie wartościom przypisuje się dodatkowe kody. W przypadku gdy użyta jest maksymalna ilość barw, czyli 256 – kody poszczególnych kolorów od 0 do 255 zostają przypisane w słowniku tak jak w tablicy kolorów. Jako kolejny element z kodem 256 umieszczony jest znacznik „clear code”, który informuje o rozpoczęciu kolejnej sekwencji danych.
Następny kod 257 zarezerwowany jest jako informacja o końcu pliku. Dane o pik- selach podzielone są na bloki o wielkości z zakresu 0-255. Rozmiar każdego bloku jest określony w pierwszym wczytanym bajcie danej sekwencji. Dalsze dodawanie kodów do słownika opiera się na łączeniu sekwencji poprzednich bajtów i nowowczytanego. Jeśli ciąg danych powstały w ten sposób nie ma przydzielonego swojego kodu, zostaje dodany do słownika z kolejną wartością zapisaną jako kod. Po przeprowadzeniu dekompresji metodą LZW otrzymujemy tablicę bajtów z indeksami kolorów dla poszczególnych pikseli. Wartości pikseli należy podmienić na aktualne indeksy z posortowanej tablicy kolorów. Po tej operacji ukrycie wiadomości odbywa się na takiej samej zasadzie jak w plikach JPG lub PNG, z tą różnicą, że zmianie ulegają nie poszczególne kolory składowych RGB, tylko indeksy kolorów. Po tej operacji następuje utworzenie nowego pliku GIF, na podstawie pliku wejściowego, poprzez podmianę danych na posortowaną tablicą indeksów oraz skompresowanych algorytmem LZW danych nowych indeksów pikseli. Wizualnie obraz wynikowy nie różni się od oryginału.

Różnica między kolorami poszczególnych pikseli w powyższym przykładzie jest dostrzegalna dopiero w dużym powiększeniu. Różnice te byłyby znacznie bardziej zauważalne, gdyby osadzenie wiadomości nastąpiło w kolejnych występujących po sobie pikselach. Ukrywana informacja została jednak rozłożona na cały obraz.

Obraz wejściowy (po lewej) i obraz z osadzoną wiadomością (opra- cowanie własne)

Obraz wejściowy (po lewej) i obraz z osadzoną wiadomością (opra-
cowanie własne)

Zaburzenia wprowadzone w kolorach pikseli, widoczne przy po- większeniu 800%. W odcieniach niebieskiego na obrazie po prawej stronie dostrzec można żółte piksele

Zaburzenia wprowadzone w kolorach pikseli, widoczne przy po-
większeniu 800%. W odcieniach niebieskiego na obrazie po prawej stronie dostrzec
można żółte piksele


1 Na podstawie https://www.w3.org/TR/WCAG20/relative-luminance.xml

Metoda procentowa

Metoda procentowa dotyczy obrazów monochromatycznych, czy takich, których typ MIME to TYPE_BYTE_BINARY. Dzięki temu barwa piksela może być przedstawiona tylko jako wartość 0 – czarna lub 1 – biała. Poniższy tekst przedstawia moją propozycję zastosowania metody procentowej na obrazie.

Obraz powinien zostać podzielony na obszary. Np. o określonej wielkości, definiowanej na podstawie wysokości i szerokości obrazu. Takie rozwiązanie ogranicza dostosowanie obszarów do ukrywanej wiadomości i niesie ze sobą ryzyko, że nośnik będzie zawierał za mało pól nadających się do ukrycia wiadomości. Z drugiej strony, na podstawie samego pliku z szyfrogramem możliwe jest wyznaczenie obszarów i odczytanie ukrytej wiadomości.

Obraz wejściowy potencjalnie daje możliwość ukrycia dokładnie tylu bitów danych, na ile obszarów zostanie podzielony. Jednak trzeba wziąć pod uwagę, że część z obszarów nie będzie nadawała się do ukrycia wiadomości i zostanie oznaczona jako nieużywana. Sytuacja taka wystąpi, gdy zmiana ogólnej wartości danego pola, wymagałaby zmiany liczby pikseli przekraczającej próg bezpieczeństwa. Próg bezpieczeństwa określa maksymalną liczbę pikseli w obszarze która może zostać zmieniona. Im wyższy próg tym powstałe zaburzenia w pliku będą większe. Z tego powodu proces zarówno osadzania wiadomości w nośniku, jak i jej wyodrębniania rozpoczyna się od zdefiniowania listy obszarów nadających się do użycia.

Przyjmijmy, że wielkość pojedynczego obszaru to 1% szerokości całkowitej obrazu oraz 1% wysokości, a próg bezpieczeństwa, który określa maksymalną liczbę pikseli w obszarze wynosi 25% ilości pikseli pojedynczego obszaru. Oznacza to, że przetwarzany obraz musi mieć co najmniej 200×200 pikseli. Wtedy rozmiar pojedynczego obszaru ma 2×2 pixele, a maksymalna liczba pikseli, które mogą ulec modyfikacji w obszarze to 1.

Obszar został przedstawiony poprzez klasę Field, która zawiera współrzędne x, y punktu rozpoczynającego obszar w obrazie, ogólną wartość pola jako boolean value, liczbę pól stanowiących większość – majority oraz ilość pikseli – pixelsT oChange, które należy zmienić w przypadku konieczności modyfikacji przeważającego koloru obszaru.

Algorytm zlicza ilość czarnych pikseli blackPixels w każdym pełnym obszarze, czyli takim, który składa się z ilości pól określonej jako pixelsInFields = 0.01 ∗ width ∗ 0.01 ∗ height, gdzie width i height to odpowiednio szerokość i wysokość obrazu stanowiącego kontener. Na podstawie procentowej zawartości pól danego koloru obliczana jest ogólna wartość obszaru.

Jeśli blackPixels/pixelsInFields >= 0.5, to value = false, w przecinym razie value = true.

W takim wypadku, aby zmienić przewagę kolorów w polu oznaczonym jako false, należy doprowadzić do sytuacji, aby 51% piseli stanowiły te w kolorze białym. Dla zmiany na kolor czarny minimalną wartością jest 50%. Zmianie ulega zawsze jak najmniejsza potrzebna liczba pikseli, w celu ograniczenia ilości wprowadzonych zakłóceń do obrazu.

Do obliczenia najmniejszej liczby pikseli, które muszą ulec zmianie, korzystamy z proporcji:

(minority + pixelsToChange)/pixelsInF ields = percent
pixelsT oChange = percent ∗ pixelsInF ields − minority,

gdzie minority to liczba pikseli występujących w mniejszości w danym obszarze, pixelsToChange to szukana najmniejsza liczba pikseli, które muszą ulec zmianie, a percent to współczynnik wynoszący odpowiednio 0,5 lub 0,51 w zależności od wartości value.

Należy również pamiętać, że liczba pikseli jest liczbą całkowitą, jeśli więc wyliczona wartość zawiera część ułamkową, należy dodać 1.

Jeśli pixelsT oChange <= 0.25 ∗ pixelsInF ields, to pole zostaje dodane do listy jako użyteczne. Obszary, które wymagałyby zmiany większej liczby pikseli niż ustalony próg nie są brane pod uwagę przy ukrywaniu wiadomości.

Tworzenie listy obszarów nadających się do ukrycia informacji.

private static void findUsefulFields(WritableRaster imageRaster) {
      for(int i=0; i<height; i+=y){
            for(int j=0; j<width; j+=x){
                  int y1 = i+y;
                  int x1 = j+x;
                  if(y1<height && x1<width){
                        int blackPixels = countBlackPixelInField(i, j, imageRaster, y1, x1);
                        double pixelToChangeFromProportion = 0;
                        double percent = 0;
                        Field field = new Field();
                        field.setX(j);
                        field.setY(i);
                        if(blackPixels / (double) pixelsInFields >= 0.5){
                             field.setValue(false);
                             field.setMajority(blackPixels);
                             percent = 0.51;
                        }
                       else{
                             field.setValue(true);
                             field.setMajority(pixelsInFields - blackPixels);
                             percent = 0.5;
                       }
                       int minority = pixelsInFields - field.getMajority();
                       pixelToChangeFromProportion = percent*pixelsInFields - minority;
                       int pixelToChangeFromProportionInt = (int)
                       pixelToChangeFromProportion;
	               if(pixelToChangeFromProportion > pixelToChangeFromProportionInt){
		              pixelToChangeFromProportionInt = pixelToChangeFromProportionInt + 1;
	                }
			
	               field.setPixelsToChange(pixelToChangeFromProportionInt);

	               if(pixelToChangeFromProportionInt <= maxPixelToChange){
		              fieldsList.add(field);
	               }
		
	        }
           }
      }
}

Funkcja do tworzenia listy używanych obszarów jest tworzona zarówno w przypadku ukrywania, jak i dekodowania wiadomości. W każdym obszarze można ukryć jeden bit danych. Początkowe 32 bity będą tak jak w poprzednich algorytmach zawsze przeznaczone na określenie długości wiadomości. Szyfrogram jest ukrywany w kolejnych obszarach z listy. Jeśli pole ma inną wartość niż oczekiwana składowa wiadomości, zostaje zmieniona określona wcześniej liczba pikseli, wybierana w losowy sposób w obrębie danego obszaru.

Poniższy obraz o wymiarach 16x16 pikseli został podzielony na 16 obszarów o rozmiarze 4x4 piksele. Każdy obszar składa się z 16 pikseli. Jeśli margines bezpieczeństwa zostanie ustalony na 25%, to w każdym obszarze można zmodyfikować maksymalnie 4 piksele, aby zmienić przewagę danego koloru w obszarze. Jeśli tyle nie wystarczy, obszar zostanie oznaczony jako nieużywany i będzie pominięty w algorytmie. Przyjmijmy, że jeżeli liczba pikseli czarnych, czyli P (0) >= 50%X, to obszar przyjmuje wartość 0, w przeciwnym razie – P (1) > 50%X obszar przyjmuje 1.

Do każdego piksela obrazu można odwołać się poprzez jego współrzędne. Umiejscowienie punktu (0,0) może różnić się w zależności od użytego języka programowania lub biblioteki. W stworzonym projekcie punkt (0,0) jest zawsze umiejscowiony w lewym górnym rogu obrazu. Kolejne obszary w obrazie zostały ponumerowane według tej reguły.

Przykładowy obraz monochromatyczny i jego podział na obszary

Przykładowy obraz monochromatyczny i jego podział na obszary

Przed ukryciem danych następuje sprawdzenie, czy obszar jest użyteczny, to znaczy czy modyfikacja liczby pikseli oznaczonych jako próg bezpieczeństwa wystarczy na zmianę wartości pola. Obszar oznaczony jako 0 zawiera 9 pól białych i 7 czarnych; przewaga pól białych powoduje przyjęcie przez pole umówionej wartości 1. Jeśli jednak w tym polu miałaby być ukryta wartość 0, wystarczy zmienić 1 piksel na czarny. Liczba pikseli, które muszą ulec zmianie, nie przekracza ustalonego progu bezpieczeństwa, czyli 4 pikseli, więc obszar można uznać za użyteczny. W przedstawionym przykładzie wszystkie pola można uznać za użyteczne, ponieważ rozkład białych i czarnych pikseli jest dość równomierny. Oznacza to, że możliwe jest ukrycie 16 bitów wiadomości. Ukryjmy binarny ciąg: 0110 1000 0110 1001 w kolejności odczytywania pól jak na powyższym schemacie. W każdym polu, jeśli ogólna wartość obszaru jest niezgodna z kolejną ukrywaną wartością, zmieniana jest minimalna ilość pikseli, która wpływa na zmianę wartości ogólnej. Zmieniane piksele są wybierane losowo.

Ukrycie wiadomości w kolejnych obszarach i obraz wyjściowy

Ukrycie wiadomości w kolejnych obszarach i obraz wyjściowy

Ogólny algorytm postępowania w przykładowej aplikacji:
1. Sprawdzamy, czy wymiary obrazu są większe lub równe 200x200 pikseli.
2. Wyznaczenie 1% wysokości i 1% szerokości obrazy wejściowego i zaokrąglenie wyników do liczb całkowitych.
3. Wyznaczenie listy obszarów użytecznych, czyli takich, w których modyfikacja liczby pikseli, nieprzekraczającej ustalonej wartości 25% na przeciwny kolor powoduje zmianę przeważającego koloru w polu.
4. Ukrycie długości wiadomości oraz samej wiadomości zapisanych jako ciągi binarne w obszarach określonych jako użyteczne.
5. Jeśli dany obszar ma przewagę białych pikseli, to jego wartość określana jest jako 1 (true), w przeciwnym razie 0 (false). Jeśli wartość danego obszaru zgadza się z kolejną ukrywaną wartością, to algorytm przechodzi do ukrywania kolejnej wartości w kolejnym obszarze. Jeśli obszar ma wartość przeciwną modyfikacji zostaje poddana minimalna liczba pikseli, tak aby 50% danego obszaru stanowiły piksele czarne, jeśli ukrywamy 0 lub 51% danego obszaru piksele białe dla wartości 1. Piksele są wybierane losowo z danego obszaru. Jeśli wartość danego piksela można zmienić, to licznik zmienionych pikseli zostaje zwiększony, w przeciwnym razie losowane są nowe współrzędne.

Po lewej obraz oryginalny, po prawej obraz z ukrytą wiadomością

Po lewej obraz oryginalny, po prawej obraz z ukrytą wiadomością

Algorytm LSB

Algorytm najmniej znaczącego bitu (ang. Least Significant Bit) jest najprostszą i najczęściej stosowaną metodą steganograficzną dla obrazów. Przyjmijmy, że chcemy ukryć dowolne dane binarne (tekst, obraz lub inne dane przedstawione jako ciąg zer i jedynek), takie które zmieszczą się w naszym nośniku. Jako nośnik przyjmijmy obraz w formacie PNG w 24-bitowym trybie RGB. Format PNG stosuje bezstratny system kompresji, dzięki temu daje nam bezpośredni dostęp do informacji o poszczególnych pikselach i możemy stworzyć zmodyfikowany obraz bez obaw o “zgubienie” części danych podczas zapisu. Tryb 24-bitowy oznacza, że do dyspozycji mamy 3 kanały, nie używamy kanału Alpha.

Każde dane cyfrowe można przedstawić w postaci binarnej. Wprowadzone informacje przed ukryciem są przetwarzane na tablicę bajtów, a każdy bajt jest zapisywany za pomocą 8 bitów.

string jako ciąg bitów

Zmienna tekstowa String jako ciąg bitów.

Najmniej znaczącymi bitami są bity po prawej stronie w zapisie binarnym. Jeśli w każdej składowej zmienimy ostatni bit, to barwa piksela zmieni się na tyle nieznacznie, że oko ludzkie nie zarejestruje tej zmiany.
Kolor R: 11111110 G: 11111110 B: 11111110, czyli RGB (254, 254, 254), będzie tylko nieznacznie ciemniejszy niż rzeczywisty biały kolor.

Aplikacja przy odczytywaniu wiadomości powinna wiedzieć jak długo ma szukać ukrytych danych, dlatego na początku każdego pliku zostaje ukryta informacja o rozmiarze szyfrogramu. Informacje steganograficzne mają więc dwie części: wielkość komunikatu binarnego oraz samą wiadomość.

Poniżej został przestawiony przykład kodu w języku Java. Chociaż do operacji na bitach lepiej nadawałyby się języki niższego poziomu. Obraz jest wczytywany jako obiekt BufferedImage, co umożliwia pełną kontrolę nad pikselami obrazu. Metoda getRaster(), zwraca obiekt typu WritableRaster, w którym można modyfikować poszczególne piksele obrazu. Długość tablicy bajtów z danymi obrazu jest trzykrotnie większa niż obiektu BufferedImage. Klasa BufferedImage odwołuje się do pikseli obrazu, natomiast dalsza konwersja pliku rozkłada kolejne piksele na trzy kolory składowe RGB. Każdy zapisywany jest na 8 bitach, czyli 1 bajcie. W efekcie do zapisu danych o kolorze z jednego piksela potrzebujemy 3 bajtów. Tablica bajtów imageByte zawiera kolejno występujące po sobie składowe pikseli: RGBRGBRGB… Tablica msg zawiera treść ukrywanej wiadomości. W przypadku próby ukrycia tekstu, tablicę bajtów ze zwykłego typu String można uzyskać poprzez metodę getBytes() z opcjonalnym argumentem formatowania tekstu.

Przetworzenie nośnika i ukrywanej wiadomości na tablice bajtów.

public BufferedImage encryptImage(File file, byte [] text){

      BufferedImage image = bIP.getBufferedImage(file);
      WritableRaster raster = image.getRaster();
      DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();

      byte[] imageByte = buffer.getData();
      byte msg[] = text;
      byte len[] = BinaryConversion.toByteArray(msg.length);

      LSB.encodeText(imageByte, len, 0);
      LSB.encodeText(imageByte, msg, 32);

      return image;
}

Rozmiar jest przedstawiony jako typ Integer. Do zapisu takiej zmiennej w języku Java używane są 4 bajty, czyli 32 bity. Przyjęte zostało, że w każdym bajcie danych (jednej składowej koloru) zostanie zmieniony tylko jeden najmniej znaczący bit, aby zminimalizować zakłócenia w obrazie. Oznacza to, że ukrycie 1 bajta danych wymaga modyfikacji 8 bajtów obrazu. W efekcie do ukrycia liczby na 32 bitach, użyte zostaną 32 bajty, czyli pierwsze 32 elementy z tablicy reprezentującej obraz.

Pierwsze 32 bajty danych obrazu będą zawsze wykorzystane na osadzenie powyższej informacji. W kolejnych bajtach zawarta zostanie już konkretna wiadomość.

Zmiana obrazu w tablicę bitów

Zmiana obrazu w tablicę bitów

Zamiana liczby typu int na tablicę bajtów.

public class BinaryConversion {
     public static byte[] toByteArray(int length) {
           byte byte3 = (byte)((length & 0xFF000000) >>> 24);
           byte byte2 = (byte)((length & 0x00FF0000) >>> 16);
           byte byte1 = (byte)((length & 0x0000FF00) >>> 8 );
           byte byte0 = (byte)((length & 0x000000FF) );
           return(new byte[]{byte3,byte2,byte1,byte0});
     }
}

W powyższym kodzie liczba całkowita zostaje zamieniona na tablicę czterech bajtów, gdzie każdy bajt jest przedstawiony na 8 bitach. Wykorzystany został operator >>>, który w języku Java służy do przesuwania nieoznaczonych bitów w prawo.

Im więcej najmniej znaczących bitów w danym bajcie zostanie przeznaczonych do zmiany, tym dłuższą wiadomość można ukryć. Wprowadzenie znacznych modyfikacji do nośnika danych powoduje jednak pogorszenie jego jakości, a im bardziej obraz odbiega od oryginału, tym zwiększa się zagrożenie odkrycia wiadomości przez postronnego użytkownika.

Steganogram w najprostszym przypadku może być ukryty sekwencyjnie w kolejnych próbkach sygnału lub w wersji zmodyfikowanej tylko w określonych próbkach według wybranego klucza. Mogą to być przykładowo piksele o dwóch dominujących kolorach w obrazie lub rozmieszczenie w indeksach pikseli o określonej zależności, na przykład w co czwartym pikselu.

Jeżeli bitowo zapisana tajna informacja jest krótsza niż nośnik danych, to znaczy pozostają próbki niezmodyfikowane, dobrą praktyką jest uzupełnienie wiadomości, aby zwiększyć bezpieczeństwo danych. W przeciwnym razie ukryte dane mogłyby zostać łatwo wykryte za pomocą analizy statystycznej sygnału.

Przykładowo za pomocą trzech najmniej znaczących bitów każdej składowej 24-bitowego obrazu o rozdzielczości 800×600 punktów, można ukryć 1,44 mln bitów danych.

Ukrywanie bitów za pomocą podstawowego algorytmu LSB

Ukrywanie bitów za pomocą podstawowego algorytmu LSB

W celu utrudnienia wykrycia tajnej wiadomości w aplikacji zmiana nie powinna nastąpić w kolejno występujących po sobie wartościach tablicy obrazu, ale co
określoną (najlepiej losową) liczbę elementów. Dla ulatwienia w przykładowym kodzie przeskok (ozanaczony jako jump)jest zależny od wielkości obrazu opakowującego oraz długości ukrywanej wiadomości. Dodatkowo przyjęte zostało, że zmianie ulega tylko jeden najmniej znaczący bit w danym bajcie.

Ukrywanie wiadomości.

public class LSB {
      public static byte[] encodeText(byte[] image, byte[] addition, int offset) {
             if(addition.length + offset > image.length){
                  throw new IllegalArgumentException("File_not_long_enough!");
              }
       int jump =1;
       if(offset>0){
              jump = (image.length - offset)/(addition.length*8);
       }
       for (int i=0; i < addition.length; i++) {
             int byteVal = addition[i];
             for (int j=7; j >= 0; j--) {
                  int bitVal = (byteVal >>> j) & 1;
                  image[offset] = (byte)((image[offset]&0xFE) | bitVal);
                  offset+=jump;
             }
      }
      return image;
    }
}

Funkcja encodeText jako argumenty przyjmuje tablicę bajtów obrazu, tablicę bajtów osadzanych danych oraz przesunięcie. Wywoływana jest dwukrotnie. Pierwszy raz podczas ukrywania długości wiadomości. Wtedy przesunięcie zawsze wynosi 0, a liczba ukrywana jest w kolejnych 32 bajtach obrazu. Taki zabieg powoduje, że algorytm deszyfrujący wie w jaki sposób odczytać ukrytą wartość. Kolejne wywołanie ma na celu ukrycie treści właściwej tajnego przekazu. Przesunięcie wynosi 32 bajty, aby ominąć przestrzeń z ukrytą długością przekazu. Wiadomość właściwa nie musi już być ukrywana w kolejnych bajtach. Obliczany jest przeskok, nazwany w programie jako jump.

jump = (image.lengthoffset)/(addition.length ∗ 8);

Pozostała liczba bajtów obrazu, w których można ukryć dane, jest dzielona na ilość bitów tajnej informacji. Należy pamiętać, że przyjęta została zasada, że w jednym bajcie obrazu ukryty zostanie jeden bit wiadomości. Dzięki dodaniu przeskoku, wiadomość jest ukryta na obszarze całego pliku, a nie tylko jego początkowym fragmencie. Utrudni to wykrycie faktu zastosowania steganografii.

Zewnętrzna pętla for iteruje po każdym bajcie wiadomości przeznaczonej do ukrycia. Pętla wewnętrzna iteruje po kolejnych ukrywanych bitach wiadomości przy pomocy operatora >>>. W wyniku przesunięcia w prawo najbardziej znaczące bity ukrywanych danych stają się bitami najmniej znaczącymi i mogą być wstawione w miejsce najmłodszych bitów obrazu stanowiącego kontener. Zapis (byte)((image[offset] & 0xF E) | bitVal) przedstawia dany bajt obrazu jako reprezentację bitową a operacja alternatywy z zatajanym bitem pozwala na zmianę najmłodszego bitu na ukrywaną wartość.

Po lewej zdjęcie wejściowe, po prawej zdjęcie z ukrytym obrazem pizzy

Po lewej zdjęcie wejściowe, po prawej zdjęcie z ukrytym obrazem
pizzy

Grafika osadzona w powyższym zdjęciu

Grafika osadzona w powyższym zdjęciu

W powyższym przykładzie jako nośnik danych został użyty obraz PNG o bardzo dużym rozmiarze 5152×3888 pikseli. W tak dużym kontenerze bez problemu można ukryć inny plik – użyte zostało zdjęcie pizzy o wymiarach 1155×684 pikseli. Róźnica między oryginalnym zdjęciem a przetworzonym nie jest widoczna gołym okiem.

Największą wadą metody LSB jest to, że zazwyczaj łatwo wykryć ją przez programy służące do stegoanalizy. Każde przekształcenie nośnika danych powoduje też utratę zapisanych informacji.

Poniżej znajdują się porównanie dwóch wersji ukrytej grafiki z pizzą programem do wykonywania steganoanalizy – Steganabara. Analizie zostały poddane dwa pliki z ukrytą wiadomością. W pierwszym obraz został osadzony tradycyjnym algorytmem LSB, który umieszcza dane w kolejnych bajtach. W drugim użyty został algorytm zmodyfikowany z programu St3g0, używający przeskoku i rozmieszczenia danych w całym nośniku.

Na plikach został zastosowany filtr bitowych masek dla najmniej znaczących bitów każdego kanału koloru. Filtr analizuje warstwy bitowe, oddziela je i łączy w całość. Przy zastosowaniu tej metody dla obrazu z ukrytą wiadomością dla kolejnych składowych bez skoku w algorytmie, wyraźnie widać oddzieloną poziomą linię końca ukrytego obrazu. W przypadku z rozłożeniem ukrywanych bitów na cały plik wynik jest zbliżony do analizy obrazu bez ukrytej wiadomości

naliza filtrem masek bitowyc

analiza filtrem masek bitowych

Techniki steganograficzne oparte na ukrywaniu danych w plikach cyfrowych

Informacja w nośniku cyfrowym może być ukryta za pomocą różnych algorytmów, które są wybierane na podstawie szczególnych właściwości nośnika.

Ze względu na wprowadzone modyfikacje w pliku wejściowym można wyróżnić następujące metody [1]:

  • Substytucji — z nośnika zostają wydzielone dane nadmiarowe, których modyfikacja nie wpłynie znacząco na plik wynikowy. Wybrana część danych jest podmieniana na sekretną wiadomość. Przykładowymi algorytmami są LSB, metody modyfikacji kolorów indeksowanych lub metoda Patchwork. Przekształceniu mogą ulec na przykład wysokie częstotliwości w pliku dźwiękowym lub najmniej znaczące bity w pikselach obrazu.
  • Transformacji — sygnał dźwięku lub obrazu zostaje przekształcony do przestrzeni falowej, czyli przyjmuje reprezentację częstotliwościową. Informacje zostają dołączane poprzez modyfikacje współczynników transformacji. Próbki dźwięku lub wartości kolorów pikseli obrazu zostają poddane transformacji na przykład Fouriera, kosinusowej albo falkowej. W ten sposób uzyskiwana jest aproksymacja funkcyjna zbioru cyfrowych danych.
  • Statystyczne — modyfikowane są właściwości statystyczne nośnika na przykład wartości średniej lub odchylenia standardowego. Odczytanie tak ukrytej informacji odbywa się poprzez zastosowanie testów hipotez statystycznych.
  • Zniekształceniowe – ukryte dane zostają umieszczone poprzez wprowadzanie zniekształceń do kontenera danych. Odczyt poufnej wiadomości polega na porównaniu nośnika oryginalnego i zniekształconego. Tego typu metody sprawdzają w plikach tekstowych. Komunikat może zostać dodany poprzez zmianę układu treści dokumentu na stronie, modyfikację odległości między wyrazami lub wprowadzenie nieznacznych zmian w czcionce.
  • Generacji nośnika — osadzenie tajnej informacji występuje już podczas tworzenia samego nośnika, przykładowo generowanie fraktali z ukrytą informacją.

Najczęściej stosowanymi metodami są metody substytucji i transformacji. Metody substytucji wykorzystują najmniej znaczące części danych lub puste miejsce w nośniku, natomiast metody transformacyjne ukrywają dane na przestrzeni całego kontenera, również w znaczących jego częściach. Znaczące obszary danych nośnika nie są eliminowane przez kompresję i proste zniekształcenia, więc odporność danych ukrytych metodami transformacyjnymi jest dużo większa niż danych ukrytych poprzez metody substytucji. Równomierne rozłożenie ukrytych danych powoduje również trudniejsze wykrycie dodatkowych informacji. Odczyt informacji polega na porównaniu nośnika przed i po przetworzeniu lub użycia stegoklucza określającego obszar lub sposób ukrycia danych. Poniżej zostały zaprezentowane wybrane algorytmy ukrywania danych w plikach graficznych i dźwiękowych.

LSB

Metoda najmniej znaczącego bitu – LSB (ang. Least Significant Bit) polega na podmianie najmniej znaczącego bitu cyfrowej próbki sygnału, bitem ukrywanej informacji.

Najmniej znaczący bit bywa również nazywany najmłodszym bitem. W kodzie binarnym jest to bit o najmniejszej wadze. W przykładzie obok zaznaczony najmłodszy bit ma wagę $2^0$, czyli 1.

Binarna reprezentacja liczby

Binarna reprezentacja liczby $76_{(10)}$ na 8 bitach

Algorytm LSB może być z powodzeniem stosowany na zbiorze próbek zarówno obrazów rastrowych, jak i plików dźwiękowych. Dodatkowo może być łączony z innymi metodami ukrywania danych. Swoją popularność zawdzięcza szybkości i prostocie działania. Często jednak już analiza histogramów lub użycie testów statystycznych pozwala na sklasyfikowanie pliku jako podejrzanego. Ponadto zastąpienie niewłaściwych bitów lub zbyt dużej ich ilości może wprowadzić znaczne zmiany w pliku i spowodować wykrycie tajnego przekazu. Metodę LSB można próbować udoskonalać w taki sposób, aby edytowany plik był bardziej odporny na stegoanalizę oraz mniej podatny na zniszczenie spowodowane modyfikacją nośnika, na przykład poprzez dodanie kompresji i permutacji danych tajnej wiadomości.

Więcej o praktycznym zastosowaniu algorytmu LSB >>tutaj<<

Metoda modyfikacji kolorów indeksowanych

Nie dla wszystkich plików graficznych można bezpośrednio zastosować metodę LSB. Niektóre formaty obrazów posługują się indeksowaniem kolorów, jako przykład może służyć format GIF. Oznacza to, że dla obrazu jest dodatkowo tworzona paleta barw, zawierająca wszystkie kolory użyte w grafice, a pojedynczy piksel obrazu przechowuje informację o lokalizacji użytego koloru w palecie. Wszystkie piksele o jednakowej barwie będą wskazywać na ten sam element palety barw. Dzięki temu możliwa jest redukcja bitów potrzebnych do zapisania kolorów wszystkich pikseli.

Obraz z indeksowaną tablicą barw należy wstępnie przetworzyć poprzez zredukowanie liczby kolorów użytych w palecie obrazu. Bity poufnej informacji są ukrywane w zdublowanych i zmodyfikowanych parach. Nawet jeśli w obrazie o 24-bitowej głębi koloru zredukujemy liczbę kolorów o połowę, to jakość obrazu nie zostanie widocznie obniżona.

W przypadku redukcji ilości barw z 256 na 128 (8-bitowa głębia) w palecie kolorów dla danego obrazu pozostaje 128 zdublowanych próbek. W tak przetworzonym pliku dołączenie bitu poufnej wiadomości metodą LSB do wartości indeksu nie spowoduje zauważalnej zmiany barwy danego piksela, jeśli paleta kolorów będzie posortowana w taki sposób, że podobne kolory będą występowały obok siebie. Indeksowaną tablicę barw można posortować według podobieństwa kolorów lub innych cech na przykład jasności.

Więcej o steganografii obrazów z indeksowaną tablicą barw >>tutaj<<

Metoda Patchwork

Główna idea tego algorytmu polega na wybraniu par cyfrowo zapisanego dźwięku lub punktów obrazu z wykorzystaniem pseudolosowego generatora PRNG (ang. Pseudo Random Generator), inicjowanego ziarnem (wartością startową będąca kluczem). Próbki są wybierane w taki sposób, aby wartość oczekiwana różnicy wartości obu próbek wynosiła zero. Następnie pierwsza liczba zostaje zwiększona o 1 a druga o 1 zmniejszona. Zmiana jest na tyle subtelna, że pozostaje niezauważalna przez człowieka. Tajna informacja jest ukrywana za pomocą modyfikacji różnicy między pojedynczymi punktami lub grupami punktów.

Odmianą metody Patchwork stosowaną dla obrazów jest metoda BCBS (ang. Blind Consistency-Based Steganography). Algorytm umieszczania tajnej informacji w wybranej linii lub kolumnie obrazu przebiega następująco:

  • Najpierw każdy piksel $i$-tej kolumny jest zastępowany pikselem z kolumny $i − 1$ tego samego wiersza.
  • Następnie dodawany jest $j$-ty bit tajnej wiadomości do najmniej znaczącego bitu $j$-tego punktu kolumny.
  • Potem zachodzi proces rozproszenia informacji za pomocą operacji rozmycia ze skończonym jądrem przekształcenia, czyli macierzą określającą wagi sąsiednich wartości dla wybranego piksela. Na podstawie jądra operacji wyznaczana jest wartość średnia danego punktu.
  • Na końcu $i$-ta kolumna jest usuwana z obrazu i zastępowana losowo wybranymi punktami z sąsiedztwa.

Do odszyfrowania wiadomości wystarczy zmodyfikowany nośnik danych oraz dwa klucze steganograficzne: informacja o położeniu pikseli, w których ukryte są dane oraz jądro przekształcenia rozmywającego.

Metoda procentowa

Kolejną ciekawą metodą jest algorytm dla obrazów czarno-białych. Wcześniej przedstawione metody dla takiego obrazu nie sprawdzą się, ponieważ wprowadzą zbyt duże zniekształcenia. Piksel przyjmuje tylko wartość jednobitową — 0 (czarny) lub 1 (biały). Obraz dzielony jest na prostokątne obszary, których rozmiar jest zależny od klucza steganograficznego. Następnie są szeregowane pseudolosowo. Dla każdego kolejnego obszaru obliczana jest procentowa zawartość czarnych i białych pikseli. Przewaga pikseli w danym kolorze w wydzielonym fragmencie stanowi umówioną wartość binarną. Na przykład przewaga koloru białego może wskazywać na zakodowanie wartości binarnej 1, natomiast większość punktów czarnych będzie interpretowana jako wyznacznik 0.

Do każdego wydzielonego fragmentu dołączana jest binarna wartość z ukrytej wiadomości poprzez zmodyfikowanie liczby pikseli czarnych i białych na granicy obszarów. Jeżeli ukrycie informacji w danym fragmencie nie jest możliwe (na przykład zbyt duża liczba pikseli musiałaby ulec zmianie) fragment jest oznaczany jako nieużywany.

Modyfikacja obrazu poprzez umieszczenie bitu tajnej informacji może wprowadzić zniekształcenia w procentowych wynikach dla poszczególnych obszarów. Maksymalną procentową liczbę punktów, jakie mogą zostać zmienione wyznacza margines bezpieczeństwa oznaczony parametrem $\gamma$. Nadawca w celu dodania wiadomości modyfikuje liczbę pikseli $P$ w kolorze, który ma mieć więcej punktów w danym obszarze, tak by spełniała nierówność: $P<=X\gamma$, gdzie $X$ to całkowita liczba pikseli w danym fragmencie.

Więcej o zastosowaniu metody procentowej >>tutaj<<

Metoda dodawania echa

Efekt echa może być dodany do pliku dźwiękowego jako dodatkowy filtr opóźniający. Z matematycznego punktu widzenia echo jest dyskretną funkcją czasu $f(t)$ sumującą wartości funkcji w czasie $t$ z wartością poprzednią

$f'(t) = f(t) + \alpha f(t-\Delta t)$.

Ludzkie ucho nie jest w stanie wychwycić dołączonego echa sygnału, jeżeli występuje ono nie później niż 2 milisekundy po sygnale oraz jego amplituda nie przekracza połowy amplitudy sygnału oryginalnego.

Sygnał dźwiękowy dzielony jest na fragmenty. Do każdej próbki dodawany jest jeden bit tajnej informacji pod postacią echa o opóźnieniu odpowiadającym wartości, jaka ma zostać ukryta. Wartości kolejnych bitów ukrywanej wiadomości dodawane są więc do kolejnych fragmentów sygnału poprzez wybór odpowiedniego opóźnienia echa. Niewielkie opóźnienie jest niezauważalne dla człowieka. Co więcej, aby uniknąć zakłóceń pomiędzy kolejnymi fragmentami z różnym opóźnieniem, zmiana nie powinna być większa niż 0,05 milisekundy. Zapewni to efekt płynnego przejścia.

Proces wyodrębniania informacji polega na wykryciu odległości pomiędzy sygnałem a echem.

Metoda dołączania echa charakteryzuje się niewielką pojemnością steganograficzną, ale wysoką odpornością na uszkodzenia ukrytej informacji.

Metoda modyfikacji widma i kodowania fazy

Dyskretna transformacja Fouriera DFT (ang. Discrete Fourier Transform) przybliża wartości n próbek sygnału za pomocą złożenia wielu funkcji okresowych sinus i kosinus. Dla sygnału dźwiękowego funkcja dyskretna przekształcenia transformującego przyjmuje jedną zmienną, natomiast dla obrazu jest dwuargumentowa. Wynikiem jest zbiór liczb zespolonych. Na potrzeby przetwarzania obrazu wykorzystuje się zbiór modułów tych liczb w postaci amplitud funkcji sinus i cosinus — jest to tak zwane widmo sygnału. Modyfikacja składników widma może posłużyć ukryciu danych w obrazie bez wprowadzania do niego widocznych zniekształceń. Ze względu na swoje właściwości ta metoda sprawdza się w dodawaniu znaków wodnych. W plikach dźwiękowych, aby nie wprowadzać wyraźnych zakłóceń, należy transformację stosować na pasmach niesłyszalnych lub z zastosowaniem bardzo małej siły zmian. W przypadku plików audio modyfikacja widma amplitudowego skutkuje wprowadzeniem szumu, dlatego bardziej popularna jest technika przesunięcia fazy sygnału. Sygnał dzielony jest na określoną liczbę sekwencji, mieszczącą ukrywaną wiadomość. Dla każdego wyznaczonego fragmentu stosowana jest osobna transformacja DFT, której wynikiem są dwie macierze: amplitud oraz faz. Kodowanie fazy polega na zmianie wartości faz fal tylko pierwszego bloku. W kolejnych odcinkach następuje modyfikacja zachowująca pierwotne różnice między fazami fal poszczególnych fragmentów.

Przekształcenie Fouriera wykonywane jest na blokach (fragmentach) sygnału, co ogranicza pojemność steganograficzną metod bazujących na nim. Zaletą jest natomiast duża trwałość wprowadzonych zmian, a co za tym idzie odporność dołączonych danych na uszkodzenie.


Bibliografia

  1. W. Garbarczuk and P. Kopniak, Steganologia: współczesnie metody ochrony informacji (przegląd). Pomiary, Automatyka, Kontrola: miesięcznik naukowo-techniczny, (03):21–25, March 2005

Steganografia cyfrowa

Dzisiejszy wpis dotyczy najbardziej popularnej i znanej formy steganografii. Steganografia cyfrowa opiera się na ukrywaniu danych w plikach multimedialnych. Zazwyczaj w tym celu stosowany jest najprostrzy rodzaj steganografii, gdzie bezpieczeństwo gwarantuje tajność algorytmu osadzania i wyodrębniania wiadomośći. Każda informacja zapisana cyfrowo może stanowić kontener na inne dane.
Procesowi ukrycia może być poddany nie tylko tekst, ale również inny plik. Stopień użyteczności nośnika bazowego, zależy od jego konstrukcji, a co za tym idzie formatu danych. Najczęściej jako nośnik sekretnych informacji wykorzystywane są pliki w popularnych formatach graficznych i dźwiękowych. Pliki multimedialne pozwalają na ukrycie względnie dużej ilości danych. Co więcej powszechność ich występowania w świecie internetowym ułatwia przekazanie ich obiorcynie wzbudzając przy tym podejrzeń.

Najważniejszym celem stosowania steganografii jest bezpieczeństwo ukrywanej wiadomości. W tym celu nośnik z osadzoną informacją nie powiniem znacząco różnić się od czystego pliku wejściowego. Innymi słowy, postronny obserwator nie powinien zauważyć różnicy, porównując te dwa pliki w sposób sensoryczny — za pomocą swoich zmysłów. Porównanie poprzez analizę statystycznych własności przesyłanych obiektów często umożliwia wykrycie pomiędzy nimi niezgodności. W metodzie bazującej na nieświadomości innych, że cokolwiek ukrywamy, sam cień podejrzenia, że obiekt zawiera ukryty przekaz jest równoznaczny ze zdemaskowaniem. Osobną dziedziną zajmującą się wykrywaniem steganografii jest steganoanaliza.

Steganoanaliza — dziedzina nauki, która bada czy dany obiekt może być nośnikiem ukrytych informacji [1].

Stegoanaliza nie zawsze jest skuteczna. Mogą istnieć takie algorytmy osadzania danych, które bedą na nią odporne. Kwalifikacja pliku jako wolnego od zastosowania steganografii nie potwierdza jednoznacznie, że rzeczywiście tak jest.

Skuteczny system steganograficzny powinien również stwarzać możliwość przekazania odpowienio dużej ilości danych. Nośnik wiadomości powinien być dobrany adekwatnie do jej długości. Bezpieczeństwo przekazu, możliwa potencjalna ilość danych do ukrycia w danym nośniku oraz odporność kontenera na wprowadzone modykacje stanowią główne cechy świadczące o jakości budowy systemu steganograficznego. Dlatego przy omawianiu konkretnych metod lub algorytmów będą podane informacje również o powyższych czynnikach.

Budowa pliku graficznego

Obrazy rastrowe są najpopularniejszym nośnikiem danych w steganografii cyfrowej. Plik graficzny w takiej postaci rozumiany jest jako macierz pikseli o rozmiarze odpowiadającym wymiarom obrazu. Każdemu pikselowi przypisany jest określony kolor, zapisany na określonej liczbie bitów, w zależności od użytego modelu przestrzeni barw.

W przypadku obrazów czarno-białych do określenia koloru wystarczy tylko jeden bit. Zasada w binarnej reprezentacji kolorów jest prosta: im mniejsza wartość, tym ciemniejszy kolor, wobec tego 0 oznacza kolor czarny a 1 biały. Tryb szarości dodatkowo powiązany jest z jasnością pikseli. Reprezentacja koloru piksela na ośmiu bitach pozwoli uzyskać 256 składową skalę szarości. Dla obrazów kolorowych najczęściej stosowany jest model RGB, którego nazwa pochodzi od pierwszysch liter angielskich nazw trzech barw składowych: Red, Green, Blue (czerwony, zielony, niebieski). Do zapisu barwy pojedynczego piksela w tym modelu zawyczaj używana jest przestrzeń 24 bitów, czyli 3 bajtów. Na każdą barwę składową przypada 1 bajt, czyli 8 bitów. Poszczególne bajty przyjmują wartości z zakresu 0-255. W modelu RGB wartość 0 wszystkich składowych daje kolor czarny, natomiast 255 kolor biały.

Jeśli piksel ma kolor biały to wszystkie jego składowe przyjmują wartość $255_{(10)}$, czyli $11111111_{(2)}$. Analogicznie kolor czarny reprezentowany jest jako RGB (0, 0, 0).

RGB (255, 255, 255)
R: 11111111
G: 11111111
B: 11111111

Może się zdarzyć, że obraz będzie reprezentowany przez paletę kolorów 32-bitową. W takim wypadku oprócz trzech składowych barw, występuje jeszcze kanał Alpha, który odpowiada za przezroczystość piksela. Kanał Alpha również przyjmuje wartości z zakresu 0-255. Jeśli stopień widzialności danego piksela wynosi 255 to taki punkt jest niewidoczny. Zmniejszenie tej liczby spowoduje częściowe pojawienie się danego punktu. Model przestrzeni barw z kanałem Alpha nosi nazwę RGBA.

Na sposób przechowywania informacji o pikselach wpływ ma również format danych. Popularne rozszerzenie .jpg odnosi się do obrazów nieindeksowanych, co oznacza, że bezpośrednio w każdym pikselu jest przechowywana informacja o barwach poszczególnych składowych. Format PNG jako następca GIF może opierać się na 24-bitowej głębii kolorów lub tablicy indeksowanej. Grafika indeksowana składa się z dwóch części: tablicy kolorów oraz obrazu, w którym każdy piksel jest indeksem do koloru w tablicy. Taki sposób przechowywania danych o kolorach występuje również w formacie GIF [2].

Budowa pliku audio

Dźwięk jako sygnał cyfrowy to zapis kolejnych wartości amplitudy fali dźwiękowej w poszczególnych odcinkach czasu za pomocą próbek (ang. sample). W zależności od liczby bitów przeznaczonych na zapisanie wartości amplitudy, określana jest rozdzielczość bitowa próbki. Pojedyncza próbka to jeden zapis wartości amplitudy dźwięku w określonym momencie czasu. W czasie przekształcania dźwięku analogowego w cyfrowy określa się częstotliwość próbkowania, czyli liczbę próbek zapisywanych w ciągu jednej sekundy. Im więcej próbek tym lepsza jakość dźwięku.

Standardowy plik audio na płycie CD ma rozdzielczość 44,1 kHz, czyli w ciągu jednej sekundy zapisanych zostało 44100 próbek dźwięku. Typowa rozdzielczość bitowa próbki dźwięku to 16 bitów. Oznacza to, że każda z próbek może przyjmować jedną z $2^{16} = 65536$ wartości. W praktyce do cyfrowego zapisu dźwięku używany jest zakres wartości < −1, 1 >. Na podstawie wartości próbek reprezentujących sygnał audio aproksymowany jest rzeczywisty przebieg sygnału podczas jego odtwarzania. Im więcej próbek tym dokładniejsze odwzorowanie sygnału. Niewielkie błędy w zapisie wartości próbek nie wpływają znacząco na jakość dźwięku, więc można ich użyć do zapisu dodatkowych danych.

Próbka dźwięku

Próbka dźwięku [4].

W steganografii dźwięku należy uważać na zjawisko białego szumu (ang. Additive White Gaussian Noise), które jest łatwo wychwytywane przez ludzki słuch. Biały szum jest zakłóceniem o równomiernym rozłożeniu natężenia składowych dźwięku na każdy herc szerokości pasma, czyli modelowy biały szum posiada płaskie widmo sygnału. Przy takim samym natężeniu dźwięku dla tonów sinusoidalnych i szumu, ludzkie ucho odbiera szum jako głośniejszy. Tym samym zbyt wysoki poziom zaszumienia może prowadzić do wytłumienia niektórych dźwięków w pliku audio. Własność słuchu do ignorowania słabiej słyszalnych sygnałów jest wykorzystywana przy kompresji plików audio do formatu MP3. Sytuacja wygląda analogicznie przy nałożeniu na siebie dźwięków o różnym natężeniu, ale zbliżonych częstotliwościach – wychwycone zostaną tylko głośne dźwięki. Podobnie, gdy cichy dźwięk nieznacznie wyprzedza głośny sygnał lub występuje bezpośrednio po nim. Ciche dźwięki będą zignorowane i pozostaną niesłyszalne dla odbiorcy. Występuje tu tak zwane zjawisko maskowania, które daje doskonałe pole manewru dla technik steganograficznych [3]. Steganografii dźwiękowej najłatwiej poddać pliki WAVE, ponieważ dane nie są skompresowane i łatwo je edytować.


Bibliografia

  1. V. Mosorov, Steganografia cyfrowa. Sztuka ukrywania informacji. Wydawnictwo Uniwersytetu Łódzkiego, 1th edition, 2013
  2. J. Tarasiuk. Formaty plików. http://home.agh.edu.pl/~tarasiuk/dydaktyka/doc/GFK/W/09%20Formaty%20plikow.pdf
  3. N. Cvejic, Algorithms for audio watermarking and steganography.http://jultika.oulu.fi/files/isbn9514273842.pdf, June 2004
  4. G. Kozieł, Możliwości wykorzystania transformaty Fouriera w steganografii dźwięku.PRACE INSTYTUTU ELEKTROTECHNIKI, (zeszyt 247), 2010.

Model kanału podprogowego w problemie więźnia

Poniższy wpis wyjaśnia pojęcie kanału podprogowego, który jest szczególną formą steganografii oraz obrazuje mechanizm wymiany informacji pomiędzy dwiema wtajemniczonymi stronami.

Kanał podprogowy to połączenie pozwalające na nawiązanie dodatkowej, ukrytej komunikacji między nadawcą i autoryzowanym odbiorcą niepozornie wyglądającej wiadomości.

W odróżnieniu od klasycznej steganografii kanały podprogowe nie tylko ukrywają istnienie tajnego przekazu w wiadomości, ale również go szyfrują. Wymiana tajnej korespondencji jest uzależniona od wspólnego klucza deszyfrującego między nadawcą a odbiorcą. Bezpieczeństwo metody jest więc uzależnione od poufności tego klucza, a nie od tajności algorytmu.

Same algorytmy i protokoły kryptograficzne również mogą zawierać kanały podprogowe, zwłaszcza jeśli wykorzystują losowe liczby. Kanały podprogowe stanowią podgrupę kanałów ukrytych [1]. Ukryty kanał umożliwia przesłanie informacji poprzez zastąpienie domyślnej wartości używanej do komunikacji innym parametrem.

Problem steganograficzny, jak i koncepcję kanału podprogowego najlepiej wyjaśnia abstrakcyjny model wymiany informacji pomiędzy dwoma więźniami stworzony przez Gustavusa Simmonsa [2].

Model kanału podprogowego

Wspólnicy Alice i Bob zostali schwytani i osadzeni w więzieniu w osobnych celach. Zamierzają opracować plan ucieczki. Nie mają jednak możliwości bezpośredniego kontaktu, mogą przekazywać sobie wiadomości jedynie przez strażnika – Wendy. Wartownik pozwala na komunikację pod warunkiem, że informacje zawarte w wiadomościach
są dla niego jawne. Strażnik ma możliwość nie tylko czytania korespondencji, ale również fabrykowania listów lub zmiany treści wiadomości przekazanych przez więźniów.
W takich warunkach aresztowani muszą znaleźć sposób na zaplanowanie ucieczki poprzez kanał podprogowy. Ponadto, ponieważ więźniowie przewidują oszustwo przez strażnika, chcą wymieniać tylko takie wiadomości, które będą mogli uwierzytelnić. Uwierzytelnienie zależy od wprowadzenia do wiadomości przez nadawcę nadmiarowej ustalonej wcześniej informacji. Aby zapobiec kopiowaniu tej dodatkowej treści i doklejeniu do sfabrykowanej wiadomości przez przeciwnika, strażnik musi zgodzić się na szyfrowanie wiadomości. W ten sposób wiadomość wraz z informacją uwierzytelniającą będą stanowiły blok tekstu zaszyfrowany jednym lub dwoma kluczami. Kanał uwierzytelnienia odgrywa kluczową rolę dla możliwości tajnej komunikacji, ponieważ będzie w nim stworzony kanał podprogowy. Innymi słowy, więźniowie podważają autentyczność komunikacji w zamian za możliwość przesłania tajnej wiadomości.

Sposób uwierzytelnienia wiadomości

Rozważmy najpierw samo uwierzytelnienie wiadomości bez kanału podprogowego.
Jeśli algorytm szyfrowania jest odpowiednio bezpieczny, to prawdopodobieństwo $P(A)$, że strażnik wybierze odpowiedni szyfr i podszyje się pod nadawcę wiadomości, jest związane z długością informacji uwierzytelniającej. Jeśli tajna informacja zapisana jest na $m$ bitach i $r$ bitów jest przeznaczonych na uwierzytelnienie, wówczas w zaszyfrowanej wiadomości zostaje przekazana łączna liczba bitów $(m + r)$ i $P(A) = 2^{-r}$.

Do szyfrowania wiadomości można użyć kryptografii symetrycznej lub asymetrycznej. W algorytmie symetrycznym do szyfrowania i deszyfrowania wiadomości używany jest ten sam klucz. Natomiast kryptografia asymetryczna (zwana również kryptografią klucza publicznego) wykorzystuje różne klucze, z czego jeden może być udostępniony publicznie bez naruszania bezpieczeństwa przesyłanej informacji. W opisywanym modelu używana jest druga opcja z kluczem publicznym i prywatnym. Wendy musi mieć dostęp do klucza, aby móc odszyfrować wiadomość i sprawdzić jej treść. Jeśli nadawca używa kryptoalgorytmu z jednym kluczem to udostępnia nadzorcy klucz szyfrujący/deszyfrujący po wymianie danych. W takim systemie kryptograficznym strażnik ryzykuje, że komunikacja między więźniami nastąpi przed poznaniem przez niego zawartości. Im dłuższa wiadomość, tym bardziej rośnie ryzyko skomunikowania się więźniów. Jeśli strażnik chciałby uniknąć tego ryzyka i mieć klucz wcześniej, wtedy nadawca wiadomości może zaprotestować, ponieważ pośrednik zyskałby możliwość podrobienia wiadomości.

Do rozwiązania tego problemu bardziej nadaje się kryptosystem z dwoma kluczami, ponieważ strażnik otrzyma klucz deszyfrujący przed każdą wymianą komunikatów, a zatem najpierw będzie mógł sprawdzić treść wiadomości przed przekazaniem jej dalej. Dopóki Wendy nie będzie znała klucza szyfrującego wiadomości Alice i Boba, nie ma możliwości polepszenia swoich szans w zgadywaniu szyfru uwierzytelniającego, a tym samym na oszukanie więźniów.

Wprowadzenie kanału podprogowego

Więźniowie przed aresztowaniem mogli ustalić między sobą, że zrezygnują częściowo z uwierzytelnienia w zamian za możliwość porozumiewania się w tajemnicy. W tym celu $s$ bitów z $r$ bitów informacji uwierzytelniającej, przeznaczają na przesłanie sekretnych informacji. Więźniowie mają teraz $(r – s)$ bity dostępne do uwierzytelnienia. Oznacza to wzrost prawdopodobienstwa, że strażnik jest w stanie oszukać więźniow do $P(A) = 2^{-(r – s)}$.

Rozważmy najkrótszy możliwy blok informacji, składający się z 3 bitów.
$h = m + (r – s)$, 1 bit jest przeznaczony na iadomość i 2 bity na informację uwierzytelniającą, z czego 1 bit został wydzielony na kanał podprogowy.

Sposób kodowania jest związany z wynikiem rzutu monetą. Jeśli w rzucie monetą wypadnie orzeł, to strażnik zgodzi się tylko na przesłanie parzystej wiadomości, gdzie parzystość oznacza parzystą sumę cyfr w binarnej reprezentacji wiadomości. Reszka natomiast symbolizuje wiadomość nieparzystą. Oznacza to, że więźniowie i strażnik godzą się na określoną z góry listę kluczy, przedstawioną w tabeli Tab. 1.

kostka binarna

Rys.1 Zbiór możliwych wiadomości przedstawiony na kostce bitowej w zależności od wyniku rzutu monetą. Tails oznacza zbiór dla reszki, natomiast heads dla orła.

Tab.1 Lista możliwych kluczy dla 1-bitowego kanału i 2-bitowego uwierzytelnienia
Orzeł Reszka
1 000 100
2 000 010
3 000 001
4 000 111
5 011 100
6 011 010
7 011 001
8 011 111
9 101 100
10 101 010
11 101 001
12 101 111
13 110 100
14 110 010
15 110 001
16 110 111

Strażnik nie wie jednak, który z 16 kluczy wybrali Alice i Bob przed zatrzymaniem.

Wendy może oszukać więźniów na dwa sposoby:

  • Przed rzutem monetą, czyli poprzez całkowite sfałszowanie treści wiadomości — wybiera losową wiadomość i podszywa się pod nadawcę. Jeśli wszystkie 16 kluczy są jednakowo prawdopodobne to szanse, na to, że wiadomość, którą wybrał strażnik będzie miała poprawny klucz wynoszą ${{4}\over{16}}={{1}\over{4}}$.
  • Po rzucie monetą — modyfikuje dostarczoną wiadomość, czyli zastępuje treść wiadomości przeciwnymi parzystościami. W takim wypadku jego wiadomość jest zawarta dokładnie w 4 kluczach, więc prawdopodobieństwo powodzenia wynosi również ${{1}\over{4}}$.

wiadomość podprogowa

Tab. 2 Lista możliwych kluczy dla 1-bitowego kanału, 1-bitowego kanału podprogowego i 1-bitowego uwierzytelnienia.
0 1 1 0
1 000 011 111 100
2 000 011 010 001
3 000 110 010 100
4 000 110 111 001
5 101 110 111 100
6 101 110 010 001
7 101 011 010 100
8 101 011 111 001

Rozważmy teraz jednobitowy kanał podprogowy, w którym więźniowie wybierają tajny klucz, nie z listy szesnastu, w którą wartownik wierzy, ale raczej spośród ośmiu kluczy pokazanych w tabeli Tab. 2. Każdy klucz na tej liście zawiera etykiety czterech narożników z listy Tab. 1 i każda wiadomość znajduje się dokładnie w czterech kluczach. Na przykład wiadomość 000 znajduje się w kluczach 1, 2, 3 i 4. Ważną rzeczą, na którą należy zwrócić uwagę na temat wpisów w tabeli Tab. 2, jest to, że środkowy bit w dowolnej kolumnie jest taki sam jak nagłówek podprogowej wiadomości kolumny oraz kolumny z parzystymi i nieparzystymi wiadomościami. Przekazanie podprogowego bitu wymaga od nadawcy wyboru tajnego klucza, który ma pożądany środkowy bit, wskazujący na parzystą lub nieparzystą wiadomość (w zależności od wyniku rzutu monetą).

Biorąc pod uwagę, że Bob zaakceptuje teraz każdą z czterech różnych wiadomości jako prawdziwą, dwie nieparzyste i dwie parzyste, prawdopodobieństwo udanego podszywania się przez strażnika ${{4}\over{8}} = {{1}\over{2}}$. Podobnie, jeśli strażnik czeka na wiadomość wysłaną przez Alice to wtedy prawdopodobieństwo pomyślnego zastąpienia wiadomości o przeciwnej parze w celu błędnego poinformowania Boba o wyniku rzutu monetą będzie również ${{1}\over{2}}$, ponieważ obserwowany komunikat pojawia się w czterech kluczach, z których dwa zawierają każdy z komunikatów o przeciwnej parzystości. Gdyby Wendy po każdej próbie oszustwa dostała informację zwrotną o powodzeniu podstępu, mógłaby zauważyć, że coś się nie zgadza.

W prawdziwym zastosowaniu prawdopodobieństwo sukcesu przy próbie oszustwa podczas uwierzytelnienia jest bardzo małe. Ponadto przedstawiony model nie zapewnia możliwości zmiany klucza przez więźniów w kolejnych komunikatach, aby pozbawić strażnika możliwości użycia wiadomości z poprzedniej wymiany.


Bibliografia

  1. G.J. Simmons, The Subliminal Channel and Digital Signatures. In: Beth T., Cot N., Ingemarsson I. (eds) Advances in Cryptology. Springer, Berlin, Heidelberg, 1985
  2. G.J. Simmons, The Prisoners’ Problem and the Subliminal Channel w Chaum D. (eds) Advances in Cryptology. Springer, Boston, MA, 1th edition, 1984

Rodzaje steganografii

Wybór nośnika ukrytych danych teoretycznie jest nieograniczony. Od prostych metod historycznych opartych na zjawiskach biologiczno-chemicznych przez steganografię językową po pliki cyfrowe i protokoły kryptograficzne. Niezależnie od rodzaju kanału komunikacji i sposobu ukrycia informacji, celem steganografii jest wprowadzenie dodatkowych danych w taki sposób, że informacja podstawowa pozostaje nienaruszona, a ponadto tajne dane mogą, choć nie muszą być zakodowane metodami kryptograficznymi. Wprowadzenie dodatkowego szyfrowania tajnej wiadomości zwiększa poziom jej bezpieczeństwa przy przesyłaniu.

Na system steganograficzny składają się takie elementy jak:

  • kontener, służący za medium do komunikacji;
  • algorytmy osadzania i wyodrębniania sekretnej informacji;
  • informacje konieczne do osadzenia i wyodrębnienia danych, pełniące funkcję klucza steganograficznego.

W pierwszej kolejności nośnik wiadomości, tajna informacja oraz klucz są przyjmowane w algorytmie osadzania jako dane wejściowe. Następnie na ich podstawie generowany jest obiekt z ukrytą treścią. Nowopowstały plik jest przekazywany do adresata ukrytej informacji. Odbiorca podaje otrzymany obiekt oraz znany klucz jako argumenty algorytmu wyodrębnienia. W ten sposób otrzymuje na wyjściu właściwą wiadomość przesłaną przez nadawcę [1].

Ze względu na sposób wprowadzenia steganogramu, czyli ukrytej wiadomości, możemy wyróżnić trzy kategorie metod steganograficznych [2].

  • Czysta steganografia (ang. Pure Steganography) — tajność komunikacji w tej metodzie opiera się na utrzymaniu w tajemnicy samego algorytmu steganograficznego. Sposób ukrywania informacji jest znany tylko nadawcy i odbiorcy wiadomości. Zaletą tego systemu jest fakt, że nie wymaga wcześniejszego ustalenia klucza do odszyfrowania wiadomości. Odbiór danych odbywa się na podstawie samej znajomości algorytmu tworzącego steganogram.
    Jednak stałość sposobu utajniania informacji wpływa niekorzystnie na jej bezpieczeństwo. Odkrycie algorytmu przez osobę niepowołaną kończy się zdemaskowaniem całej sekretnej komunikacji.
  • Steganografia z kluczem prywatnym (ang. Secret Key Steganography) — w tym sposobie występuje nawiązanie do szyfrowania symetrycznego, czyli zarówno do osadzenia, jak i odczytania steganogramu jest potrzebny jeden wspólny klucz. Największym problemem jest fakt, że klucz musi być ustalony wcześniej między komunikującymi się stronami i potrzebny jest bezpieczny sposób, aby go przekazać. Nikt poza nadawcą i odbiorcą wiadomości nie powinien mieć do niego dostępu.
  • Steganografia z kluczem publicznym (ang. Public Key Steganography) — wzorowana jest na kryptografii asymetrycznej, czyli wykorzystującej różne klucze do szyfrowania i deszyfrowania informacji. Jeden z użytych kluczy może być udostępniony publicznie bez naruszenia bezpieczeństwa przesyłanej informacji. Klucz publiczny wykorzystywany jest do wprowadzenia steganagramu, natomiast klucz prywatny służy do jego wyodrębnienia.

Połączenie technik steganograficznych z algorytmami kryptograficznymi może znacząco wpłynąć na poprawę ich bezpieczeństwa. Przed osadzeniem wiadomości w kontenerze danych, informacja może być zaszyfrowana dowolnym algorytmem i dopiero w takiej postaci zostać przesłana do odbiorcy. Techniki wykraczające poza czystą steganografię używają do przekazania wiadomości kanałów podprogowych. Kanały podprogowe zwykle wymagają wspólnego klucza między nadawcą a odbiorcą. Bezpieczeństwo metody zależy natomiast od tajności tego klucza, a nie od tajności algorytmu. Sposób konstruowania kanałów podprogowych może być publikowany bez zmniejszenia skuteczności tej techniki.


Bibliografia

  1. M.R. Ogiela Porównanie wybranych algorytmów steganografii cyfrowej. Pomiary, Automatyka, Kontrola : miesięcznik naukowo-techniczny. 60(12):1189–1195, December 2014
  2. S. Katzenbeisser and F.A.P. Petitcolas Information Hiding Techniques for Steganography and Digital Watermarking. Artech House Print on Demand, 1th edition, December 1999

Krótki zarys metod historycznych

Chociaż samo pojęcie steganografii pojawiło się dopiero w XV wieku, w książce niemieckiego mnicha Johannesa Trithemiusa [1], techniki ukrywania informacji były stosowane już w starożytności. Świadczą o tym zapisy w “Dziejach” Herodota [2], przedstawiające próby bezpiecznego przekazywania informacji na dalsze odległości, aby uniemożliwić przechwycenie wiadomości przez wroga.Jako przykład może służyć drewniana tabliczka z wyciętą wiadomością, którą ukryto pod warstwą wosku. Zewnętrzna warstwa służyła do zamieszczenia mało istotnego zapisu, aby nie wzbudzać podejrzeń. W ten sposób Sparta została ostrzeżona o planowanej perskiej inwazji. Innym przypadkiem opisanym przez Herodota jest tatuowanie ogolonej głowy niewolnika. Po odrośnięciu włosów posłaniec mógł bez problemu przemycić wiadomość.

Trithemius - Steganographia

Trithemius – Steganographia[4]

Kolejną stosowaną praktyką było pisanie listów sokiem z cytryny. Po wyschnięciu tekst był niewidoczny, aby go odczytać należało podgrzać papier.

Popularna była również steganografia językowa – znany jest przykład wiadomości ukrytej jako pierwsze litery poszczególnych wersów trzech sonetów ze zbioru “Amorosa visione” autorstwa Giovanniego Boccaccio.

Krata Cardana

Krata Cardana[5]

Bardziej zaawansowaną wersję językowej steganografii reprezentuje słynna krata Cardana, popularna w XVI wieku. Litery tajnej wiadomości zamiast regularnej struktury tworzyły losowy wzór. Odczytanie przekazu było możliwe poprzez umieszczenie nad tekstem specjalnej maski, tak zwanej kraty, która wskazywała poszczególne litery. Maska to wczesny przykład tajnego steganoklucza, który musiał być dzielony między komunikujące się strony. Prekursorem nowoczesnych metod steganograficznych był François Bacon. Bacon używał kursywy lub zwykłej czcionki do kodowania reprezentacji binarnych liter w swoich pracach.

Współcześniejszą i trudniejszą do wykrycia metodą były mikrokropki stosowane przez niemiecki wywiad podczas drugiej wojny światowej. Mikrokropka była punktem przypominającym zwykłą kropkę w druku, która zawierała zminiaturyzowany tekst lub obraz utworzony za pomocą aparatu fotograficznego i mikroskopu. Dzięki pomniejszeniu w skali 1:300 umożliwiała przesyłanie obrazów o wysokiej rozdzielczości, między innymi map wielkości kartki A4 w postaci zwykłej kropki w tekście. Udoskonalona technika laserowych mikrokropek jest stosowana do dziś przy znakowaniu żetonów w kasynach, aby trudniej było je podrobić [3].


Bibliografia

  1. J. Trithemius, Steganographia 1499, opubl. Frankfurt 1606
  2. Herodot, Dzieje (ks. VI: Erato)
  3. I. Cox, M. Miller J. Bloom, J. Fridrich, T. Kalker, Digital Watermarking and Steganography Morgan Kaufmann Publishers Inc. San Francisco, CA, USA 2008

Źródła grafik:

  1. https://en.wikipedia.org/wiki/Steganographia
  2. https://en.wikipedia.org/wiki/Cardan_grille