Lekce 7 - Krátké pojednání o digitální steganografii
V minulé lekci, Transformace souřadnic v rovině pomocí transformačních matic, jsme si ukázali algoritmus pro transformaci souřadnic v rovině.
Na úvod si odcitujme pojem Steganografie z Wikipedie:
„Steganografie (řečtina. steganós-schovaný, gráphein-psát) je vědní disciplína (podobor kryptografie) zabývající se utajením komunikace prostřednictvím ukrytí zprávy. Zpráva je ukryta tak, aby si pozorovatel neuvědomil, že komunikace vůbec probíhá. Síla této komunikace stojí a padá na jejím utajení (jedná se o takzvanou bezpečnost skrze utajení – security through obscurity), a proto zachycení skryté zprávy tak prakticky znamená její prolomení. Aby ani v tom případě nedošlo k prozrazení obsahu zprávy, zpravidla se kombinuje s dalšími metodami šifrování.“
Z historického hlediska lze konstatovat, že principy steganografie se objevují v zabezpečené komunikaci již od starověku. Již v antickém Řecku se používaly k přenosu skrytých zpráv nejrůznější principy. Kuriózním příkladem může být zpráva napsaná na holou lebku posla, která byla následně ukryta porostem vlasů.
My se však budeme bavit o současné digitální steganografii. Tajná zpráva může být zakódována na místo nepodstatného šumu v souborech se zvuky, obrázky, videem a podobně. V tomto pojednání se zaměřím jen na ukrývání textu do obrázku. Ze známých principů jsem zvolil princip ukládání textu do obrázku s využitím nejméně významného bitu LSB (Least Sgnificant Bit) v pixelu obrázku. Do každého pixelu obrázku mohu do složek R G B uložit 3 bity. Pro pokrytí české znakové sady potřebuji 10 bitů na jeden znak textu. Jeden znak tak uložím do 4 pixelů. Z toho lze vyvodit potřebnou velikost bitové mapy obrázku pro uložení daného textu.
Na příklad do obrázku 800 * 600 pixelů mohu uložit text o velikosti 120 000 znaků. Pro ověření principu jsem vytvořil program SteganoLSB v C# .NET.
Algoritmus
Nyní se pokusím komentovat algoritmus programu v části ukládání textu do obrázku a výběru textu z obrázku.
Proměnné a konstanty:
private double xRed; // redukovaná šířka obrázku private double yRed; // redukovaná výška obrázku private int[] maska = new int[] { 512,256,128, 64, 32, 16, 8, 4, 2, 1 }; private int pZapisTxtX = 0; // pozice x počátku zápisu textu private int pZapisTxtY = 0; // pozice y počátku zápisu textu private string kod = "0000"; private const int posunX = 10; // prostor pro zápis délky textu private bool nápověda = true;
Pole maska umožňuje výběr bitů znaku, proměnné pZapisTxtX a pZapisTxtY určují pozici x a y v bitové mapě obrázku (jsou nastaveny bezpečnostním kódem). Zápis textu do obrázku začíná z této pozice. Informace o délce textu je uložena před tuto pozici na ose x s distanci posunX.
Ukládání bitů znaku do pixelu:
for (int x = sPosX; x < MyImage.Width; x++) { for (int y = sPosY; y < MyImage.Height; y++) { if (pos > delka - 1) break; chardec = Convert.ToInt16(FullText[pos]); if (id == 1) { SD.Color pixel = MyImage.GetPixel(x, y); pxr = Convert.ToByte(pixel.R) & maska[9]; pxg = Convert.ToByte(pixel.G) & maska[9]; pxb = Convert.ToByte(pixel.B) & maska[9]; pr = chardec & maska[0]; if (pr == 512) pr = 1; else pr = 0; pg = chardec & maska[1]; if (pg == 256) pg = 1; else pg = 0; pb = chardec & maska[2]; if (pb == 128) pb = 1; else pb = 0; if (pr != pxr) { R = Math.Abs(pixel.R - 1); } else R = pixel.R;
Protože se jedná o část metody, které jsou pozice x, y a délka textu předány voláním metody, text je ukládán do obrázku dle lokálních proměnných z pozice PosX a PosY. Text je převeden do pole znaků a dekadická prezentace znaku spolu s maskou vytvoří bitovou prezentaci. Jednotlivé bity jsou potom porovnány s nejnižším bitem bytu R G B pixelu a ten je posléze modifikován. Pro jeden znak se tato činnost opakuje následně ve 4 pixelech (v posledním je využit jen byte R).
Výběr textu z obrázku:
for (int x = sPosX; x < MyImage.Width; x++) { for (int y = sPosY; y < MyImage.Height; y++) { if (pos > delkaTxt - 1) break; if (id == 1) { SD.Color pixel = MyImage.GetPixel(x, y); pxr = Convert.ToByte(pixel.R) & maska[9]; pxg = Convert.ToByte(pixel.G) & maska[9]; pxb = Convert.ToByte(pixel.B) & maska[9]; charbin = pxr.ToString() + pxg.ToString() + pxb.ToString(); id =2; }
Výběr textu z obrázku se děje opačným postupem. Pomocí masky je testován nejnižší bit bajtů R G B a postupně je skládána bitová presentace znaku. Po transformaci je znak zobrazen v textBoxu.
Algoritmus programu je jednoduchý, vytvoření vlastního testovacího programu byla potom rutinní záležitost. Na konci článku je program SteganoLSB přiložen k stažení. Program slouží nejen ke skrytí textu do obrázku, ale je také přístupovým kódem chráněn vstup pro výběr textu z obrázku. Toto zabezpečení lze ještě kombinovat kryptografickým zabezpečením textu. Lze např. použít můj program AES crypto Editor.
Doporučení
Pro testování používejte obrázky bitmap s příponou *.bmp nebo *.tif. Obrázky s příponou *.jpg nejsou vhodné, protože pro ukládání používají kompresi. Pro vytvoření bitmapy doporučuji můj program PictureViewer. Další se dozvíte v textu ukrytém v přiloženém obrázku. Kód pro vyjmutí textu je 1573.
Literatura
- [1] Zpracování obrazu a algoritmy v C#, Dobeš Michal, 2008
- [2] Výuková demonstrace digitální steganografie, Marek Bartík, 2013, Bakalářská práce
- [3] Steganografie a stegoanalýza, Roman Žilka, 2008, Diplomová práce
V další lekci, Skrývání dat do obrazu, si ukážeme steganografické metody ukrývání textu do obrázku, obrázku do obrázku a zvukové stopy do obrázku.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 1038x (1.18 MB)