IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Krátke pojednanie o digitálnej Steganografia

Na úvod si odcitujte pojem Steganografia z Wikipédie:

"Steganografia (gréčtina. Steganos-schovaný, graphein-písať) je vedná disciplína (podobor kryptografie) zaoberajúce sa utajením komunikácia prostredníctvom ukrytie správy. Správa je ukrytá tak, aby si pozorovateľ neuvedomil, že komunikácia vôbec prebieha. Sila tejto komunikácie stojí a padá na jej utajenie (jedná sa o takzvanú bezpečnosť skrze utajenia - security through Obscurity), a preto zachytenie skryté správy tak prakticky znamená jej prelomenie. Aby ani v tom prípade nedošlo k prezradeniu obsahu správy, spravidla sa kombinuje s ďalšími metódami šifrovanie. "
Z historického hľadiska možno konštatovať, že princípy steganografie sa objavujú v zabezpečenej komunikácii už od staroveku. Už v antickom Grécku sa používali k prenosu skrytých správ najrôznejšie princípy. Kurióznom príkladom môže byť správa napísaná na holú lebku posla, ktorá bola následne ukrytá porastom vlasov.

My sa však budeme baviť o súčasnej digitálnej Steganografia. Tajná správa môže byť zakódovaná na miesto nepodstatného šumu v súboroch so zvukmi, obrázkami, videom a podobne. V tomto pojednaní sa zameriam len na ukrývanie textu do obrázku. Zo známych princípov som zvolil princíp ukladania textu do obrázku s využitím najmenej významného bitu LSB (Least Sgnificant Bit) v pixelu obrázka. Do každého pixelu obrázku môžem do priečinkov RGB uložiť 3 bity. Pre pokrytie českej znakovej sady potrebujem 10 bitov na jeden znak textu. Jeden znak tak uložím do 4 pixelov. Z toho možno vyvodiť potrebnú veľkosť bitovej mapy obrázku pre uloženie daného textu.

Na príklad do obrázka 800 * 600 pixelov môžem uložiť text o veľkosti 120 000 znakov. Pre overenie princípu som vytvoril program SteganoLSB v C# .NET.

Algoritmus

Teraz sa pokúsim komentovať algoritmus programu v časti ukladania textu do obrázku a výberu textu z obrázku.

Premenné a konštanty:

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ýber bitov znaku, premenné pZapisTxtX a pZapisTxtY určujú pozíciu xayv bitovej mape obrázku (sú nastavené bezpečnostným kódom). Zápis textu do obrázka začína z tejto pozície. Informácie o dĺžke texte je uložená pred túto pozíciu na osi xs dištanc posunX.

Ukladanie bitov 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;

Pretože sa jedná o časť metódy, ktoré sú pozície x, ya dĺžka textu odovzdané volaním metódy, text je ukladaný do obrázka podľa lokálnych premenných z pozície PosX a Posy. Text je prevedený do poľa znakov a dekadické prezentácie znaku spolu s maskou vytvorí bitovou prezentáciu. Jednotlivé bity sa potom porovnávajú s najnižším bitom bytu RGB pixelu a ten je následne modifikovaný. Pre jeden znak sa táto činnosť opakuje následne v 4 pixeloch (v poslednom je využitý len byte R).

Výber 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ýber textu z obrázku sa deje opačným postupom. Pomocou masky je testovaný najnižší bit bajtov RGB a postupne ich skladaná bitová presentace znaku. Po transformácii je znak zobrazený v textbox.

Algoritmus programu je jednoduchý, vytvorenie vlastného testovacieho programu bola potom rutinnú záležitosť. Na konci článku je program SteganoLSB priložený k stiahnutiu. Program slúži nielen na skrytie textu do obrázku, ale je tiež prístupovým kódom chránený vstup pre výber textu z obrázku. Toto zabezpečenia možno ešte kombinovať kryptografickým zabezpečením textu. Možno napr. Použiť môj program AES crypto Editor.

SteganoLSB – Ukrytí textu do obrázku - Grafické algoritmy

Odporúčanie

Pre testovanie používajte obrázky bitmap s príponou * .bmp alebo * .tif. Obrázky s príponou * .jpg nie sú vhodné, pretože pre ukladanie používajú kompresiu. Pre vytvorenie bitmapy odporúčam môj program PictureViewer. Ďalšia sa dozviete v texte ukrytom v priloženom obrázku. Kód pre vybratie texte je 1573.

Literatúra

  • [1] Spracovanie obrazu a algoritmy v C #, Dobeš Michal, 2008
  • [2] Výučbová demonštrácie digitálne steganografie, Marek Bartík, 2013, Bakalárska práca
  • [3] Steganografia a stegoanalýza, Roman Žilka, 2008, Diplomová práca

 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 1019x (1.18 MB)

 

Všetky články v sekcii
Grafické algoritmy
Článok pre vás napísal itnavi
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje tvorbě a správě webových stránek a programování v C#
Aktivity