Blog posts

StegoCore – algorytm ukrywania danychs LSB

StegoCore – algorytm ukrywania danychs LSB

Daj Się Poznać 2017, security, steganography

Czas na implementację pierwszego algorytmu steganograficznego. Zgodnie z zapowiedzią będzie nim algorytm LSB. Na początku kilka teoretycznych informacji na jego temat.

Algorytm LSB (pol. najmniej znaczący bit) jest jednym z najstarszych algorytmów wstawiania znaków wodnych. Polega na umieszczaniu kolejnych bitów wiadomości, w miejsce najmniej znaczących bitów nośnika. Ze względu na swoją prostotę, łatwo go zastosować w podpisywaniu obrazów i utworów audiowizualnych. Dla obrazów kolorowych, wiadomość można umieścić w najmniej znaczących bitach składowych RGB.

Metoda pozwala na umieszczenie dużej ilości informacji w obrazie, jednak jest bardzo mało odporna na operacje np. kompresję JPEG, przycinanie obrazu. Z jednej strony jest to wadą, ponieważ w wielu przypadkach można stracić zapisaną wiadomość. Jednak z drugiej strony, gdy zależy nam na tajnej komunikacji jest to zaletą. Prawie każda modyfikacja obrazu powoduje usunięcie sekretu.

Pseudokod algorytmu

Proces umieszczania wiadomości składa się z wybrania zbioru elementów, na których zostanie przeprowadzona operacja. Algorytm wstawiania i odczytywania wiadomości wygląda następująco:

Algorytm LSB – wstawianie znaku

For i = 1,…,l(m) do

lsb(ci) = mi

end for

Algorytm LSB – odczytywanie znaku

For i=1,..,l(m) do

mi= lsb(ci)

end for

gdzie:
lsb(c) = najmniej znaczący bit elementu c

Głównym problemem, jest wybór elementów z obrazu, które zostaną poddane zamianie. W najprostszym rozwiązaniu mogą to być kolejne składowe RGB każdego piksela w obrazie rozpoczynając od pierwszego. Zazwyczaj będzie tak, że proces wstawiania wiadomości zakończy się dużo wcześniej, nie wykorzystując wszystkich dostępnych elementów. Może to spowodować wiele problemów związanych z bezpieczeństwem. Część obrazu z zakodowaną wiadomością, będzie posiadała inne właściwości statystyczne, w porównaniu z częścią, która nie uległa zmianie.

Aby temu zapobiec należy wybrać inny sposób wybierania elementów do zakodowania. Dobrym podejściem, jest użycie generatora pseudolosowego. Jeśli dwie osoby współdzielą klucz, mogą go użyć jako ziarno do generatora. W wyniku jego działania otrzymają sekwencję liczb , którą można użyć do wyboru elementów. Wtedy odległość pomiędzy dwoma zakodowanymi bitami będzie pseudolosowa. Odbiorca znając ziarno generatora może odtworzyć sekwencję oraz kolejne współrzędne określające wybór elementów z obrazu.

Co udało się zaimplementować?

Na tę chwilę w StegoCore zaimplementowałem algorytm bez zastosowania generatora pseudolosowego. Myślę, że w przeciągu tygodnia dodam również jego obsługę.

Zdecydowałem się również na umieszczenie bitów danych w dwóch (R i B) z trzech składowych piksela. Dzięki temu nie muszę się martwić o dopełnianie bitami gdyby długość sekretu była niepodzielna przez 3.

W edytowanym obrazie na samym początku będę umieszczał także długość ukrywanych danych. Jest to potrzebne podczas dekodowania, aby wiedzieć ile bitów odczytać. Czyli ostatecznie ukrywane dane (m) będą miały postać:

m = len(m),m

W związku z tym algorytm dekodowania zostanie lekko zmodyfikowany. Na początku odczytane zostaną 4 bajty, czyli 32 bity (długość danych zapisana jest w int32, który zajmuje właśnie 4 bajty). A następnie odczytane zostaną kolejne n bitów.

Zaimplementowany algorytm dostępny jest na github.

Co dalej?

Do realizacji pozostało kilka rzeczy, które przydadzą się również podczas implementacji innych algorytmów.

  • Sprawdzanie możliwości umieszczenia danych w obrazie – dane mogą być za duże
  • Generator pseudolosowy do wyznaczania miejsc osadzenia danych w pliku graficznym
  • Dodanie obsługi algorytmu w aplikacji webowej

About the author

Senior specialist, developer. Pasjonat programowania rozwijający się przy projektach komercyjnych oraz jako kontrybutor open source. W wolnym czasie lubi pobiegać za piłką, a także obejrzeć dobry film lub serial.

Leave a Comment

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *