Krátké pojednání o digitální steganografii

Algoritmy Grafické Krátké pojednání o digitální steganografii

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.

SteganoLSB – Ukrytí textu do obrázku

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

 

Stáhnout

Staženo 192x (1.18 MB)

 

  Aktivity (1)

Článek pro vás napsal itnavi
Avatar
Autor se věnuje tvorbě a správě webových stránek a programování v C#

Jak se ti líbí článek?
Celkem (7 hlasů) :
55555


 


Miniatura
Předchozí článek
Mandelbrotova množina
Miniatura
Všechny články v sekci
Grafické algoritmy

 

 

Komentáře

Avatar
Martin Gabriel:

Supr článek. Budou nějaké další z oblasti kryptografie? :)

Odpovědět  +2 4.3.2015 13:32
"Be the change you want to see in the world" - Michael Scofield
Avatar
itnavi
Redaktor
Avatar
Odpovídá na Martin Gabriel
itnavi:

Již dříve jsem publikoval článek, který komentuje program AES crypto editor.
V článku o Steganografii jsem se o něm zmínil. Nyní je ke schválení publikace inovovaná verze.
Protože se budu i nadále věnovat této problematice, lze očekávat i další články.
Zdravím
Ivan Šereda

Odpovědět 4.3.2015 16:05
Pořád něco nového
Avatar
coells
Redaktor
Avatar
coells:

Proč by komprese měla vadit téhle metodě? Nechtěl jsi uvést ztrátovou kompresi? Už proto, že BMP podporuje kompresi a TIFF navíc podporuje kompresi s DCT.

 
Odpovědět 4.3.2015 22:21
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na coells
David Novák:

Myslím, že je celkem zřejmé, že myslel ztrátovou kompresi.. ;)

Odpovědět 4.3.2015 22:52
Chyba je mezi klávesnicí a židlí.
Avatar
Štefan Pružinský:

Výborný článok. Ocenil by som aj ďalšie z oblasti kryptografie.:)

Odpovědět  +1 5.3.2015 20:13
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Odpovědět  +1 5.3.2015 20:22
Nesnáším {}, proto se jim vyhýbám.
Avatar
zpavlu
Redaktor
Avatar
zpavlu:

Pěkný článek.

Odpovědět  +1 5.3.2015 20:22
PZ
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.