Powrót do Kryptografia

Concealogram

Concelogram: obraz w obrazie z wykorzystaniem LSB
Jest to rodzaj steganografii, polegająca na ukryciu obrazu, zdjęcia, grafiki. Metoda ta była szeroko wykorzystywana w historii przez szpiegów, którzy ukrywali zdjęcia i mikro filmy w przeróżnych miejscach. Najbardziej znaną metodą jest metoda mikrokropek, polega na ukrycie zminiaturyzowanych danych takich jak tekst, fotografie lub rysunki techniczne w punkcie o średnicy 1 mm. Skala miniaturyzacji wynosiła 1:300. Mikrokropkę wykonuje się przy użyciu urządzenia będącym połączeniem aparatu fotograficznego i mikroskopu. Co ciekawe mikrokropek nadal używa się do zabezpieczenia i znakowania cennych przedmiotów, żetonów, a nawet samochodów. Tak jak mikrokropka concelogram powoduje, że obraz oglądany nieuzbrojonym okiem, nie budzi żadnych podejrzeń. Najłatwiejszą metodą ukrycia obrazu wewnątrz innego obrazu jest wykorzystanie LSB(czym jest LSB, dowiecie się z tego artykułu). Jeśli wiesz już, czym jest LSB, to możemy zaczynać. Jak już zapewne wiesz, piksel przyjmuje trzy wartości, każdą od 0 do 255 co w reprezentacji binarnej reprezentuje 0-11111111. (Można użyć czwartej wartości, którą jest kanał Alfa) W naszym ćwiczeniu użyjemy 4-3 LSB. Każde wykorzystanie LSB na użytek ukrytego obrazka będzie pogarszać jego jakość. Wygląda to następująco:

Jeśli chcecie przeanalizować sobie obrazki zachęcam do ich pobrania: zerowany kotek

Wykorzystamy sobie cztery ostatnie bity do ukrycia naszego obrazka. Oczywiście nie będzie to takie proste, musimy zachować pewne zasady. Ważną decyzją będzie czy nasz plik graficzny będzie miał obniżoną jakość, czy nie. Jeśli obniżymy mu jakość, będziemy mogli zapisać piksel w pikselu, jeśli postanowimy zachować jakość, ukrytego obrazka wtedy będziemy musieli zapisać jeden piksel ukrytego obrazka w dwóch pikselach obrazka kontenera. Zaczniemy od pierwszego przykładu, zapiszemy obrazek w obrazku, z tym że obrazek ukryty będzie miał obniżoną jakość. Oczywiste będzie, że obrazek ukrywający musi być większej lub równej wielkości niż obrazek ukrywany:

Do pobrania: kotek, lisek

Należy teraz wykorzystać kod powyżej i wpleść algorytm dodania obrazka po zerowaniu bitów. Wyzwaniem zostaje dodanie końca wiersza pikseli. Najprościej będzie wypełnić puste pola zerami, po wydobyciu obrazka ze źródła, będzie on miał taką samą wielkość jak obrazek bazowy. Jak będzie wyglądał taki algorytm:

Jeśli czytaliście poprzednie artykuły, stworzenie takiego algorytmu, nie powinno przysporzyć wam problemów:

Efekt działania algorytmu można podziwiać poniżej:

Na pierwszy rzut oka obrazek wygląda jak słabej jakości zdjęcie :P, ale niech to was nie zwiedzie. Po użyciu kodu cofającego nasze zmiany ukaże się nam obrazek ukryty wewnątrz kotka:

Efekt działania algorytmu:

Jeśli zamiast 15 pozostawilibyśmy wyzerowane bity, wtedy przestrzeń większa niż szerokość i wysokość obrazka ukrytego byłaby czarna. Jak działa algorytm:

Oczywiście dużo lepsze efekty otrzymamy po wykorzystaniu tylko dwóch ostatnich bitów. Również natrafimy na ograniczenia, najważniejsze pytanie, jakie musimy sobie zadać to takie czy chcemy obniżać jakość naszego obrazka ukrywanego, sami widzicie, że użycie tylko czterech pierwszych bitów do utworzenia obrazka nie obniża aż tak znacząco jego jakości. Drugim ograniczeniem jest wielkość naszego obrazka, jeśli użyjemy dwóch ostatnich bitów kontenera, wtedy nasz obrazek będzie musiał być co najmniej czterokrotnie większy od obrazka ukrywanego (bez straty jakości). Mamy dwa sposoby, aby ukryć taki piksel. Możemy ukrywać wartości piksela ciągiem, tak jak to miało miejsce w przypadku ukrywaniu tekstu lub ukrywać kolor w kolorze (zielone tylko w zielonych, czerwone w czerwonych itd.)

  1. Ukrywanie koloru w kolorze:

Odzyskanie takich bitów nie stanowi problemu:

Efekty ukrycia kotka w tapecie znalezionej na dysku:

Tapeta + Kotek  =  Tapeta-ukryty

Po odzyskaniu bitów z tapeta- ukryty otrzymamy obrazek:

 

2. Drugim sposobem ukrycia naszego piksela jest ukrycie go ciągiem, bardzo dobrze prezentuje to obrazek poniżej:

Algorytm odzyskujący bity z ukrytego obrazka zapisanego bez strat w dwóch ostatnich bitach 

Jeśli chcecie sprawdzić działanie algorytmu, możecie odzyskać sobie kotka z pliku: tapeta-z-ukrytym-kotkiem-piksele-ukryte-ciagiem.bmp

Można oczywiście zapisać tylko cztery bity obrazka ukrywanego, spowoduje to zmniejszenie jakości obrazka, ale wykorzystamy tylko 2 piksele kontenera do zapisu jednego piksela obrazka ukrywanego. Łącząc metodę z początku artykułu i metodę zapisu pikseli (kolor w kolor lub ciągiem) można stworzyć algorytm ukrywający obrazek ze stratą ostatnich czterech bitów obrazka ukrywanego. Należy po usunięciu ostatnich czterech bitów koloru ukrywanego po prostu je odwrócić:

Przykład programu do ukrywania obrazka ze stratą czterech ostatnich bitów z wykorzystaniem LSB2 

Przykład kodu odzyskującego bity ze stratą:

Kotek ukryty tą metodą do pobrania i sprawdzenia: Matrix ukryty

 

 

Permalink do tego artykułu: https://visualmonsters.cba.pl/kryptografia/concealogram/