Bezpieczeństwo

Jak ukryć tajny tekst w obrazach (steganografia)

6 min czytania

Steganografia to ukrywanie samego faktu, że wiadomość istnieje: tekst chowa się wewnątrz zwykłego obrazu, który dla oka wygląda identycznie jak przed zmianą. Ten przewodnik pokazuje, jak ukryć i jak odczytać tajny tekst w pliku PNG, za darmo i w całości w przeglądarce, bez wysyłania czegokolwiek na serwer. Na końcu robisz to sam, wpisując wiadomość i pobierając gotowy obraz.

Jak to działa

Obraz to siatka pikseli, a każdy piksel ma trzy wartości koloru: czerwień, zieleń i błękit, każda w zakresie od 0 do 255. Taka liczba zapisana binarnie ma 8 bitów, na przykład czerwień o wartości 200 to 11001000. Ostatni bit z prawej strony to najmniej znaczący bit (LSB, ang. least significant bit). Jeśli zmienisz tylko jego, wartość przesunie się co najwyżej o jeden: 200 (11001000) stanie się 201 (11001001). Różnica jednego poziomu jasności na 256 jest dla ludzkiego oka całkowicie niewidoczna.

I właśnie na tym polega cała sztuczka. Wiadomość zamieniamy na bajty, każdy bajt na 8 bitów, a te bity zapisujemy kolejno w najmniej znaczących bitach pikseli. Weźmy literę “H”. W kodowaniu jej wartość to 72, czyli binarnie 01001000. Tych osiem bitów trafia do najmniej znaczących bitów ośmiu kolejnych pikseli (po jednym bicie na kanał na piksel). Piksele lekko zmieniają odcień, ale obraz wygląda tak samo, a wiadomość jest już w środku. Odczyt to ta sama operacja odwrócona: zbieramy najmniej znaczące bity z tych samych pikseli, składamy je z powrotem w bajty i odzyskujemy tekst.

Ile można ukryć

Pojemność zależy od dwóch rzeczy: liczby pikseli i liczby kanałów, których używasz. Przy jednym bicie na kanał na piksel każdy kanał daje 1 bit, a 8 bitów tworzy jeden bajt. Poniżej realne wartości przybliżone:

Rozmiar obrazuTylko czerwieńRGB (3 kanały)
100 x 100 pxok. 1,2 KBok. 3,6 KB
1280 x 720 pxok. 115 KBok. 345 KB
1920 x 1080 pxok. 259 KBok. 778 KB

Widać wzór: użycie czerwieni, zieleni i błękitu naraz potraja pojemność względem samego kanału czerwonego. W naszym enkoderze wybierasz to jednym kliknięciem: Czerwony (domyślny, najbardziej dyskretny, bo zmienia tylko jeden kanał), RGB (około trzykrotność pojemności) albo RGBA (około czterokrotność, jeśli obraz ma kanał przezroczystości). Do kilku zdań w zupełności wystarczy nawet mała miniatura na czerwonym kanale.

Ukryj wiadomość

Wczytaj obraz, wpisz tekst i pobierz gotowy plik. Zrób to od razu poniżej:

Enkoder Steganografii
Za darmo, bez rejestracji, na każdym urządzeniu.
Otwórz pełne narzędzie

Kroki po kolei:

  1. Wczytaj obraz (najlepiej PNG lub dowolny obraz, który zapiszesz jako PNG).
  2. Wpisz wiadomość, którą chcesz ukryć.
  3. Opcjonalnie wybierz RGB zamiast samej czerwieni, jeśli tekst jest długi i potrzebujesz więcej miejsca.
  4. Opcjonalnie ustaw hasło, żeby dodatkowo zaszyfrować treść.
  5. Kliknij Zakoduj i pobierz wynik.

Wynik zawsze zapisuje się jako PNG i to nie jest przypadek. PNG jest bezstratny, czyli piksele po zapisie są dokładnie takie, jak je ustawiliśmy. JPEG jest stratny: przy zapisie zaokrągla i uśrednia wartości pikseli, żeby zmniejszyć plik, a to niszczy właśnie te najmniej znaczące bity, w których siedzi wiadomość. Zapis do JPEG skasowałby ukryty tekst, dlatego enkoder go nie oferuje.

Odczytaj wiadomość

Żeby odzyskać ukryty tekst, wystarczy sam obraz. Upuść tu swój PNG:

Kroki:

  1. Upuść lub wczytaj plik PNG z ukrytą wiadomością.
  2. Odczytaj wydobyty tekst.
  3. Jeśli wiadomość była chroniona hasłem, wpisz hasło, żeby ją odszyfrować.

Dekoder nie zakłada z góry, że plik powstał w naszym enkoderze. Automatycznie sprawdza wiele wariantów zapisu LSB: różne układy kanałów (R, RGB, RGBA, a także sam zielony lub sam błękitny), oba sposoby oznaczania końca danych (prefiks z długością albo terminator zerowy) oraz obie kolejności bitów (MSB i LSB). Robi to ze ścisłą walidacją, dzięki czemu zwykłe zdjęcie bez ukrytej treści zwraca pusty wynik, a nie przypadkowe śmieci.

Dodaj hasło (szyfrowanie)

Hasło robi różnicę między “ukryte” a “nieczytelne”. Gdy je ustawisz, wiadomość jest szyfrowana algorytmem AES-256-GCM, a klucz powstaje z twojego hasła przez PBKDF2 (funkcję, która celowo spowalnia próby zgadywania). Skutek jest taki, że w najmniej znaczących bitach pikseli ląduje ciąg wyglądający jak losowy szum. Bez hasła nie ujawnia niczego, a błędne hasło też niczego nie ujawnia, bo tag uwierzytelniający GCM nie pasuje i odszyfrowanie się nie udaje.

Warto rozróżnić dwie rzeczy. Steganografia ukrywa, że wiadomość w ogóle istnieje. Szyfrowanie sprawia, że nawet po znalezieniu wiadomość pozostaje nieczytelna. Osobno każde z nich ma swoją słabość, ale razem działają silniej: ktoś musiałby najpierw domyślić się, że w obrazie coś jest, a potem jeszcze złamać AES-256.

Ograniczenia i częste błędy

Bądźmy szczerzy co do granic tej metody.

  • Działa tylko na bezstratnym PNG. Ponowny zapis obrazu jako JPEG albo zrobienie zrzutu ekranu zamiast wysłania oryginalnego pliku niszczy najmniej znaczące bity i kasuje wiadomość.
  • Wiele komunikatorów i sieci społecznościowych automatycznie rekompresuje wysyłane obrazy. Taki serwis “poprawia” plik i przy okazji usuwa ukryte dane. Jeśli chcesz, żeby wiadomość dotarła, udostępniaj PNG jako plik (na przykład jako załącznik), a nie przez kanał, który rekompresuje obrazy.
  • To steganografia LSB, nie uniwersalny detektor każdej możliwej metody ukrywania. Nasz dekoder nie wykryje na przykład wiadomości schowanej w domenie DCT formatu JPEG ani innych technik spoza LSB.
  • Pilnuj pojemności. Jeśli tekst jest dłuższy niż to, co obraz może pomieścić na wybranych kanałach, zwiększ rozmiar obrazu albo przełącz się z samej czerwieni na RGB.

Najczęstsze pytania

Czy to jest prywatne? Tak. Cały proces, kodowanie, dekodowanie i szyfrowanie hasłem, dzieje się lokalnie w twojej przeglądarce przy pomocy Canvas API. Obraz ani wiadomość nie są nigdzie wysyłane, więc nawet my ich nie widzimy.

Czy mogę użyć dowolnego obrazu? Praktycznie tak, ale liczy się format wynikowy. Możesz wczytać różne obrazy, jednak pobierany plik jest zawsze PNG, bo tylko format bezstratny zachowa ukryte bity. Większy obraz mieści więcej tekstu, a przełączenie na RGB lub RGBA dodatkowo zwiększa pojemność.

Czy zakodowany obraz będzie wyglądał inaczej? Dla oka nie. Zmieniamy tylko najmniej znaczący bit wybranych kanałów, więc każdy piksel przesuwa się co najwyżej o jeden poziom na 256. Ta różnica jest niezauważalna, a obraz wygląda tak samo jak oryginał.

Czy ktoś odczyta to bez hasła? Jeśli nie ustawisz hasła, sam tekst jest tylko ukryty, więc ktoś, kto zna metodę LSB i domyśli się, że w obrazie coś jest, może go wydobyć. Jeśli ustawisz hasło, treść jest zaszyfrowana algorytmem AES-256-GCM i bez prawidłowego hasła pozostaje nieczytelna. Błędne hasło nie ujawnia niczego.

Gotowy, żeby spróbować? Ukryj swoją wiadomość w Enkoderze Steganografii, a potem sprawdź ją w Dekoderze Steganografii, oba działają za darmo i w całości w twojej przeglądarce.

SteganografiaPrywatnośćObrazySzyfrowanie
Enkoder Steganografii
Teraz wypróbuj samodzielnie w pełnym narzędziu.
Wypróbuj teraz
Powiązane narzędzia