Steganografia
-
- Marcin Kosedowski,
- 28.01.2009
Jeśli chcesz zabezpieczyć dane przed dostępem niepowołanych osób, możesz je zaszyfrować, albo ukryć. To drugie rozwiązanie ma niezaprzeczalną zaletę: nikt nie będzie się dobierał do danych, których istnienia nawet nie podejrzewa. Zobacz co możesz osiągnąć dzięki steganografii.
Stare powiedzenie "nie ma twierdzy nie do zdobycia" jest wciąż aktualne. Mimo że nowoczesne szyfry wydają się dziś bezpieczne, ich złamanie jest w rzeczywistości kwestią czasu i odpowiedniej mocy obliczeniowej. Wszyscy pamiętamy, jak zaledwie kilka lat temu stosowano 64-bitowe klucze szyfrujące, które wówczas uznawano za bezpieczne. Dziś pierwszy lepszy haker jest w stanie je złamać bez większej fatygi. Jednak nie warto się tym przejmować, istnieje bowiem alternatywa.
Tajne informacje wcale nie muszą być szyfrowane, aby pozostały nieodczytane - wystarczy zapisać je w miejscu, w którym nikt nie zwróci na nie uwagi. Brak widocznego celu oznacza brak ataku - na tej prostej zasadzie opiera się filozofia i zarazem skuteczność steganografii. Ukrywanie tekstu w innym tekście, obrazie, muzyce czy wręcz w pakietach protokołu TCP/IP nie jest trudne, jeśli do dyspozycji mamy komputery i odpowiednie oprogramowanie.
Kontenery nie tylko na śmieci

Wystarczy 5 kroków, aby twoje dane były bezpieczne.
Liczni wówczas szpiedzy poszukiwali nowych metod tajnej komunikacji, najlepiej takich, które nie wzbudzałyby niczyich podejrzeń. Idealne okazały się zwykłe listy, pisane na maszynie, rozsyłane codziennie w wielkich ilościach po całym świecie. W jaki sposób mogły one stanowić bezpieczny nośnik ściśle tajnych informacji, w dodatku niezaszyfrowanych?
Praktycznie wszystkie dane, które chcemy ukryć mogą być wyrażone w postaci cyfrowej. Oznacza to, że można je zapisać za pomocą spróbkowanego sygnału o dwóch stanach reprezentowanych przez 0 i 1. W nowoczesnym sprzęcie elektronicznym stanom tym odpowiadają np. różne ładunki nośnika magnetycznego, różne długości rowków na płycie CD itd. Ale równie dobrze mogą to być odstępy między wierszami tekstu - np. duża przerwa oznaczałaby jedynkę, a mała zero. W ten sposób, posiadając odpowiednio długi tekst, moglibyśmy w nim ukryć tajny przekaz. I tak doszliśmy do naszych szpiegów. Ta prosta metoda była przez nich często wykorzystywana ze względu na jej dwie zalety: różnice w odstępach mogły być naprawdę małe (rzędu 0,1 mm, a więc niedostrzegalne gołym okiem), a dokumenty wielokrotnie kopiowane bez utraty tajnej informacji. Natomiast główną wadą była oczywiście niewielka pojemność kontenera - 1 bit na 2 wiersze tekstu (ok. 0,15 procent - patrz ramka "Jak obliczyć pojemność kontenera?") - potrzeba było wielu stron, żeby przemycić jakąś dłuższą informację.
W steganografii pojemność kontenera wyraża się stosunkiem liczby bitów przekazu tajnego do koniecznych do ich ukrycia bitów przekazu jawnego. Przykładowo, jeśli w 10 bitach danych możemy ukryć jeden, pojemność wyniesie 0,1 (10%).
We wspomnianej w tekście metodzie wykorzystującej różnej wielkości odstępy między wierszami tekstu konieczna jest w przybliżeniu cała linijka tekstu (ok. 80 znaków, każdy zapisywany zwykle na 8 bitach), aby ukryć 1 bit tajnej informacji. Pojemność takiego kontenera wynosi zaledwie 1 / (8*80) = 0,0015 (0,15%). Dla porównania, pojemność najwydajniejszych kontenerów stosowanych obecnie, czyli plików graficznych, wynosi ponad 30%.
Jak wycisnąć większą pojemność

W dużym powiększeniu kolory sąsiednich pikseli mają zupełnie różne kolory, ale oko nie potrafi tego rozróżnić. To zjawisko jest wykorzystywane w steganografii.
Sposób ten da się łatwo przystosować do dzisiejszych realiów. W dokumentach elektronicznych (pliki Worda, HTML itp.) powszechnie stosuje się kodowanie Unicode. Każdy krój czcionki jest reprezentowany jako zestaw znaków nie tylko alfabetu łacińskiego, ale również znaków narodowych, takich jak ą, д, ừ czy liter alfabetu arabskiego. Łącznie daje to ponad 65 tys. znaków na jeden zestaw (jedną czcionkę). Z punktu widzenia steganografii ciekawą właściwością Unicode'u jest to, że znaki w zestawach powtarzają się. Przykładowo, znak o numerze 65345 wygląda identycznie jak litera "a" (chociaż przy wymyślnych, dekoracyjnych czcionkach różnica może być widoczna). Wystarczy napisać program, który analizuje tekst z kontenera znak po znaku. Jeśli trafi na literę "a" (kod 97), uzna go za 0, a jeśli napotka znak o kodzie 65345, uzna go za jedynkę. Człowiek nie zauważy żadnej różnicy. W ten sposób, znajdując odpowiedniki całego alfabetu możemy uzyskać pojemność kontenera wynoszącą ok. 6 procent.
Najwięcej schowasz w obrazkach

Darmowy program S-Tools pozwala na ukrywanie informacji w polikach dźwiękowych i graficznych, zabezpieczając je dodatkowo jednym z 4 popularnych algorytmów szyfrujących.
Każdy użytkownik komputera mniej więcej orientuje się w strukturze plików graficznych. Są to zwykle bardzo długie ciągi danych, które zawierają dokładne informacje o każdym pikselu (punkcie) obrazu. W najczęściej wykorzystywanym modelu barwnym RGB dowolny kolor uzyskuje się poprzez mieszanie w odpowiednich proporcjach barw podstawowych, tj. czerwonego (Red), zielonego (Green) i niebieskiego (Blue). Każdy piksel musi być zatem opisany trzema wartościami, które określają nasycenie poszczególnych składowych barwnych. W kolorowych obrazkach, których pełno w Internecie, do zapisania każdej z tych wartości potrzeba 8 bitów, czyli jednego bajta. Jednemu pikselowi odpowiadają więc 24 bity - 3 bajty. Stąd już łatwo obliczyć, że typowe, nieskompresowane zdjęcie z taniego cyfrowego kompaktu o rozdzielczości 5 megapikseli stanowi kontener liczący sobie (w zaokrągleniu) 15 MB, czyli 120 milionów bitów.
W jaki sposób dane są ukrywane? Wykorzystywana jest ułomność ludzkiego wzroku - na 24 bitach możemy opisać aż 16 milionów kolorów, podczas gdy odróżniamy ich jedynie kilkadziesiąt tysięcy. Na przykład, jeden z odcieni niebieskiego opisany jest zestawem liczb 78, 131, 244 (binarnie: 01001110 10000011 11110100). Zmieniając pierwszą składową z 78 (01001110) na 79 (01001111) możemy ukryć jeden bit informacji bez widocznej zmiany na zdjęciu - dużo większe szumy niż jeden bit powodują przypadkowe błędy powstałe w trakcie wykonywania zdjęcia. Aby się o tym przekonać, wystarczy zrobić zbliżenie zdjęcia jednolitej powierzchni, np. czystego nieba i pobrać wartości dwóch sąsiednich pikseli - różnica będzie na co najmniej kilku bitach, a i tak jest dla nas niezauważalna.
I tak tego nie widać...

Program o prostej nazwie Steganography ma tę samą funkcjonalność co S-Tools, ale ładniej wygląda i jest wygodniejszy w użyciu. Koszt: 20 euro.
Skoro w każdej trójce bajtów można zmienić 8 bitów, to maksymalna pojemność kontenera wynosi 33%, czyli ok. 10 razy więcej niż najlepsze metody operujące na tekście. Przykładowe zdjęcie o wielkości 15 MB pozwoli zatem na ukrycie prawie 5 MB tajnych informacji, co odpowiada powieści liczącej sobie ok. 1600 stron. Jest to imponująca pojemność, zwykle jednak wykorzystuje się co sety lub nawet co tysięczny piksel, co jeszcze bardziej utrudnia wykrycie różnic, ale też ogranicza długość tajnego przekazu - do kilku stron w jednym zdjęciu.