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.
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 podmienkamiStiahnuté 1019x (1.18 MB)