Mendelova univerzita v Brně Provozně ekonomická fakulta
Využití obrazových souborových formátů v oblasti steganografie Bakalářská práce
Vedoucí práce: Ing. Jan Přichystal, Ph.D.
Lukáš Šajtar
Brno 2010
Na tomto místě bych chtěl poděkovat ing. Janu Přichystalovi, Ph.D. za vedení bakalářské práce a cenné rady při její tvorbě.
Prohlašuji, že jsem tuto bakalářskou práci vyřešil samostatně s použitím literatury, kterou uvádím v seznamu.
V Brně dne 4. ledna 2010
....................................................
4
Abstract Šajtar, L. Usage of image file formats in steganography. Bachelor thesis. Brno, 2010. Presented bachelor thesis deals with the image file formats and their utilization in steganography. It is partially focused on definitions of stenography terms and forms and usage of stenography, both in the past and today. Furthermore, the author deals with mostly used formats for storage of graphical information and analyzes the possibility of storage of text in one chosen format. The bulk of the thesis deals with a proposition and implementation of an algorithm for message hiding. The author will use the Java programming language. The end of the thesis attends to evaluation of an algorithm implementation and a possibility of using it in practice. Key words Information hiding, LSB algorithm, PNG image format, steganography
Abstrakt Šajtar, L. Využití obrazových souborových formátů v oblasti steganografie. Bakalářská práce. Brno, 2010. Předkládaná bakalářská práce se zabývá tématem obrazových souborových formátů a jejich využitím v oblasti steganografie. Je z části zaměřena na vysvětlení pojmu steganografie, její formy a využití jak v minulosti, tak i v současnosti. Autor se dále zabývá jednotlivými nejčastěji využívanými formáty pro uchování grafické informace a u jednoho vybraného formátu provede analýzu možnosti uchování textové zprávy. Převážná část práce se zabývá navržením a samotnou implementací algoritmu pro ukrývání zpráv. Autor k tomuto využije programovací jazyk Java. Závěr práce je věnován zhodnocení implementace algoritmu a možnosti využití v praxi. Klíčová slova Algoritmus LSB, grafický formát PNG, steganografie, ukrývání informací
5
OBSAH
Obsah 1 Úvod a cíl práce 1.1 Úvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Cíl práce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 7 8
2 Metodika práce
9
3 Steganografie 3.1 Vysvětlení pojmu steganografie a její princip . . . . . . . . . . 3.2 Minulost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Současnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Mikrotečky . . . . . . . . . . . . . . . . . . . . . . . . 3.3.2 Digitální steganografie . . . . . . . . . . . . . . . . . . 3.3.3 Aplikace pro ukládání informací do grafických formátů
. . . . . .
10 10 10 11 12 12 16
. . . . . . . .
18 18 18 19 20 20 21 21 22
5 Algoritmus pro ukrytí zprávy 5.1 Princip fungování algoritmu . . . . . . . . . . . . . . . . . . . . . . . 5.2 Kódování hlavičky zprávy . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Dekódování zprávy z nosiče informací . . . . . . . . . . . . . . . . . .
23 23 26 27
4 Nejpoužívanější rastrové formáty současnosti 4.1 GIF . . . . . . . . . . . . . . . . . . . . . . . 4.2 JPEG . . . . . . . . . . . . . . . . . . . . . . 4.3 BMP . . . . . . . . . . . . . . . . . . . . . . . 4.4 PNG . . . . . . . . . . . . . . . . . . . . . . . 4.4.1 Metoda komprimace . . . . . . . . . . 4.4.2 Průhlednost . . . . . . . . . . . . . . . 4.4.3 Gamma faktor . . . . . . . . . . . . . . 4.4.4 Vnitřní struktura formátu PNG . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . .
. . . . . . . .
. . . . . .
. . . . . . . .
. . . . . .
. . . . . . . .
6 Implementace a problémy při vytváření aplikace 29 6.1 Vlastní implementace . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 6.2 Problémy při vytváření aplikace . . . . . . . . . . . . . . . . . . . . . 32 7 Ovládání aplikace 34 7.1 Kódování zprávy do obrázku . . . . . . . . . . . . . . . . . . . . . . . 34 7.2 Dekódování zprávy z obrázku . . . . . . . . . . . . . . . . . . . . . . 35 7.3 Nápověda a ukončení aplikace . . . . . . . . . . . . . . . . . . . . . . 36 8 Diskuse a zhodnocení řešení 37 8.1 Diskuse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 8.2 Zhodnocení aplikace . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 9 Závěr
40
OBSAH
10 Literatura
6 41
11 Přílohy 43 11.1 Příloha A – screenshoty aplikace . . . . . . . . . . . . . . . . . . . . 43 11.2 Příloha B – zdrojový kód aplikace (CD) . . . . . . . . . . . . . . . . 46
1
ÚVOD A CÍL PRÁCE
1 1.1
7
Úvod a cíl práce Úvod
Snaha utajit informace nás doprovází od počátku lidstva a od té doby prošla velkým vývojem. Patrně první zaznamenané zprávy o použití těchto technik podává Héródotos. Popisuje případ komunikace pomocí voskových tabulek, kde byla zpráva vyryta do dřeva pod vrstvu vosku. Nebo také případ, kdy panovník vybral nejvěrnějšího otroka s tmavými a hustými vlasy, zprávu mu vytetoval na hlavu a poslal jej na cestu poté, co mu vlasy dorostly. Příjemce zprávy musel pouze vlasy oholit a zpráva mu byla k dispozici. Dnes se již používají daleko sofistikovanější metody, jako třeba mikrotečky nebo ukrývaní zpráv do různých multimediálních formátů, hudby, videí a také do grafických formátů, což bude i snahou autora práce. Na trhu již existuje poměrně velké množství více či méně zdařilých produktů, které dokáží ukrývat ať už text nebo třeba fotografie do grafických souborových formátů. Z těch, které jsou freeware, lze uvést například aplikace Outguess, či Hide in Picture. Základem pro vytvoření programu bude nastudovat strukturu jednotlivých grafických formátů a na základě těchto znalostí zvolit vhodný formát pro ukrývání textu. Grafických formátů je velké množství a bude potřeba zvážit, zda použít formát ze skupiny nekomprimovaných či ze skupiny komprimovaných. Obě skupiny mají své pro a proti. U nekomprimovaných je možné uložení většího objemu dat a manipulace se soubory (například pootočení o 90 stupňů) se neprojeví tak drasticky jako u komprimovaných. Na druhou stranu se zásah do struktury obrázku u nekomprimovaných formátů projeví výrazněji kvůli jeho vyšší kvalitě, než by se tomu tak stalo u formátů komprimovaných. Autor práce si toto téma vybral ze dvou důvodů. Steganografie se stává čím dál tím více aktuálním tématem. V dnešní době internetu, kdy se jen těžko dá utajit informace, jsou steganografické metody vítaným pomocníkem při utajování skutečnosti, že máme nějaké tajemství. Metoda ukrývání informace do obrázku byla zvolena z toho důvodu, že těchto datových nosičů je na internetu obrovské množství a málokoho napadne hledat utajenou zprávu na stránce s několika nevinně vypadajícími obrázky. Zároveň je metoda ukrývání zprávy do obrázku nejrozšířenější a nejoblíbenější, tudíž je možné dosažené výsledky snadno porovnat i s jinými produkty již dostupnými na trhu. Jak bylo výše uvedeno, na trhu se již nachází poměrně velké množství aplikací, které jsou určené ke stejnému nebo podobnému účelu, ať už profesionální placené, či freeware k vyzkoušení. Hlavní nevýhodou profesionálních aplikací je samozřejmě to, že za jejich používání musíme zaplatit určitou částku a cena za licenci se může vyšplhat až do řádů tisícovek korun. Aplikace, jejíž vytvoření bude cílem této bakalářské práce, bude samozřejmě zdarma a bude dostupná i se zdrojovým kódem.
1.2
Cíl práce
8
U aplikací, které nejsou zatíženy placenými licencemi, autor narazil na poměrně široké spektrum podporovaným grafickým formátů. Mezi nejčastěji podporované formáty jednoznačně patří BMP a JPEG. Naopak mezi zřídka podporované patří například PNG. Autor tento fakt vezme v úvahu a pokusí se při tvorbě vlastní aplikace přizpůsobit trhu. Jednoznačnou výhodou předkládané aplikace bude přehledné grafické prostředí. To u některých již existujících aplikacích není zrovna nejlepší a jsou i takové, u kterých chybí úplně. Aplikace, jejiž vytvoření je cílem předkládané bakalářské práce, může nalézt i praktické využití. Na MZLU v Brně je vyučován předmět Komprimace dat a kryptologie, jehož náplní je kromě jiného i seznámení studentů právě s principy steganografie. Vytvořená aplikace se může stát názornou pomůckou při demonstraci steganografických metod, které jsou využívány při utajování požadovaných informací.
1.2
Cíl práce
Cílem bakalářské práce je navržení a implementace algoritmu pro ukrývání textu do zvoleného grafického souborového formátu. Algoritmus bude napsán v jazyce Java, a to ze dvou důvodů. Java je multiplatformní jazyk, takže aplikace poběží v běžných operačních systémech, jako jsou Windows nebo UNIX. Druhým důvodem je široká podpora při vytváření grafického prostředí programu, které bude aplikace pro pohodlnější manipulaci také obsahovat. Výsledná aplikace nalezne i praktické využití ve výuce, jak bylo uvedeno výše. Bude jasně demonstrovat, na jakém principu pracuje zvolená steganografická metoda pro ukrývání informace do obrázku. Konkrétně se posluchači dozví, jak pracuje daný algoritmus pro ukrývání zprávy, co se děje se samotným obrázkem a jakým způsobem je možné zprávu následně z obrázku opět získat.
2
2
METODIKA PRÁCE
9
Metodika práce
První část předkládané práce bude věnována definování samotného pojmu steganografie. Autor v této části práce vysvětlí, co to vlastně je steganografie a jaké jsou její základní principy. Dále bude v této části zmíněn historický vývoj tohoto vědního oboru a dozvíme se o metodách, které nacházejí uplatnění v dnešní době moderních technologií, a o jejich praktickém uplatnění v životě. Nedílnou součástí teoretické části bude autorovo seznámení s nejčastěji používanými grafickými souborovými formáty současnosti. Autor nastuduje strukturu jednotlivých formátů, seznámí se s jejich klady a zápory, zhodnotí nabízené možnosti pro využití v oblasti steganografie a na základě této analýzy bude v praktické části práce navržen algoritmus, s jehož pomocí bude zpráva ukryta do obrázku. Praktická část práce bude z převážné části věnována samotné tvorbě aplikace pro ukrývání textu. Bude zde uveden algoritmus, který si autor práce po analýze možností ukrytí textové informace do zvoleného grafického formátu vybral a pomocí kterého bude ukryta samotná zpráva. Autor na tomto místě uvede postup své práce a popíše aplikaci jak z pohledu programátora, tak i z pohledu uživatele aplikace a popíše případné problémy, se kterými se během své práce setkal, a jejich řešení. Po úspěšném navržení a odladění algoritmu bude pomocí dalších nástrojů vytvořeno grafické prostředí pro pohodlnější manipulaci s programem. Tato část bakalářské práce, přesněji řečeno vytvořená aplikace, najde i praktické uplatnění v rámci výuky předmětu Komprimace dat a kryptologie na naší univerzitě, jak bylo uvedeno výše. Závěr práce bude věnován zhodnocení navržené implementace, možnostem dalších případných úprav aplikace pro dosažení maximální efektivity a funkčnosti programu, čeho se podařilo dosáhnout, respektive, co by ještě bylo možné zlepšit či doplnit.
3
STEGANOGRAFIE
3
10
Steganografie
První zdokumentovaný případ steganografie pochází z 5. století před Kristem, kdy Řek Demaratus poslal varování o perských přípravách na invazi do Řecka. Zpráva byla vyrytá do voskové psací tabulky, z níž nejprve seškrábal vosk a po napsání zprávy do dřevěného podkladu ji voskem opětovně zakryl. V jiném případě byla otrokovi oholena hlava, zpráva napsána na jeho holou lebku a po dorostení vlasů byl poslán na svou cestu.
3.1
Vysvětlení pojmu steganografie a její princip
Slovo steganografie pochází z řečtiny, a to ze slov steganos (schovaný) a graphein (psát). Je to moderní věda o utajení komunikace prostřednictvím ukrytí obsahu zprávy. Do oblasti steganografie patří například neviditelné inkousty, mikrotečky, či ukrývání zpráv do různých multimediálních formátů. Steganografie sice poskytuje jistý stupeň utajení, ale její nevýhodou je to, že když se zprávu podaří odhalit, je celý její obsah prozrazen. Zachycení zprávy se rovná i prozrazení jejího obsahu. Steganografie se proto často kombinuje s kryptografií, která na rozdíl od steganografie neutajuje existenci zprávy, ale snaží se pomocí šifrování či kódování zamezit odhalení jejího smyslu. Princip steganografie je velmi jednoduchý. Existuje spousta datových formátů, které mohou projít velkou změnou, aniž by to člověk svými smysly postřehl. Na tomto principu ostatně funguje třeba běžná komprese zvukových souborů nebo bitmap. A přesně toho se využívá při ukrývání zpráv. (Praktické základy Kryptologie a Steganografie, 2009)
3.2
Minulost
Stejně jako se špionáž označuje za druhé nejstarší řemeslo, steganografie je jednou z nejstarších metod. Potřeba skrytého předávání zpráv skrze nepřátelské obležení byla nutná již ve starověkém Řecku. Jak již bylo uvedeno v předchozích odstavcích, pro přenos informací sloužila například vyholená hlava otroka nebo vosková tabulka, kde se pod tradiční vrstvou vosku skrývala skrytá zpráva. Další zajímavou metodu přenosu zpráv vymysleli staří Číňané, kteří psali tajné zprávy na jemné hedvábí, které pak zmačkali do malé kuličky a zalili voskem. Posel pak voskovou kuličku polkl. Zprávy se dále schovávaly v různě důmyslných, ale i zcela prostých skrýších, jako byly například berle, protézy, fůry hnoje, nebo fekální vozy.
3.3
Současnost
11
Pokročilejší metodou steganografie jsou tajné inkousty, které byly oblíbené především v renesanci a v následujících válečných obdobích. Tajné inkousty se vyráběly z mléčné šťávy pampelišky nebo citrónové šťávy, které se zviditelňovaly po zahřátí. Později šlo o inkousty ze složitějších syntetických sloučenin, které byly viditelné jen pod speciálním světelným zdrojem nebo po přetření jinou chemikálií, jenž byly běžně dostupné. Poslední variantou skryté komunikace, která se dnes řadí mezi steganografickou metodu, je skrytá komunikace pomocí masmédií. Této komunikace se využívalo a stále ještě využívá pro úkolování agentů v terénu, kdy obě strany komunikují pomocí zcela bezvýznamných sdělení (např. informace o počasí, inzeráty, apod.). (Kryptologie: Steganografie, 2009)
3.3
Současnost
Moderní doba si žádá využití moderních metod. Díky rozvoji výpočetní techniky se steganografie začala ubírat dalším zajímavým směrem, a to digitalizací. Právě digitální steganografie odráží současný trend využití bezpečnostních metod při komunikaci. Umožňuje snadné skrytí tajné zprávy do multimediálního souboru (obrázek, video, zvuková nahrávka), který je volně vystaven na internetu. Principem digitální steganografie není absolutní neviditelnost ukryté zprávy, ale určitý, pokud možno vysoký stupeň nenápadnosti. Metod digitální steganografie je několik druhů. Mezi hlavní patří ukrývání informací do holého textu, formátovaného textu, obrázku, audiosignálu, videa, a do spustitelných souborů. V následujících odstavcích se dozvíme podrobnější informace o těchto jednotlivých metodách. Autor se zaměří především na steganografii u grafických formátů, kde uvede informace i o několika konkrétních, již existují řešeních pro daný účel. Současné metody steganografie již jsou daleko sofistikovanější než v minulosti. Žijeme ve věku počítačů, které nám poskytují dříve nevídané možnosti ukrývání informací. Co se týče způsobu aplikace digitální steganografie, specializovaný software do souboru jednoduše podle určitých zákonitostí, které jsou vyjádřeny klíčem, jenž zná pouze odesilatel a příjemce, přidá určitá data. Není-li poměr mezi původními a ukrývanými daty vyloženě nevhodně zvolen, je velmi obtížné cokoliv postřehnout. Z toho nám vyplývá další omezení, jímž je přenosová kapacita. Velikost ukryté zprávy nemůže být větší než je velikost nosného média, ale musí být naopak podstatně menší. Zpravidla se volí poměr zhruba 1:10. Větší množství ukrývané zprávy může zvýšit riziko odhalení, nižší je naopak nepraktické z hlediska objemu přenášených dat.
3.3
Současnost
12
Proti každé zbrani existuje obrana a ani moderní steganografie není výjimkou. Některá omezení jsme si již nastínili. Zbývá dodat snad jen to, že stejně jako existuje specializovaný software pro ukrývání zpráv, existuje i podobný software určený k jejich vyhledávání. Digitální steganografie dnes nachází rozsáhlé využití například v oblasti ochrany autorských práv. Umístníme-li například na svém webu obrázek stažený z některé komerční stránky, aniž bychom jej nějak upravovali, existuje možnost nás z této krádeže usvědčit právě prostřednictvím steganografie, a to pomocí digitálního vodoznaku. Ve státech, kde je šifrování omezeno zákonem (např. Francie), zpravidla pod záminkou boje s organizovaným zločinem či terorismem, steganografie bývá často zcela legální a je možné ji využít jako příhodnou alternativu. Jinak je její použití relativně vzácné. Pro přenos kratších zpráv se za výhodnější považuje využití kódových slov a u delších zpráv převažuje šifrování. (Praktické základy Kryptologie a Steganografie, 2009) 3.3.1
Mikrotečky
Obrovskou výhodou této metody je to, že na velmi malý prostor můžeme ukrýt velké množství informací. Princip spočívá v tom, že na jednom milimetru je vtlačena třeba celá stránka textu, kterou je tak možné ukrýt například v tečce za větou a posléze s odpovídajícím zvětšovacím přístrojem bez problémů přečíst. 3.3.2
Digitální steganografie
Tento typ steganografie v současnosti poskytuje nejširší možnosti. Žijeme ve věku počítačů, ve kterých se nachází spousta datových formátů, do kterých je možné zprávu ukrýt tak, aniž by ji běžný člověk byl schopen odhalit. Zprávu je možné přidat do textových nebo jiných datových souborů, ale nejlépe se informace uchovávají v grafických a zvukových souborových formátech, které přirozeně s sebou nesou určité množství šumu, aniž by zjevně byly znehodnoceny a u nichž jsou také veškeré vedlejší vlivy na funkčnost souboru eliminovány přirozenou nedokonalostí lidských smyslů. Ukrývání informací do holého textu U této varianty textu máme k dispozici pouze jednotlivé znaky bez jakéhokoliv formátování. Jediné, co je v textu nenápadné, jsou bílé znaky, tedy mezery. Každý znak zprávy tak můžeme nahradit posloupností mezer a tabulátorů. Tyto posloupnosti umístíme na konec řádků. Jiná metoda spočívá v náhradě podobných písmen, např. O a 0, l a 1. Další způsob je pomocí gramatiky. Například v angličtině před slovem and může a nemusí být čárka. Výskyt čárky pak kóduje 0 nebo 1.
3.3
Současnost
13
Ukrývání informací do formátovaného textu Jako příklad ukrývání informace do formátovaného textu lze uvést Baconovu šifru. Bacon vymyslel pro každé písmeno abecedy pětiznakový kód složený ze znaků A a B. Díky tomu platí, že nosič zprávy musí být pětkrát delší než samotná ukrývaná zpráva. Nosič poté píšeme pomocí dvou různých fontů, podle A a podle B. Další možností je kódování pomocí zvětšování mezery mezi řádky či slovy o jeden pixel, což je pro lidské oko zcela nepostřehnutelný rozdíl. Posun poté kóduje nulu nebo jedničku. Mezi další metody lze zařadit ještě změnu vlastností písma, například řez, výšku či šířku. Ukrývání do audiosignálu Při ukrývání do audiosignálu můžeme použít tzv. low bit encoding, což je analogie LSB u obrázků. Zprávu kódujeme do nejméně významných bitů v každém bytu. Odvážnější metoda, tedy kódování zprávy do dvou bitů v každém bytu, je použitelná jen u málo kvalitních nahrávek, získáme však více prostoru pro ukrývání dat. Nevýhodou změn nízkých bitů je, že přenos přes analogové médium zničí zprávu šumem. Stejně tak zprávu zničí převzorkování. Jinou metodu představuje tzv. parity coding, čili kódování pomocí bitů pro kontrolu parity. V každé části audiosignálu je totiž jeden paritní bit. Je-li příslušný bit zprávy roven paritnímu bitu, zůstane část beze změny. Je-li příslušný bit zprávy různý, změníme jeden z LSB v části audiosignálu a následně změníme i paritní bit. Kontrola parity je v pořádku, audiosignál však ukrývá zprávu. Při dekódování zprávy čteme jen paritní bity. Zajímavou metodou kódování do audiosignálu představuje kódování pomocí fázových posunů. Audiosignál je složen ze sinů, které mají různou frekvenci a různou amplitudu. Mají také různý fázový posun. Lidské ucho vnímá jen frekvenci (výška tónu) a amplitudu (intenzita tónu), nikoliv fázový posun. DFT (Diskrétní Fourierova transformace) rozloží signál na siny. Následně upravíme fázový posun elementárních funkcí tak, aby kódoval zprávu a zrekonstruujeme audiosignál. Pro lidské ucho je změna zcela neznatelná, nový zvukový soubor je však velmi odlišný od původního. Čím složitější zvuk, tím větší prostor pro zprávu. Metodou, která opět vychází z reálného světa, je ukrývání do šumu. Zprávu namodulujeme na neslyšitelnou frekvenci a vzniklý signál přidáme do zvuku. Příjemce oddělí signál dané frekvence a dekóduje zprávu. De facto se jedná o princip elektromagnetického přenosu v reálném světě (např. do našeho hlasu je na neslyšitelné frekvenci ukryt signál rádia či televize, signál internetového modemu je přidán do kabelové televize, telefonní linky, atd.). Poslední metodou ukrývání do audiosignálu, o které se autor zmíní, je ukrývání do ozvěny. K určité části signálu v audiosouboru přidáme ozvěnu, přičemž intenzita a útlum ozvěny se mění. Zpoždění kóduje 0 nebo 1. Nelze použít pro nekvalitní signál, pro signál již obsahující ozvěny, nebo pro signál s dlouhými pomlkami (ozvěna ticha je totiž opět ticho). (Steganografie)
3.3
Současnost
14
Ukrývání do videa Video se skládá z obrazu a zvuku. Tím pádem máme možnost použití technik jak pro ukrývání do obrázků, tak i do zvuku, případně můžeme kombinovat obojí. Obrázků je navíc velké množství, pro zprávu tedy máme hodně prostoru. Video je však nepopulární nosič díky značnému objemu dat a skutečnosti, že se nepříliš často přenáší po internetu. Ukrývání do spustitelných souborů Spustitelný soubor není de facto nic víc, než posloupnost instrukcí, které má vykonat. Instrukce samozřejmě nelze měnit či jiným způsobem jakkoli upravovat, tím bychom zcela změnili chod programu, v horším případě způsobili i jeho nefunkčnost. Můžeme však využít instrukce nepodmíněného skoku, tím vytvoříme části souboru, které nikdy nebudou provedeny a do nich pak můžeme ukrýt zprávu. Tento způsob se sice poměrně snadno odhaluje, ale jen málo koho napadne ve spustitelných souborech hledat hluchá místa. Další metodou je ukrývání zprávy do nepoužitých proměnných pomocí negativní nebo pozitivní formulace podmínek skoku, atd. Využití grafických souborových formátů Největší pozornosti se u digitální steganografie těší ukrývání informací do obrázků. Je to zřejmě z toho důvodu, že obrázky lze bez problémů umístnit na web a prohlédnout si je na každém počítači, zatímco hudba vyžaduje přece jen specializovanější software a hlavně hardware. Digitální formáty obrázků jsou dvojí – komprimované a nekomprimované. Pro steganografii jsou zřejmě vhodnější formáty nekomprimované, a to ze dvou důvodů. Prvním je jejich velikost, která nám do nich umožňuje uschovat větší objem dat anebo stejný objem dat rozptýlit, a tím jej o něco lépe ukrýt. Druhý důvod souvisí s asi nejpodstatnějším problémem digitální steganografie. Tímto problémem je to, že jakýkoli zásah do souboru (například otočení obrázku o 90 stupňů) s sebou nese riziko úplného znehodnocení celé zprávy. Každá taková úprava totiž znamená, že zpráva projde matematickým algoritmem, který s ukrytou steganografickou zprávou nepočítá a nebere na ni ohled. U komprimovaných formátu je pochopitelně takový algoritmus silnější, nicméně ani nekomprimované formáty nedokážou tomuto efektu zabránit. Například i malá změna velikosti obrázku je naprosto jistou cestou k likvidaci steganograficky ukryté zprávy, o změně formátu vůbec nemluvě. Vhodnými soubory pro ukrytí zprávy jsou takové, které obsahují mnoho detailů. Naopak obrázek, na němž je jednolitá azurová obloha, zřejmě není právě tím nejvhodnějším. Ačkoliv v tomto ohledu není důvod podléhat nějakému zvláštnímu perfekcionismu, zprávu přece jen není vhodné schovat například na bílé pozadí. (Praktické základy Kryptologie a Steganografie, 2009)
3.3
Současnost
15
LSB Nejjednoduší, zároveň však nejoblíbenější metodou, je kódování do nejméně významného bitu, tedy LSB (Least Significant Bit). Síla této metody spočívá právě v její jednoduchosti. V obrázku se mění pouze hodnota nejméně významného bitu každého bytu klasického barevného schématu RGB, čímž dojde jen k nepatrné, lidským okem nepostřehnutelné změně barvy. Příjemce takto kódované zprávy použije z obrázku jen stanovené bity. Alternativou tohoto postupu může být kódování do dvou posledních bitů. Tímto dochází přirozeně k většímu zásahu do obrázku, lidské oko však stále není schopno zaznamenat změnu. Ukládání do barevné palety Další metodou je ukrývání zprávy do barevné palety, což je využitelné například u obrázků souborového formátu GIF, který má barevný prostor 256 barev. Na začátku každého souboru je definice barevné palety, která představuje uspořádání barev. Samotná obrazová data jsou pak jen indexy do palety. Při změně palety a odpovídající změně indexů zůstane obraz vizuálně identický. Počet různých palet je roven 256 !. Každé zprávě pak přiřadíme určité uspořádání barev. Do barevné palety lze ukrýt až 1683 b = 210 B. Využití ztrátové komprese u JPEGu Co se týče konkrétně nosiče ve formátu JPEG, můžeme využít vlastností ztrátové komprese. Ta je u JPEGu založena na DCT (Discrete Cosine Transform). Lidské oko je citlivější na změnu jasu než na změnu odstínu. V JPEG kompresi obě složky zpracováváme zvlášť a zprávu ukrýváme do informace o barvě na méně významné pozice v matici o velikosti 8x8. Vodoznaky Vodoznaky jsou speciální ochranné znaky, které je možno zakomponovat do bitmapového souboru tak, že nejenže nemusí být viditelné běžným okem, ale můžou navíc poměrně statečně odolávat změnám obrázku, například v grafických editorech. Jejich funkce je jednoduchá, a to chránit obrazová data uložená v digitální podobě před jejich zneužitím. Vodoznaky jsou v podstatě dvojího typu – viditelné a neviditelné. První variantu, tedy viditelné vodoznaky, potkáváme na internetu poměrně často. Vložení poloprůhledného loga nebo nějakého nápisu do nejzajímavější části snímku s největší pravděpodobností zaručí, že jej nikdo nezneužije. Retuš by sice byla často možná, ale tak pracná, že zcela jistě odradí. Druhá varianta, tedy neviditelný vodoznak, je vhodná u dat, která autor prodává pouze s určitými autorskými právy. V tomto případě se vodoznak do daných dat zakomponuje ve formě určitého šumu. Je vhodné poznamenat, že vodoznaky nejsou čistou variantou digitální steganografie, přesto se k tomuto oboru většinou zařazují.
3.3
Současnost
3.3.3
16
Aplikace pro ukládání informací do grafických formátů
Následující odstavce budou věnovány několika již existujícím řešením, která umožňují ukrývání informací nejenom do grafických formátů. Autor práce se pokusil vybrat nejznámější zástupce, kde každý má nějakou svoji přednost. StegHide StegHide je možná nejkvalitnější freeware aplikací, kterou nám současný trh nabízí. Její velkou předností je podpora jak operačního systému UNIX, tak operačního systému Windows. Další výhodou této aplikace je to, že podporuje nejen ukrývání informací do grafických souborových formátů (JPEG, BMP), ale také do audionahrávek, konkrétně do formátů WAW a AU. V neposlední řadě je potřeba zmínit, že tato aplikace nám dává na výběr z několika kódovacích algoritmů podle libosti každého uživatele. Aplikace je dostupná například z této oficiální internetové stránky: http://steghide.sourceforge.net/. Outguess OutGuess je stenografický nástroj, který umožňuje vkládání skrytých informací do redundantních bitů datových zdrojů. Povaha zdroje dat není důležitá. Program se spoléhá na jejich specifikaci, takže odstraní nadbytečné bity a po úpravě je zapíše zpět. Aplikace je kompletně zdarma pro jakékoli účely, kromě komerčního využití. Tato aplikace je napsána pro operační systém UNIX. Podporovanými formáty jsou JPEG a PNM. Hlavní výhodu této aplikace autor vidí v tom, že základní statistické metody pro odhalování přítomnosti ukryté zprávy u této aplikace selhávají a nejsou schopny ji detekovat. Jako nevýhodu tohoto produktu lze vidět v absenci grafického prostředí. Aplikace je dostupná například z této oficiální internetové stránky: http://www.outguess.org/. BitCrypt BitCrypt je jeho tvůrcem (Moshe Szweizer) označena jako nejlepší svého druhu vůbec. Objektivnost tohoto tvrzení nechá autor na posouzení každého čtenáře, ale pojďme se věnovat faktům. Tato aplikace je napsána v jazyce VisualBasic. Co se týče zdrojového kódu, zde je to trošku komplikovanější. Zdrojový kód je z části dostupný a z části ne. Je tomu tak z jednoduchého důvodu, a tím je ochrana před stegoanalýzou, tedy před metodami odhalení přítomnosti ukryté informace v obrázku. Aplikace obsahuje také grafické prostředí, čímž se stává uživatelsky přijatelnějším a vlídnějším.
3.3
Současnost
17
Podle subjektivního hodnocení autora práce je tato aplikace celkově propracovanější a je lépe řešena než výše uvedený konkurenční program Outgess, což podtrhují i lépe vytvořené oficiální internetové stránky programu. Aplikace je dostupná například z této oficiální internetové stránky: http://bitcrypt.moshe-szweizer.com/. Hide in picture Hide in picture je malá a nenáročná aplikace napsaná pro prostředí Windows bez nutnosti instalace. Umí pracovat s grafickými soubory ve formátu BMP a GIF. Nejsilnější stránkou této aplikace je to, že ukrývaný soubor je chráněný heslem, které je chráněno silnými šifrovacími algoritmy, z nichž má uživatel na výběr. Další výhodou této aplikace je jednoduché a intuitivní grafické prostředí a dostupnost i v českém jazyce. Snad jako jedinou nevýhodu této aplikace je možné uvést, že není open source, tedy že ji není možné získat i se zdrojovým kódem. Aplikace je dostupná například z této internetové stránky: http://sourceforge.net/projects/hide-in-picture/. Jak je z výše uvedených příkladů patrné, současný trh již nabízí několik vcelku zdařilých aplikací, které slouží ke skrývání informací do grafických formátů. Fakta, která se autor práce o těchto programech dozvěděl, mu budou při vytváření vlastní aplikace sloužit jako návod k tomu, jak vytvořit vlastní alternativu tak, aby co nejvíce vyhovovala svému uživateli. Klíčové prvky autor práce vidí v dostupnosti zdrojového kódu a tím pádem možnosti úpravy aplikace pro vlastní potřeby každého uživatele, v intuitivním a jednoduchém grafickém prostředí, a v podpoře jak systému Windows, tak systému UNIX. Všechny tyto prvky se autor pokusí ve své práci dodržet.
4
NEJPOUŽÍVANĚJŠÍ RASTROVÉ FORMÁTY SOUČASNOSTI
4 4.1
18
Nejpoužívanější rastrové formáty současnosti GIF
GIF (The Graphics Interchange Format) byl vyvinut společností CompuServe v roce 1987 (označován jako GIF87). Spolu s formátem JPEG je dnes nejpoužívanějším formátem pro zobrazování webové grafiky. GIF se používá pro zobrazování takzvané bitmapové (rastrové) grafiky, která se skládá převážně z jednoduchých čárových objektů a ne příliš velkého počtu barev. Zjednodušeně řečeno, každý obrázek je určen množinou svých bodů a každý bod (pixel) je určen svou pozicí a barvou. Formát GIF podporuje osmibitovou grafiku, což znamená, že obrázek může mít maximálně 256 barev, samozřejmě ale podporuje i menší barevnou hloubku. GIF umožňuje jednu barvu v obrázku nastavit jako průsvitnou (transparent). Tuto vlastnost ale najdeme až ve vylepšené verzi formátu GIF, označované jako GIF89a. Právě této vlastnosti se využívá při zobrazování webové grafiky, protože umožňuje postupné zobrazování obrázku již v průběhu stahování (obrázek se zobrazí celý, v horší kvalitě a postupně se zaostřuje). (GIF, JPEG a PNG – jak a kdy je použít?, 2002) Tento formát využívá bezztrátového komprimačního algoritmu LZW, což mu zaručilo rychlou a účinnou kompresi (objem obrazových údajů je redukován zhruba na polovinu). Princip komprimace touto metodou je založený na zjištění početnosti jednotlivých kódů v údajích a těm se poté přiřazuje rozlišovací kód. Velkou výhodou tohoto formátu je podpora více rámců, což jsou obdélníkové oblasti umístěné uvnitř logické obrazovky. Minimálně musí být vždy přítomen jeden rámec, jejich maximální množství však není omezeno. To zajišťuje větší kompresní poměr, může zvýšit barevnou hloubku celého obrazu, slouží k tvorbě animací, sekvencí snímků, apod. Na internetu je GIF oblíbený zejména z toho důvodu, že podporuje animace a to bez nutnosti instalace pluginů na straně prohlížeče nebo použití speciálních technik (JavaScript, streamované video apod.). Tato výhoda je jednou z největších zbraní GIFu. (Pravda a mýty o GIFu, 2006)
4.2
JPEG
Na začátek je vhodné zdůraznit, že korektní název popisovaného grafického formátu je JFIF, protože JPEG je pouze metoda předepisující způsob ztrátové i bezeztrátové komprimace rastrových obrázků, která však nijak nedefinuje, jakým způsobem bude zkomprimovaný obrázek uložen v souboru (JPEG je použit i v grafickém formátu TIFF, PDF, PS a multimediálním formátu MOV). Vzhledem k tomu, že formát je všeobecně znám spíše jako JPEG než JFIF, bude autor práce dále používat pro tento formát poněkud nepřesné označení JPEG. (JPEG – král rastrových grafických formátů?, 2006)
4.3
BMP
19
Formát JPEG (The Joint Photographics Experts Group) je o něco mladším kolegou formátu GIF. Jeho počátky se datují od roku 1990, kdy byl standardizován normou ISO a v roce 1991 začal být hojně používán. Jedná se o formát používající takzvanou ztrátovou komprimační metodu, která využívá ověřeného faktu, že selektivním zanedbáním určité informace obsažené v obrázku je možné dosáhnout mnohem lepšího komprimačního poměru než při bezeztrátové komprimaci. V případě JPEGu je možné dosáhnout komprimačního poměru 1:50 až 1:100 při zanedbatelné ztrátě informace, ovšem pouze pro určitou skupinu obrázků. JPEG podporuje čtyřiadvacetibitovou grafiku, obrázek tedy může obsahovat až 16 777 216 barev. Formát JPEG ukládá všechny informace o jednotlivých barvách v takzvaných RGB složkách, kdy každá barva je vyjádřena jako trojkombinace tří základních barev – červené (Red), zelené (Green) a modré (Blue). Zastoupení každé barvy můžeme vyjádřit číslem 0 až 255, což je 8 bitů, barvy jsou tři, tedy celkem potřebujeme 24 bitů pro vyjádření libovolné ze 16 miliónů možných barev. (GIF, JPEG a PNG – jak a kdy je použít?, 2002) Je vhodné zdůraznit, že JPEG není a ani nikdy nebyl určen pro ukládání obrázků obsahujících malé množství barev, kontrastní barevné přechody, ostré hrany, písmo, apod. Dnes se však můžeme často setkat například s tím, že se do JPEGu ukládají například screenshoty obsahující text. V tomto případě bude text rozmazaný nebo se značným způsobem zhorší komprimační poměr. JPEG je naopak určen pro ukládání fotografií, naskenovaných dokumentů (které jsou již vlastním procesem skenování rozmazané), monochromatických rentgenových a ultrazvukových snímků, atd. (JPEG – král rastrových grafických formátů?, 2006)
4.3
BMP
Grafický formát BMP je v současnosti jedním z nejpoužívanějších grafických formátů, což je z technologického pohledu vcelku paradoxní, jelikož je poměrně složitý na zpracování a zároveň nabízí pouze minimum užitečných vlastností. Oba dva výše popisované formáty umožňují ukládání obrázku v mnohem více variantách a také používají lepší komprimační schéma. Postup použitý při komprimaci je velice špatný, a proto se používá pouze u minima obrázků. Mnoho aplikací s komprimovanými obrázky ani neumí korektně pracovat. (Grafický formát BMP – používaný a přitom neoblíbený, 2006) Obrázky BMP jsou ukládány po jednotlivých pixelech podle toho, kolik bitů je použito pro reprezentaci každého pixelu. Je možno rozlišit různé množství barev (tzv. barevná hloubka): 2 barvy (1 bit na pixel), 16 (4 bity), 256 (8 bitů), 65 536 (16 bitů), nebo 16,7 miliónů barev (24 bitů). Osmibitové obrázky mohou místo barev používat šedou škálu (256 odstínů šedi). (BMP, 2009) Soubory ve formátu BMP většinou nepoužívají žádnou kompresi (přestože existují i varianty používající kompresi RLE). Z tohoto důvodu jsou obvykle BMP soubory mnohem větší než obrázky stejného rozměru uložené ve formátech, které kompresi používají.
4.4
PNG
20
Z předchozích odstavců je možné vyčíst, že BMP nepatří zrovna mezi formáty úsporné. Je tomu z několika důvodů. Neúspornost začíná už u datové hlavičky souboru, která obsahuje několik rezervovaných, z praktického hlediska zbytečných položek, které v minulosti a zřejmě ani v budoucnosti nebudou využity. Další zdroj neúspornosti je vidět u obrázků obsahujících barvovou paletu. Pro každé místo v barvové paletě jsou rezervovány čtyři byty místo postačujících tří bytů. Poslední a nejzávažnější důvod, proč se formát BMP řadí mezi neúsporné, spočívá v použitém komprimačním schématu. Zvolený postup komprimace je tak špatně navržen, že pro mnoho obrázků dochází spíše k nárůstu velikosti souboru místo jejího snižování. (Grafický formát BMP – používaný a přitom neoblíbený, 2006) Asi jedinou výhodou tohoto formátu je jeho extrémní jednoduchost, dobrá dokumentovanost a také to, že jeho volné použití není znemožněno patentovou ochranou. Díky tomu jej dokáže snadno číst i zapisovat drtivá většina grafických editorů v mnoha různých operačních systémech.
4.4
PNG
PNG (Portable Network Graphics) je grafický formát, který umožňuje ukládat až 16 bitů ve stupnici šedé, 48 bitů v systému pravých barev na pixel a až 16 bitů dat alfa. Ovládá progresivní zobrazení a je schopen uchovávat hodnoty gama, údaje o průhlednosti, textové informace, a používá účinnou a neztrátovou formu datové komprese. Snahou formátu PNG je nabídnout obci uživatelů grafiky a počítačového zpracování obrazu alternativu k formátu GIF firmy CompuServe v souvislosti s právními problémy spojenými se zpoplatněním implementace tohoto formátu. Byl navržen s cílem vytvořit jednoduchý formát, jenž se dá snadno implementovat, který je plně přenositelný a který dosahuje nebo překračuje všechny schopnosti formátu GIF. Na rozdíl od většiny formátů, které vznikají zásluhou jednoho či dvou programátorů bez většího ohledu na budoucí rozvoj formátu, byl PNG vytvořen výborem zainteresovaných vývojářů a odsuzovatelů formátu GIF v čele s Thomasem Boutellem. PNG se také může chlubit výjimečnou kvalitou svého návrhu, která dovoluje rozšiřování jeho funkčních vlastností bez nutnosti hledat kompromisy pro udržení dosavadní funkčnosti a bez potřeby modifikovat stávající software, který s PNG pracuje. (Murray a vanRyper, Encyklopedie Grafických formátů) 4.4.1
Metoda komprimace
Grafický formát PNG používá bezeztrátovou komprimační metodu založenou na hledání stejných posloupností v datech reprezentujících rastr pixelů (metoda LZW). Tato komprimační metoda je ale poměrně nedokonalá v tom smyslu, že pouze sériově zpracovává přicházející data a neudělá si dopředu kompletní představu o barvových a prostorových vlastnostech celého obrázku.
4.4
PNG
21
Z tohoto důvodu obsahuje grafický formát PNG jednu velmi zajímavou a prospěšnou funkci. Na každý obrazový řádek je možné ještě před jeho komprimací aplikovat jednoduchý konvoluční filtr, jehož úkolem je předpřipravit data tak, aby se komprimovala lépe. Většinou se počítá s tím, že se po aplikaci filtru (který většinou hledá podobnosti sousedních pixelů) v datech objeví větší množství pixelů s nulovou hodnotou nebo hodnotou alespoň blízkou nule, čímž se statisticky zvýší pravděpodobnost toho, že komprimační program v datech nalezne delší shodné posloupnosti a tím zmenší výslednou délku souboru. 4.4.2
Průhlednost
Jednou z největších předností grafického formátu PNG je plná podpora průhlednosti, nazývané také alfa kanál. Podle typu ukládaného obrázku je možné buď přímo každému pixelu umístěnému v rastrové mřížce nebo každé barvě uložené v barvové paletě přiřadit hodnotu průhlednosti. Podporován je jak plný osmibitový či dokonce šestnáctibitový alfa kanál (256 či 65536 stupňů průhlednosti, tj. hodnot alfa), tak i jednobitová průhlednost známá už z grafického formátu GIF. Faktem ovšem zůstává, že jeden z nejrozšířenějších webových prohlížečů (MSIE) má s průhledností PNG obrázků velké problémy a jejich korektní zobrazování je možné pouze po použití platformově závislého filtru. Ostatní webové prohlížeče, založené například na jádru Gecko, s běžnými PNG vesměs žádné problémy nemají. 4.4.3
Gamma faktor
Při zobrazování rastrových obrázků na různých počítačových platformách (PC, SGI, Sun, Macintosh) či na televizní obrazovce si můžeme všimnout, že zatímco je obrázek na jedné platformě příliš tmavý, na jiné platformě je zase moc světlý, přičemž dochází ke splývání nejsvětlejších nebo nejtmavších barevných odstínů. Pokud se například obrázek vytvořený na Macintoshi přenese na PC, je při zobrazení většinou velmi tmavý a naopak. Toto je způsobeno rozdílným nastavením koeficientu gamma. Právě zde přichází ke slovu takzvaná gamma korekce, jejímž účelem je obrázek před jeho zobrazením předpřipravit tak, aby po průchodu celým zobrazovacím řetězcem zůstala v co největší míře zachována linearita. V grafickém formátu PNG je možné uchovat gamma faktor zařízení, které obrázek vytvořilo (skener, fotoaparát, počítačový program). Při zobrazování se na základě tohoto gamma faktoru mohou intenzity pixelů přepočítat a dosáhnout tak kýžené linearity. Důležité je, že gamma korekci je možné provádět beze změny hodnot pixelů původního obrázku, takže při úpravách a přenosu na další platformu nedochází ke ztrátě dynamiky barev. (PNG is not GIF, 2006)
4.4
PNG
4.4.4
22
Vnitřní struktura formátu PNG
Tvůrci PNG se poučili z mnoha chyb a nedostatků do té doby používaných binárních formátů a navrhli konzistentní interní strukturu PNG, která je na jednu stranu velmi sofistikovaná, a na druhou stranu přitom poměrně jednoduchá na implementaci (aplikace mají přesné informace o tom, která data musí načítat a která data mají menší význam). Formát PNG se skládá z 8bytové identifikační signatury (hlavičky) následovaný třemi a více shluky dat. Shluk (chunk) je nezávislý blok dat splňující pravidla k tomuto účelu definované struktury. Shluky nesou svou vlastní identifikaci kvůli svému vnitřnímu formátu a jsou čteny sekvenčně od začátku do konce souboru nebo datového toku. (PNG is not GIF, 2006) Hlavička Hlavička byla vytvořena s ohledem na heterogenní prostředí Internetu. Při přenosu souborů v tomto heterogenním prostředí může docházet k nežádoucím modifikacím dat, která je nutné v případě binárního formátu detekovat a vadné soubory (resp. jejich části) nenačítat. Hlavička grafického formátu PNG je z těchto důvodů vytvořena tak, aby byly všechny výše uvedené nežádoucí modifikace při načítání souboru detekovány a modifikované soubory odstraněny z dalšího zpracování. Hlavička PNG má délku pouhých osmi bytů, které mají vždy konstantní hodnoty. Je zajímavé, že zde nikde není uvedena verze PNG. To je zcela zbytečné, protože informace o tom, která data v obrázku jsou pro korektní zpracování (zobrazení) zapotřebí a která ne, je uvedena přímo u jednotlivých chunků. Pokud je hlavička korektně načtena, může prohlížeč či jiná aplikace pracující s PNG pokračovat v načítání dalších dat. (PNG is not GIF, 2006) Shluky (Chunky) Shluky neboli chunky se skládají ze 4 částí. První část má konstantní velikost čtyři byty a obsahuje celkovou délku datové části chunku. Druhá část chunku má opět velikost čtyři byty. Obsahuje jméno (typ) chunku ve formátu čtyř ASCII znaků malé i velké anglické abecedy. Jedná se o ASCII kódy v rozsahu 6590 a 97122 decimálně. Třetí část chunku je tvořena vlastními daty. Tato část má v některých případech, například u chunku nazvaného IDAT, nulovou délku. Poslední čtvrtá část chunku má délku čtyři byty a obsahuje kontrolní součet (CRC) druhé a třetí části, tj. jména (typu) chunku a uložených dat.
5
ALGORITMUS PRO UKRYTÍ ZPRÁVY
5
23
Algoritmus pro ukrytí zprávy
Prvním krokem při vytváření aplikace byl výběr samotného algoritmu, který bude sloužit pro ukrytí zprávy. Autor práce se po analýze současných metod, které se k tomuto účelu využívají, rozhodl pro metodu LSB (Least Significant Bit). Tato metoda se řadí mezi nejjednodušší, ale zvláště zde platí, že v jednoduchosti je síla. Tato metoda ukrytí zprávy je k obrázku poměrně šetrná, takže na výsledném nosiči zprávy zásah do struktury není znát vůbec a nebo jen nepatrně. Díky tomuto faktu se tato metoda řadí mezi dnes absolutně nejoblíbenější a nejčastěji využívanou v oblasti ukrývání textových informací do grafických souborových formátů. Pojďme se nyní podívat, jak vlastně bude tento algoritmus konkrétně pracovat v rámci vytvářené aplikace. Každý obrázek je složen z mnoha stovek až tisíců malých teček, kterým se odborně říká pixely. Každý tento pixel je složen z několika částí (většinou ze tří), z několika barevných složek, a to podle barevného modelu, kterých je několik druhů. Prvním a jediným modelem, o kterém se autor zmíní, je RGB (Red, Green, Blue), který je složen z barvy červené, zelené a modré. Tento model se využívá u všech monitorů a projektorů, tudíž bude i klíčovým prvkem, se kterým bude autor pracovat při vytváření své aplikace. Zmiňovat se o dalších modelech autor práce nepovažuje za důležité, proto se podrobněji podívejme na fungování samotného algoritmu.
5.1
Princip fungování algoritmu
Pro vysvětlení principu fungování algoritmu autor využije již zmíněný barevný model RGB s barevnou hloubkou 24 bitů (barevná hloubka reprezentuje počet bitů použitých k popisu určité barvy v pixelu). Každý pixel obrázku bude tedy v našem případě mít 24 bitů. To znamená, že každá ze tří složek RGB pro sebe bude mít vyhrazen 1 byte, čili 8 bitů. První věc, kterou použitý algoritmus udělá, je ta, že námi požadovaný text pro ukrytí do obrázku převede na pole bytů. Každý znak zprávy je reprezentován 8 bity, tedy jedním bytem. To znamená, že například slovo o šesti znacích bude reprezentováno polem o velikosti šesti bytů. Tyto byty budou následně jeden po druhém ukládány do obrázku. Než autor podrobně uvede postup ukládání takto vzniklého pole bytů do obrázku, pro lepší představivost názorně předvede, jak takové slovo může po transformaci na byty vypadat. Vezměme si například anglické slovíčko school, tedy škola. To bude po převedení na byty vypadat následovně:
5.1
s c h o o l
Princip fungování algoritmu
– – – – – –
24
01110011 01100011 10000100 01101111 01101111 01101100
Poté, co proběhne převedení znaků na pole bytů, začne samotné ukládání dat do obrázku. Algoritmus vezme první pixel obrázku a do každé z jeho tří složek, tedy do složky Red, Green a Blue, začne postupně ukládat jednotlivé bity vzniklého pole bytů zprávy, které chceme zakódovat, a to pomocí metody LSB (Least Significant Bit). Její princip je jednoduchý. Jak už bylo řečeno, každá se tří složek RGB je reprezentována 8 bity. Tato metoda vezme poslední bit každé složky (nejméně významný, umístěný úplně vpravo), odřízne ho a nahradí prvním bitem z bytového pole, které vzniklo transformací zprávy, kterou chceme utajit. V našem konkrétním případě, kdy použijeme slovo school, vezme první bit písmena „sÿ, tedy nulu a umístí ji na pozici původního bitu, který jsme v předchozím kroku odřízli z dané barevné složky. To stejné tato metoda provede u všech tří barevných složek prvního pixelu a následně bude pokračovat se stejným principem i u následujících pixelů obrázku, dokud nebudou zakódovány všechny bity znaku „sÿ a následně všechny ostatní znaky ukrývané zprávy. Autor práce opět pro lepší představivost názorně předvede, co se vlastně s obrázkem a kódovanou zprávou během tohoto procesu děje. Dejme tomu, že první pixel má své barevné složky reprezentované touto posloupností bitů (je to pouze příklad): Red – 10011011 Green – 01000101 Blue – 01101110 Řekli jsme si, že znak „sÿ je kódován takto: s – 01110011 Ve výsledku tedy jednotlivé barevné složky prvního pixelu budou vypadat následovně: Red – 1001101 0 – první bit znaku „sÿ Green – 0100010 1 – druhý bit znaku „sÿ Blue – 0110111 1 – třetí bit znaku „sÿ
5.1
Princip fungování algoritmu
25
Jak je možno vidět, do barevné složky Green byla uložena stejná hodnota, jako byla původní. To ničemu nevadí, právě naopak. Pokud dojde k tomu, že odříznutý bit je shodný s tím, který ho má nahradit, je to jenom ku prospěchu věci. Nedojde totiž k žádnému zásahu do dané barevné složky a tím se zpráva stává hůře odhalitelnou lidským okem. Tato skutečnost společně s faktem, že ukládání informací do nejméně významného bitu je k obrázku velmi šetrná, činí tuto metodu velice efektivní a špatně odhalitelnou. Předchozí odstavce popisují, jak vytvořená aplikace pracuje standardně. Autor práce ale do předkládané aplikace zakomponoval také možnost, že se jednotlivé bity ukrývané zprávy nebudou ukládat postupně do každé barevné složky jednotlivých pixelů, ale bude možné bity kódovat ob jednu složku, ob dvě složky, atd. Co tato možnost přináší? V podstatě dvě věci, jednu kladnou, druhou zápornou. Přínosem této modifikace je, že ukrývaná zpráva bude rozložena do většího množství pixelů. Tím pádem bude rozložena do větší plochy obrázku a měla by být i hůře rozeznatelná při běžném pohledu. Autor úmyslně uvedl, že by měla být, protože tím můžeme docílit efektu přesně opačného. Pokud bychom ukládali bity zprávy například ob jednu složku, došlo by k následujícímu. První bit zprávy by se uložil do prvního pixelu obrázku do barevné složky Red. Složka Green bude přeskočena a druhý bit zprávy bude uložen až do barevné složky Blue. Poté se zpráva bude dále ukládat do druhého pixelu obrázku. Barevná složka Red bude přeskočena, třetí bit zprávy bude uložen až do složky Green atd. Tím, že jednotlivé bity zprávy budeme ukládat ob jednu složku, sice docílíme toho, že bude rozložena na větší ploše, ale na druhou stranu v každém pixelu dojde k úpravě jen určitých barevných složek. Díky tomu daný pixel může získat nádech jedné z barev a stane se v daném obrázku nápadně viditelným a podezřelým. Díky tomuto faktu metoda ukládání jednotlivých bitů zprávy ob určité množství barevných složek v praxi nemusí být příliš použitelná, může ale sloužit jako názorná pomůcka toho, co se s daným obrázkem po takovéto úpravě stane. Další metodou pro ukládání bitů do obrázku, kterou autor zakomponoval do aplikace, je pomocí Fibonacciho posloupnosti. Využití této metody v praxi je stejně diskutabilní jako u předchozí, opět ale může sloužit pro demonstraci toho, co se stane s obrázkem po takovémto zásahu do jeho struktury. K této metodě je také nutno dodat, že je náročnější na potřebný počet pixelů (velikost nosiče zprávy) k ukrytí zprávy. Fibonacciho posloupnost je definována jako posloupnost přirozených čísel, začínající 0, 1, 1, 2, 3, 5, 8, 13, 21 atd., kde každé číslo je součtem dvou předchozích. Díky tomuto faktu může i u poměrně krátké zprávy dojít k obrovské náročnosti na velikost potřebného nosiče.
5.2
Kódování hlavičky zprávy
26
Poslední metoda, jak je možné zprávu do obrázku zakódovat, je do nejvíce významného bitu každého pixelu. Tato metoda je přesným opakem toho, jak aplikace funguje standardně. Přepsáním nejvýznamnějšího bitu docílíme toho, že v obrázku bude jasně patrný zásah do jeho struktury. Jednotlivé upravované pixely viditelně změní svou barvu a budou v obrázku velmi nápadné. Tato metoda tudíž nemá praktické využití. Jejím cílem je demonstrovat, co se stane s obrázkem po takto výrazném zásahu do jeho struktury. Tato demonstrace se může stát názornou pomůckou ve výuce, protože jasně ukazuje princip fungování algoritmu a jeho dopad na výsledný nosič.
5.2
Kódování hlavičky zprávy
Předchozí odstavce popisovaly postup, jakým se do obrázku kóduje samotná zpráva, kterou chceme ukrýt. Nebylo ale zmíněno, že do obrázku se před samotnou zprávou ukrývá ještě něco, a to něco je hlavička, která nese další potřebné informace. Tato hlavička není standardní součástí kódované zprávy, je uměle přidaná autorem aplikace a své uplatnění najde při dekódování zprávy z obrázku, ve kterém hraje klíčovou roli. Jak probíhá samotné dekódování zprávy z obrázku se dozvíme později, nyní se podíváme, jaké informace hlavička ukrývá, jak se do ní dostanou, a jaká je její vnitřní struktura. Hlavička se skládá ze dvou částí a celkově z devíti bytů. První část hlavičky má velikost 4 byty. Do této části se ukládá integerové číslo (typ integer má v jazyce Java velikost 4 byty), které se rovná velikosti bytového pole, které vznikne po převedení námi ukrývané zprávy na byty. Pokud tedy námi ukrývaná zpráva bude mít po převedení velikost například 50 bytů, do první části hlavičky se uloží číslo 50 v binárním vyjádření (00000000 00000000 00000000 00110010). Druhá část hlavičky má velikost 5 bytů a slouží pro kontrolu parity. Tato druhá půlka hlavičky má dvě části. První část slouží pro kontrolu délky zprávy a má velikost 8 bitů, tedy 1 byte. Obsah této části hlavičky je přímo závislý na předchozí části. Hodnota, která se zde ukládá, se rovná součtu prvních čtyř bytů hlavičky. Význam této části a hlavičky jako celku vůbec bude vysvětlen později, nyní autor opět uvede pro lepší představivost názorný příklad, jak taková hlavička může vypadat. Řekněme tedy, že po převedení zprávy, kterou chceme zakódovat do obrázku, vznikne pole o velikosti 5691 bytů (pro lepší představu autor úmyslně zvolil takto velké číslo, v praxi s největší pravděpodobností budeme vždy ukládat zprávy o podstatně menším rozsahu). První část hlavičky bude obsahovat číslo 5691 v binární podobě, tedy tyto hodnoty: 00000000 00000000 00010110 00111011 Poté proběhne součet těchto čtyř bytů a do první části druhé půlky hlavičky se uloží jeho výsledek:
5.3
Dekódování zprávy z nosiče informací
27
00000000 00000000 00010110 00111011 00101101 – výsledná hodnota Do druhé části druhé půlky hlavičky se ukládá kontrolní součet zprávy, tzv. CRC součet. Ten má velikost 4 byty. CRC je speciální hašovací funkce, která je použita k detekci chyb během přenosu dat, ukládání dat či při pokusu útočníka o úpravu zakódovaných dat. Princip CRC součtu je následující. Kontrolní součet je odeslán, či uložen společně s daty, při jejichž přenosu nebo uchovávání by mohlo dojít k chybě. Po převzetí dat je znovu nezávisle spočítán. Pokud je nezávisle spočítaný kontrolní součet odlišný od přeneseného nebo uloženého, je zřejmé že při přenosu nebo uchovávání došlo k chybě. Pokud je shodný, tak téměř jistě k žádné chybě nedošlo. V určitých případech je možné chybu pomocí CRC opravit. Uvedení konkrétního příkladu, jak CRC součet funguje, by znamenalo poměrně velkou náročnost na rozsah textu. Proto autor na tomto místě čtenáře odkáže na internetovou stránku, kde je uveden konkrétní názorný příklad. (CRC (kontrolní součet), 2003) V neposlední řadě je potřeba dodat, že hlavička se ukládá před samotnou zprávou, tedy do prvních pixelů obrázku. Princip kódování hlavičky do obrázku je naprosto stejný jako u následné zprávy, z toho důvodu jej autor nebude dále popisovat. Tímto autor seznámil čtenáře se strukturou hlavičky a s jejím možným obsahem. V následujících odstavcích se dozvíme informace o tom, jakým způsobem se zpráva dekóduje z obrázku. Na tomto místě také bude uveden konkrétní význam hlavičky, který je s dekódováním spojen.
5.3
Dekódování zprávy z nosiče informací
Metoda opětovného získání zprávy po zakódování do obrázku už je poměrně jednoduchou záležitostí. Funguje totiž na úplně stejném principu jako zakódování. Jak bylo uvedeno výše, námi kódovaná zpráva se postupně ukládá do nejméně významného bitu (nebo do nejvíce významného bitu, záleží na použité metodě kódování) každé barevné složky. Pro opětovné získání původní zprávy tedy pouze přečteme tyto bity a složíme z nich původní zprávu. Zajímavější částí procesu dekódování zprávy z nosiče je využití již zmíněné hlavičky. Aplikace defaultně nabízí možnost ukrývat bity naší zprávy postupně do jednotlivých pixelů každé barvené složky. Jelikož je ale možné ukládat bity obecně ob x složek či pomocí Fibonacciho posloupnosti, nastává při dekódování drobný problém, který právě řeší autorem vytvořená hlavička.
5.3
Dekódování zprávy z nosiče informací
28
U dekódování máme dvě možnosti, jak ho provést. Pokud víme, jakou sekvencí byla zpráva zakódována, zadáme ji ručně. Pokud ale sekvenci nevíme nebo jsme ji zapomněli, máme možnost vybrat automatické nalezení sekvence. V tomto momentě aplikace sama začne zkoušet různé sekvence zakódování, až nalezne tu správnou a předá nám požadovanou zprávu. Toto automatické nalezení sekvence je možné právě díky hlavičce, která je přidána před samotnou zprávu. Aplikace se podívá do hlavičky na délku zprávy, zkontroluje paritu a hledá tak dlouho sekvenci, až nalezne shodu. Po nalezení shody (integerové číslo z prvních čtyř bytů hlavičky musí odpovídat paritě) nám aplikace předá zprávu. Samozřejmě metoda dekódování zprávy na základě automatického hledání sekvence není nic jiného, než použití brute force (řešení problému či úlohy, při kterém se systematicky prochází celý prostor možných řešení problému), tudíž může být časově náročnější. Proto, pokud známe sekvenci, jakou byla zpráva zakódována, je lepší ji zadat ručně. Při dekódování je samozřejmě kontrolován i CRC součet samotné zprávy. Jak již bylo uvedeno, tato kontrola probíhá z důvodu detekce chyb, které nastaly během přenosu dat, ukládání dat, či po útoku osoby, která data změnila. Tato metoda ověření správnosti dat není zcela stoprocentní, přesto poskytuje jistou míru kontroly uložených informací.
6
IMPLEMENTACE A PROBLÉMY PŘI VYTVÁŘENÍ APLIKACE
6
29
Implementace a problémy při vytváření aplikace
V předchozích kapitolách jsme se dozvěděli, na jakém principu pracuje samotný algoritmus pro ukrývání zprávy a popsali jsme si aplikaci z pohledu uživatele. Následující odstavce budou věnovány popisu aplikace ze strany programátora. Jednotlivé části aplikace jsou rozděleny do tříd, které obsahují příslušné potřebné metody. Autor čtenáře nyní seznámí s těmito třídami a jejich nejdůležitějšími metodami, a také se dozvíme něco o problémech, které autora potkaly při vývoji samotné aplikace.
6.1
Vlastní implementace
Rozhraní Sequence Rozhraní Sequence je krátká část kódu, ale velice důležitá. Toto rozhraní říká, co by měly jednotlivé sekvence, kterými je možno zprávu zakódovat, implementovat za metody (získání další hodnoty sekvence, vrácení čtecí hlavy na začátek sekvence, atd.). Třída DefinedSequence, FibonacciSequence a StaticSequence Všechny tyto tři třídy jsou založeny na stejném principu. Implementují rozhraní Sequence a definují, jaké podmínky musí splňovat jednotlivé sekvence, kterými je možné zprávu do obrázku zakódovat. Každá z těchto tříd obsahuje metodu int next() (získání následníka sekvence), void reset() (vrácení čtecí hlavy na začátek sekvence), Boolean is limited() (určuje, zda je sekvence konečná) a Boolean is next available() (určuje, zda je dostupná další hodnota sekvence, čili jestli nastal konec sekvence nebo ne). Třída FileFilterImage a TxtFileFilter Tyto dvě třídy mají za úkol načtení externích souborů. První, tedy FileFilterImage, umožňuje načítání obrázků ve formátu PNG, do kterých se ukládá námi požadovaná zpráva. Třída TxtFileFilter pracuje na stejném principu jako předchozí s tím rozdílem, že umožňuje načítání souborů s příponou .txt, ve kterých má uživatel uloženou předem připravenou zprávu, kterou chce zakódovat. U obou tříd je využito standardních knihoven, které jazyk Java nabízí. Třída Header Tato třída slouží pro vytvoření hlavičky zprávy, kterou chceme zakódovat. Kontroluje délku zprávy, která je v hlavičce uložena, a také CRC součet. Obsahuje několik důležitých metod. Metoda create(byte [] message) má za úkol vytvoření samotné hlavičky z námi ukládané zprávy. Druhá metoda, tedy set header(byte [] header), provede samotné nastavení hlavičky pro kontrolu parity.
6.1
Vlastní implementace
30
Metody get message length() a check parity(Header header) slouží pro kontrolu délky zprávy. Prvně jmenovaná metoda má za úkol přečtení délky zprávy. Druhá jmenovaná metoda se postará o zkontrolování přečtené délky s paritou délky zprávy. Pokud přečtená délka odpovídá paritě, metoda vrací hodnotu true. Poslední významná metoda, tedy check crc(Header header,byte[] message), slouží pro kontrolu CRC zprávy. Třída ByteReaderWriter Aplikace umožňuje ukládat informace do nejméně významného bitu i do nejvýznamnějšího bitu jednotlivých složek pixelů. Tento fakt je umožněn právě touto třídou. Obsahuje metody, které nám dovolují ukládat naši zprávu i do nejvýznamnějšího bitu nosiče informací a tudíž využívat i tuto demonstrativní metodu kódování. Třída ByteEncoder Stará se o zakódování zprávy do obrázku. Vezme zprávu, zjistí její velikost, vytvoří příslušnou hlavičku (zde je uložena velikost zprávy a příslušný parity byte pro kontrolu), a poté zprávu i s vytvořenou hlavičkou uloží do nosiče. Obsahuje dvě důležité metody. Metoda encode data(byte[] message) nastavuje, jakým způsobem se data budou kódovat. V našem případě byl využit algoritmus LSB, tudíž nastaví ukládání bitů naší zprávy do nejméně významného bitu nosiče. Zároveň tato metoda kontroluje, zda je nosič zprávy dostatečně velký na to, aby pojal celou naši zprávu. Druhá metoda, tedy hide message in data(byte [] message, byte [] data), se stará o samotné zakódování naší zprávy včetně hlavičky (tato metoda ji vytvoří) do obrázku, a to podle zvolené sekvence. Třída ByteDecoder Účelem této třídy je samotné dekódování zprávy z obrázku. Třída načte data, ze kterých má opětovně získat skrytou informaci. Zkontroluje parity byte a CRC součet. Pokud parity byte odpovídá délce uložené zprávy a souhlasí i CRC, začne z obrázku číst data a následně předá uživateli požadovanou zprávu. Třída obsahuje několik metod. Metoda find message len(), jak napovídá její název, má za úkol najít délku zprávy. Ta je určena na základě porovnání parity bytu s první částí hlavičky. Metoda guess sequence() je využita v případě, kdy uživatel požaduje dekódování na základě automatického nalezení správné sekvence. V tento moment je metoda opět díky parity bytu schopna nalézt správnou sekvenci a nastavit ji pro dekódování. Hlavními metodami této třídy jsou decode data(int len) a decode message from data(byte [] data). První zmíněná metoda má za úkol z nosiče získat potřebné bity, ve kterých je uložena naše zpráva a druhá jmenovaná metoda z těchto bitů vytvoří zprávu, srozumitelnou pro uživatele, tedy požadovanou posloupnost znaků.
6.1
Vlastní implementace
31
Třída ImageEncoder Třída ImageEncoder úzce spolupracuje s výše uvedenou třídou ByteEncoder. Tato třída vezme obrázek, do kterého chceme ukrývat zprávu. Vytvoří si jeho kopii a následně ho převede na pole bytů. V posledním kroku s pomocí třídy ByteEncoder do takto vzniklého obrázku uloží naši zprávu. O vytvoření kopie obrázku se stará metoda ImageEncoder(BufferedImage original,Sequence sequence), převedení obrázku na byty a následné zakódování zprávy má na starosti metoda encode message(String message). Třída ImageDecoder Stejně jako předchozí, i tato třída spolupracuje s jinou, konkrétně s třídou ByteDecoder. Hlavní funkcí této třídy je znovuzískání uložené zprávy. Hlavní roli v této třídě hraje metoda String decode message(), která využívá třídu ByteDecoder k tomu, aby z obrázku po jeho převedení na bytové pole znovu získala uloženou zprávu ve formě textu. Rozhraní LoggerListener a třída Logger V aplikaci je umístěno pole, které slouží pro výpis logů, jenž některé třídy produkují. Pokud chce některá třída zapsat o své aktivitě poznámku do logu, zavolá statickou metodu add message ve třídě Logger. Třída Logger pak předá zprávu tomu, kdo ji poslouchá (tomu, kdo implementuje interface LoggerListener a zařadí se k posluchačům metodou add listener). Třída ImagePanel Při načítání obrázku do aplikace se nám v okně zobrazí náhled načteného obrázku. Stejně tak se stane i při dekódování obrázku. Tento fakt umožňuje právě tato třída. Obsahuje metody, které vykreslují okno, do kterého se ukládá náhled obrázků. Třída PanelEncode, PanelDecode, PanelSettings, PanelHelp a PanelExit Tyto třídy se starají o grafickou stránku aplikace. Obsahují velké množství metod, které vykreslují jednotlivé prvky aplikace. Každé tlačítko a vůbec každý prvek umístěný v aplikaci, má zde svojí metodu, která umožňuje jeho použití. Třída FrameHow Třída FrameHow má na starosti zprovoznění funkce aplikace, kterou autor nazval nápověda. Stejně, jako předchozí dvě třídy, obsahuje metody, které umožňují vykreslení jednotlivých prvků, jenž jsou v nápovědě obsaženy.
6.2
Problémy při vytváření aplikace
32
Třída Utils Aplikace obsahuje některé obecné metody, které programátorovi výrazně ulehčují práci. Právě tyto metody jsou obsaženy v třídě Utils. Najdeme zde například metodu String ready file(File file), která převádí soubor na String, metodu getExtension(File f), která vrací příponu souboru nebo metodu String print binary(byte [] message), která převádí bytové pole na String. Třída MainW Toto je hlavní třída celé aplikace. Obsahuje sadu metod, které umožňují spojení všech tříd, jenž aplikace implementuje a jejich uvedení do provozu. Bez této třídy by aplikace byla nepoužitelná, respektive by ani nešla spustit. Třída samozřejmě obsahuje metodu main, tedy hlavní metodu celé aplikace.
6.2
Problémy při vytváření aplikace
Vytváření jakéhokoli softwaru s sebou vždy nese určité problémy, které je potřeba během vývoje řešit. I sebelepší programátor občas při vytváření kódu narazí na menší či větší problémy, jenž je potřeba nějakým způsobem vyřešit a nejinak tomu bylo i v případě předkládané aplikace. Aplikace byla vytvářena v prostředí operačního systému UNIX. Jak již bylo uvedeno, při vytváření byl použit programovací jazyk Java. Jeho výhoda spočívá v tom, že je multiplatformní a tedy aplikace v něm napsané fungují jak pod systémem UNIX, tak pod systémem Windows. Autor práce s tímto faktem stoprocentně počítal, což se ukázalo jako chyba. Během prvních fází žádný problém nenastal. Aplikace dělala to, co měla. De facto ani neměl kde vzniknout nějaký závažný problém ve fungování pod různými systémy. Zádrhel nastal ve chvíli, kdy byla aplikace vesměs hotová a autor testoval její funkčnost při samotném ukládání zprávy do obrázku a jejím opětovném vytáhnutí. V systému UNIX se aplikace chovala tak jak měla, žádný problém nenastal. Zpráva se bez problému zakódovala a dekódovala. Problém nastal při testování funkčnosti pod systémem Windows. Autor práce načetl obrázek bez problému. Poté zadal text, který má být ukryt a dal zakódovat. Stále se nevyskytoval žádný náznak potíží. Nakonec vyzkoušel její opětovné dekódování a problém byl na světě. Aplikace v tomto momentě hlásila, že nesedí sekvence, jakou byla zpráva zakódována, ať už byla zadána staticky ručně, či byla zvolena metoda automatického nalezení sekvence. Autor práce pro jistotu vyzkoušel funkčnost na různých počítačích s různými verzemi operačního systému Windows, ale výsledek byl všude stejný.
6.2
Problémy při vytváření aplikace
33
Autorovi trvalo nekonečné hodiny než přišel na řešení, respektive než se mu ho podařilo najít na internetu. Aplikace při dekódování zprávy pracovala s originálním obrázkem, do kterého byla ukryta. V tomto nevinném faktu byl zásadní problém. Systém Windows zřejmě v tomto vidí nějaký zádrhel. Autor práce naštěstí nebyl první, kdo musel tento problém řešit a tudíž nalezl řešení, které vyčetl na internetu. Problém byl vyřešen tak, že při dekódování aplikace nepracuje se samotným originálním obrázkem, ve kterém je zpráva uložena, ale udělá si jeho kopii. Dále pak pracuje s touto kopií a zprávu získá z ní. Po aplikaci metody, která toto řeší, autor práce znovu otestoval funkčnost v operačním systému Windows. Toto řešení skutečně zabralo a aplikace už byla funkční jak pod systémem UNIX, tak pod systémem Windows. Druhý větší problém, který autor musel řešit, byl vykreslení panelů pro náhled načtených obrázků. Aplikace byla vytvářena ve vývojovém nástroji Netbeans. Tento nástroj umožňuje vkládat předem připravené grafické prvky, které už tudíž programátor nemusí programovat ručně. Autor práce se přirozeně pokoušel tohoto faktu využít a ušetřit si tak práci. Ze zdánlivě jednoduché záležitosti se ale vyklubal problém, jehož vyřešení autorovi zabralo nemálo času. Autor práce tedy použil nástrojů, které Netbeans nabízí a umístil do své aplikace předem připravené panely pro načtení obrázku v domnění, že je všechno v pořádku. Při spuštění aplikace ale došlo k problému. Náhledy obrázku se nezobrazovaly korektně, respektive se nezobrazovaly vůbec. Autor práce netušil, kde je problém a zabralo mu poměrně dlouhou dobu, než našel řešení. Jako pomocník opět posloužil všemocný nástroj Google. Po nekonečných desítkách minut hledání na internetu autor přišel na to, kde je problém. Ten se nakonec ukázal být v samotném nástroji Netbeans. Netbeans z nějakého důvodu nedokázal vykreslit všechny prvky korektně, tak jak by měl. Jinak řečeno, špatně je umisťoval. Autor tento problém vyřešil tak, že panely pro načtení obrázků musel napsat ručně, bez použití předem připravených. Po ručním napsání panelů (třída ImagePanel) byl problém odstraněn a aplikace vykreslovala obrázky korektně.
7
OVLÁDÁNÍ APLIKACE
7
34
Ovládání aplikace
Předchozí kapitola práce popisovala, jakým způsobem pracuje algoritmus použitý pro ukrývání textu do obrázku. Následující odstavce budou věnovány samotné implementaci, to znamená jakémusi pohledu na výslednou aplikace ze strany uživatele. Naprostou nutností bylo pro autora vytvoření grafického prostředí. Aplikace bez grafického prostředí jsou pro běžného uživatele nepohodlné a raději používá ty, které ho nabízí aspoň v jednoduché podobě. Autor práce vytvořil jednoduché a přehledné grafické prostředí, které ulehčuje práci se samotnou aplikací. Program je rozdělen do pěti částí, dalo by se říci do pěti oken, které budou popsány v následujících řádcích. Každé okno navíc obsahuje stručný popis toho, k čemu v aplikaci slouží. Než se uživatel pustí do samotného kódování zprávy, musí udělat jeden důležitý krok, a to v záložce settings zvolit metodu kódování. Defaultně je aplikace nastavena tak, že zprávu kóduje i dekóduje do nejméně významného bitu každého pixelu obrázku. V záložce settings je ale možné nastavit, aby aplikace zprávu kódovala do nejvýznamnějšího bitu jednotlivých pixelů (demonstrační metoda fungování aplikace). V této záložce je také možné zvolit, do jaké složky se uloží výsledný obrázek nesoucí ukryté informace a jaký bude jeho název.
7.1
Kódování zprávy do obrázku
Prvním krokem při ukrývání textu do obrázku je výběr samotného textu a způsob jeho předání samotné aplikaci. Výběr textu je samozřejmě čistě na uživateli. Co se týče jeho předání aplikaci, máme dvě možnosti. První možností je zadat text ručně, a to přímo do předem připraveného pole, které je k tomu určené. Pokud by se uživateli nelíbilo zadávat text ručně a má ho předem připravený, má možnost načtení souboru z disku či jiného média, které je připojeno k počítači. Aplikace podporuje načtení souboru s příponou .txt. Dalším krokem je vybrání způsobu, jakým se požadované informace budou ukrývat do obrázku. Jak již bylo uvedeno, aplikace nabízí dvě možnosti. První možností je nastavit ukládání pomocí statické sekvence. V tomto případě se logicky všechny bity naší zprávy budou ukládat staticky do jednotlivých složek pixelů. Sekvenci je ale možné nastavit tak, že se budou přepisovat všechny složky každého pixelu v pořadí, v jakém za sebou následují, a nebo máme možnost nastavit kódování obecně ob x složek. Defaultně je aplikace nastavena tak, aby jednotlivé bity zprávy ukládala do všech složek pixelů jak jdou za sebou. Druhou možností, kterou můžeme nastavit, je ukládání jednotlivých bitů zprávy pomocí Fibonacciho sekvence. Na jakém principu funguje Fibonacciho sekvence již bylo uvedeno v předchozí kapitole, stejně jako výhody a nevýhody jednotlivých způsobů kódování, proto se o tomto tématu autor nebude dále zmiňovat.
7.2
Dekódování zprávy z obrázku
35
Třetím krokem, který je potřeba udělat, je výběr samotného nosiče zprávy, tedy obrázku, do kterého chceme kódovat. Jediným podporovaným formátem, jak již opět bylo zmíněno, je grafický formát PNG. Po kliknutí na možnost vybrat PNG obrázek, nám vyskočí velice podobné okno jako při výběru textového souboru, pokud vstupní zprávu načítáme z disku. Po úspěšném výběru obrázku pro ukrytí zprávy se nám tento obrázek zobrazí v okně aplikace pro lepší přehled, co si vlastně uživatel vybral za nosič a jak tento nosič vypadá před samotným ukrytím zprávy. Posledním krokem, který nám zbývá k úspěšnému zakódování zprávy do obrázku, je stisknutí samotného tlačítka pro zakódování. V momentě, kdy takto uživatel učiní, proběhne jako první výpočet. Aplikace v rychlosti vypočítá, zda je námi zvolený obrázek pro ukrytí zprávy dostatečně velký na to, aby se do něj zpráva vešla. Pokud tomu tak není, aplikace tuto skutečnost oznámí uživateli. V tomto případě máme dvě možnosti, jak postupovat dále. První možností je zkrácení zprávy, kterou chceme zakódovat. To ale samozřejmě v některých případech nemusí být možné, takže je praktičtější varianta druhá. Tou je výběr většího obrázku, který nám poskytne více prostoru pro ukrytí zprávy. Pokud nenastane výše uvedený případ a nosič zprávy je dostatečně velký, proběhne samotné zakódování. Výsledný obrázek, který vznikne po zakódování zprávy, se nám opět pro lepší přehled zobrazí vedle původního obrázku. Uživatel tedy může okamžitě vidět rozdíl mezi původním obrázkem a nově vzniklým nosičem. Oba dva obrázky jsou ale kvůli rozměrům samotné aplikace zmenšeny, tudíž drobné rozdíly zřejmě budou nepostřehnutelné. Pro podrobné prohlédnutí či porovnání obou obrázků je potřeba otevřít je například v některé z aplikací pro prohlížení obrázků, které standardně nabízí jednotlivé operační systémy. V neposlední řadě je potřeba dodat, že v záložce settings je možné nastavit adresář, kam se výsledný obrázek uloží a jaký bude mít tento nově vzniklý obrázek název. Posledním prvkem, který je umístěn v části aplikace pro kódování zprávy, je výpis operací probíhajících při samotném ukrývání zprávy. Tato část je spíše informativní, přesto zde lze najít několik zajímavých věcí. Uživatel se tu například dozví, jakou sekvenci zvolil pro zakódování zprávy, jak vypadá parity byte a kam se uloží výsledný obrázek s ukrytou zprávou.
7.2
Dekódování zprávy z obrázku
Potřebné prvky pro dekódování zprávy z obrázku nalezneme ve druhé záložce aplikace. Mezi jednotlivými záložkami můžeme samozřejmě volně přepínat. Pokud zpráva byla zakódována pomocí metody ukrývání do nejvýznamnějšího bitu, je potřeba v záložce settings tuto variantu nastavit. Poté už uživatel může přistoupit k samotnému dekódování zprávy.
7.3
Nápověda a ukončení aplikace
36
Samotné dekódování zprávy je pro uživatele aplikace ještě jednodušší, než její zakódování. Pomocí příslušného tlačítka má uživatel možnost vybrat z disku obrázek, ze kterého chce uloženou zprávu zpět získat. Po úspěšném načtení se obrázek zobrazí na příslušném místě v okně aplikace. Je to z toho důvodu, aby uživatel stále měl přehled o tom, se kterým obrázkem to vlastně pracuje. Obrázek je samozřejmě opět zmenšen, aby odpovídal velikosti okna aplikace Další krok spočívá ve zvolení sekvence, kterou byla zpráva do obrázku zakódována. Zde má uživatel celkem tři možnosti. První možností je ruční zadání statické sekvence. Této možnosti je vhodné využít tehdy, pokud uživatel zná sekvenci, jakou byla zpráva zakódována. Pokud by zadal sekvenci špatně, aplikace vyhodí chybovou hlášku, že zadaná sekvence není správná a uživatel ji bude muset zadat znovu. Druhou možností je zadat dekódování pomocí Fibonacciho sekvence. Princip je stejný jako v předchozím případě. Pokud zpráva byla zakódována pomocí této sekvence, aplikace nám předá výsledek, v opačném případě vyhodí chybovou hlášku. Poslední možnost dekódování je univerzální. Její přednost spočívá v tom, že si způsob, jakým byla zpráva zakódována, najde sám a podle toho nastaví příslušnou sekvenci. Tato varianta je vhodná tehdy, pokud kódovací sekvenci neznáme a nebo pokud se nám ji z jakéhokoli důvodu nechce zadávat ručně. Pokud se nám podaří úspěšně načíst obrázek, zvolit příslušnou sekvenci dekódování, či nechat na aplikaci, ať si ji najde sama, v okně pod obrázkem se nám objeví zpráva, která byla do obrázku zakódována a uživatelem opětovně požadována. Konečně posledním prvkem v této části aplikace je, stejně jako u kódování, výpis operací, které byly během dekódování provedeny. Najdeme zde především informace o hledání správné sekvence použité při zakódovaní zprávy a nastavení této sekvence při samotném dekódování.
7.3
Nápověda a ukončení aplikace
Ve čtvrté záložce aplikace nalezneme nápovědu. Na tomto místě se uživatel dozví základní informace o aplikaci. Je zde také umístěno tlačítko, kterým uživatel může spustit grafickou část nápovědy, kde se dozví, jak vlastně samotný algoritmus ukrývá námi požadovanou zprávu do obrázku. V několika krocích je na tomto místě graficky vysvětleno, jak algoritmus pracuje. Tato část aplikace může najít své uplatnění jako demonstrační pomůcka při výuce předmětu Komprimace dat a kryptologie na naší univerzitě nebo jako názorná ukázka pro běžného uživatele, co vlastně algoritmus s daným obrázkem během kódování provádí. V poslední, tedy páté záložce aplikace, je umístěno jediné tlačítko, které slouží pro ukončení aplikace.
8
DISKUSE A ZHODNOCENÍ ŘEŠENÍ
8 8.1
37
Diskuse a zhodnocení řešení Diskuse
V kapitole věnované pojmu steganografie se autor zmiňoval o již existujících programech, které pracují na stejném či podobném principu, jako předkládaná aplikace. Po úspěšném vytvoření a odladění aplikace má autor práce nyní možnost porovnat svoje dílo právě s těmito, již existujícími aplikacemi. Následující odstavce tedy budou věnovány porovnání autorem vytvořené aplikace s nejznámějšími již existujícími řešeními, která je možno získat na internetu. Prvním kritériem, které se nabízí pro porovnání, je podpora operačních systémů. Autorova aplikace v tomto faktu, v jistém smyslu, vítězí nad ostatními, již existujícími. Je napsána v jazyce Java, který umožňuje běh v systému UNIX i Windows. Jediná aplikace ze čtveřice nejznámějších (StegHide, BitCrypt, Outguess a Hide in Picture), která umožňuje běh v systému UNIX i Windows, je StegHide. Přesto je autorova aplikace lepší v tom, že pro spuštění na dvou různých systémech nevyžaduje dvě různé verze aplikace. Program StegHide sice podporuje dva různé operační systémy, ovšem pro každý z nich je potřeba stáhnout jinou verzi aplikace, což je poněkud nepraktické. Co se týče zbylých aplikací, BitCrypt a Hide in Picture, jsou napsány pro operační systém Windows, Outguess pro UNIX. Co se týče množství podporovaných formátů, do kterých jsou ukládána samotná data, zde se prozatím autorova aplikace nemůže rovnat ostatním. Nejširší podporu formátů nabízí produkt StegHide. Jeho výhodou je to, že kromě grafických formátů podporuje i audio nahrávky, v čemž nemá konkurenci. Cílem autorovy práce ale nebylo vytvořit aplikaci pro podporu velkého množství formátů, nýbrž u jednoho vybraného formátu jasně demonstrovat fungování zvoleného algoritmu. Z tohoto důvodu autor nepovažuje šířku podporovaných formátů za klíčový faktor a nevidí v tomto faktu výrazný handicap. Další kritérium pro porovnání je možné vidět v datech, která je možno ukrývat. Zde vítězí aplikace StegHide a Hide in Picture, které umožňují ukrývání obecně jakýchkoli dat. Programy BitCrypt a Outguess jsou určeny pro ukrývání textových informací. Autorova aplikace umožňuje, stejně jako u posledních dvou jmenovaných, ukrývat informace pouze textového charakteru. Uživatel je tím sice ochuzen o možnost ukrývání například videa do obrázku, na druhou stranu ale nemusí řešit problém s velikostí nosiče, který by musel být podstatně větší. Každá aplikace používá některou z metod, pomocí které kontroluje správnost přenesených či uložených dat. V tomto ohledu je nejlépe vybavena aplikace BitCrypt, která na tuto kontrolu používá hashovací funkce. Autorova aplikace, stejně jako StegHide a Hide in Picture, využívá pro kontrolu CRC součet. Kontrola pomocí CRC součtu sice není tak účinná jako některé hashovací funkce, přesto určitou míru kontroly poskytuje a je pro daný účel zcela postačující. Jakou formu kontroly dat používá aplikace Outguess, se autorovi zjistit nepodařilo.
8.2
Zhodnocení aplikace
38
Skoro všechny porovnávané aplikace jsou dostupné i se zdrojovým kódem, autorova není výjimkou. Jedinou aplikací, která není dostupná i se zdrojovým kódem, je Hide in Picture, a v tomto ohledu výrazně zaostává za ostatními. Podle subjektivního hodnocení autora práce má jeho aplikace oproti ostatním jednu velkou výhodu, a to nejlépe zpracované grafické prostředí. Aplikace nabízí jednoduché a intuitivní prostředí, které umožňuje lehké ovládání aplikace. Oproti již existujícím řešením jsou prvky v aplikaci uspořádány tak, že na sebe navazují, čímž umožní ovládání aplikace i začátečníkům v oblasti práce s PC. Co se týče ostatních aplikací, ty mají grafické zpracování horší a u některých zcela chybí (Outguess). Autorova aplikace obsahuje jednu funkci, kterou se stává naprosto výjimečnou oproti ostatním. Obsahuje sice jednoduché, ale grafické znázornění toho, co algoritmus provádí s ukládaným textem při kódování do obrázku a jakým způsobem se mění struktura samotného nosiče. Žádná jiná aplikace podobnou funkci nenabízí a nemůže v tomto ohledu konkurovat aplikaci autora práce. Jak je z předchozích odstavců patrné, autorova aplikace již nyní může nabídnout prvky, díky kterým je lepší než již existující řešení. Samozřejmě má i svoje slabší stránky oproti konkurenci, na kterých by bylo možné zapracovat. Srovnání aplikací je pro autora dobrým vodítkem k tomu, jak svou aplikaci vylepšit tak, aby minimalizovala své slabé stránky a stala se v budoucnu ještě lepší.
8.2
Zhodnocení aplikace
Autor práce za jeden z klíčových prvků, které měla aplikace splňovat, považoval funkčnost pod systémem UNIX i pod systémem Windows. Z tohoto důvodu bylo využito programovacího jazyku Java, který je multiplatformní a podařilo se vytvořit aplikaci pro ukrývání textu do obrázku, jenž je funkční jak pod systémem UNIX, tak pod systémem Windows. Jako podporovaný formát pro ukrývání informace byl zvolen formát PNG. Je označován jako nástupce GIFu, a v současnosti získává čím dál více na oblibě jak mezi běžnými uživateli, tak mezi odborníky přes počítačovou grafiku. Narůstající oblíbenost tohoto formátu byla jedním z důvodu, proč si autor vybral právě tento. Načítat text, který chceme do obrázku uložit, můžeme dvěma způsoby. První možností je zadat text ručně. Pokud máme text předem připravený, je možné ho načíst ze souboru. Aplikace podporuje načtení souboru s příponou .txt. Jednou z největších předností předkládané aplikace je její jednoduché a přehledné grafické prostředí. Je členěna do několika oken, ve kterých uživatel najde vše potřebné k tomu, aby dokázal svou zprávu ukrýt do obrázku a zároveň se i dozvěděl základní informace o programu, které jsou uvedeny v nápovědě. Ovládání je intuitivní a aplikace neobsahuje žádné zbytečné prvky, tudíž s ovládáním nebude mít problém ani začátečník. Každé okno navíc obsahuje stručnou charakteristiku toho, co zde uživatel může s aplikací provést.
8.2
Zhodnocení aplikace
39
Aplikace nabízí několik možností, kterými je možno zprávu do obrázku zakódovat. Základní možností je použití statické sekvence, kdy se ukrývaná zpráva rovnoměrně kóduje do obrázku. Další zakomponované metody jsou především demonstrativní. Své uplatnění najdou hlavně ve výuce předmětu Komprimace dat a kryptologie na naší univerzitě, ale také běžnému uživateli názorným způsobem předvedou, na jakém principu aplikace funguje a co se stane s obrázkem po jeho úpravě. Použití Fibonacciho sekvence a sekvence, kdy se zpráva ukládá obecně ob x složek jednotlivých pixelů, názorně předvede, jakým způsobem se změní výsledný nosič zprávy po nerovnoměrném zásahu do jeho struktury. Na rozdíl od předchozích dvou metod, metoda ukládání textu do nejvýznamnějšího bitu obrázku jasně demonstruje, jak bude výsledný nosič vypadat po drastickém zásahu do jeho struktury. Tato metoda je v praxi naprosto nepoužitelná, ale splní svůj účel jako učební pomůcka. V neposlední řadě je potřeba dodat, že aplikace obsahuje i grafické znázornění toho, jak samotná aplikace pracuje. V samostatném okně je v sedmi krocích názorně vysvětleno, co se stane s naším textem, jak se ukládá do obrázku a jak výsledný nosič nakonec vypadá. Předkládaná aplikace by se samozřejmě dala vyvíjet i dále. První možnou úpravou by bylo přidání metody, která by zařídila zašifrování ukrývané zprávy. Tato metoda by zvýšila bezpečnost ukrývané zprávy. I po úspěšném odhalení přítomnosti zprávy v obrázku by byl problém s jejím dešifrováním. Druhé možné vylepšení se nabízí samo. Předkládaná bakalářská práce se zabývá ukrýváním textu pouze do jednoho zvoleného grafického formátu, autor práce si konkrétně zvolil formát PNG. Samozřejmě podpora více grafických formátů by byla další z možností, jak předkládanou aplikaci upravit k její vyšší efektivitě. S tím souvisí i rozšíření podpory formátů, které umožňují načtení zprávy pro zakódování z disku. Aplikace zatím podporuje pouze soubory s příponou .txt, rozšíření by bylo možné například o .doc.
9
9
ZÁVĚR
40
Závěr
Bakalářská práce se zabývá moderními steganografickými metodami, které nacházejí uplatnění v dnešní době výpočetní techniky. Zkoumá jejich principy a čtenáře podrobně seznamuje s metodou ukrývání informací do grafických souborových formátů. U těchto formátů provádí podrobnou analýzu z hlediska použitelnosti pro daný účel a na základě které je vybrán vhodný formát pro vytvoření aplikace, kterým se nakonec stal formát PNG. Výstupem bakalářské práce je vytvoření aplikace, která dokáže ukládat textové informace do vybraného grafického formátu, kterým se stal formát PNG, a tím je splněno zadání. Aplikace je obohacena o přehledné grafické prostředí, které ulehčuje ovládání. Součástí předkládané aplikace je i nápověda, která v několika krocích graficky znázorňuje, co se děje s naší zprávou při jejím samotném ukrývání. Podpora operačního systému UNIX a zároveň i Windows je dalším klíčovým prvkem. Kombinace přehledného grafického prostředí, podpory více operačních systémů a práce s grafickým formátem, PNG činí tuto aplikaci na trhu jedinečnou, protože žádná jiná tyto tři prvky skloubit nedokázala. Jednoduchost, přehlednost a demonstrativní metody fungování aplikace, které autor do své práce zakomponoval, činí tento nástroj pro ukládání textu do obrázku, případnou ideální pomůckou při výuce předmětu Komprimace dat a kryptologie na MZLU v Brně. V neposlední řadě je potřeba dodat, že program nebude zatížen žádnými licencemi, bude dostupný i se zdrojovým kódem a bude volně stažitelný z následujících internetových stránek: https://is.mendelu.cz/auth/lide/clovek.pl?id=21960;zalozka=7.
10
10
LITERATURA
41
Literatura
BMP [on-line]. 2009. [cit. 27. 11. 2009]. Dokument ve formátu HTML. Dostupný na Internetu: http://cs.wikipedia.org/wiki/BMP. CRC (kontrolní součet) [on-line]. 2003. [cit. 15. 12. 2009]. Dokument ve formátu HTML. Dostupný na Internetu: http://www.root.cz/clanky/crc-kontrolni-soucet/. GIF, JPEG a PNG - jak a kdy je použít? [on-line]. 2002. [cit. 24. 11. 2009]. Dokument ve formátu HTML. Dostupný na Internetu: http://interval.cz/clanky/gif-jpeg-a-png-jak-a-kdy-je-pouzit/. Grafický formát BMP - používaný a přitom neoblíbený [on-line]. 2006. [cit. 27. 11. 2009]. Dokument ve formátu HTML. Dostupný na Internetu: http://www.root.cz/clanky/ graficky-format-bmp-pouzivany-a-pritom-neoblibeny/. Grošek, O. – Porubský, Š. Šifrovanie - algoritmy, metódy, prax. Praha: Grada, 1982. 262 s. Nestůjte za dveřmi. ISBN 80-85424-62-2. JPEG - král rastrových grafických formátů? [on-line]. 2006. [cit. 26. 11. 2009]. Dokument ve formátu HTML. Dostupný na Internetu: http://www.root.cz/clanky/jpeg-kral-rastrovych-grafickych-formatu/. Kryptologie: Steganografie [on-line]. 2009. [cit. 21. 11. 2009]. Dokument ve formátu HTML. Dostupný na Internetu: http://www.specialista.info/ ?q=kryptologie-steganografie. Menezes, A. J. – Van Oorschot, P. C. – Vanstone, S. A. Handbook of applied cryptography. Boca Raton: CRC Press, 1997. 780 s. CRC Press series on discrete mathematics and its applications. ISBN 0-8493-8523-7. Murray, J. D. – Ryper, W. V. Encyklopedie grafických formátů. 2. vyd. Praha: Computer Press, 1997. 922 s. ISBN 80-7226-033-2. Piper, F. C. – Murphy, S. Kryptografie. 1. vyd. Praha: Dokořán, 2006. 157 s. Průvodce pro každého. ISBN 80-7363-074-5. PNG is not GIF [on-line]. 2006. [cit. 29. 11. 2009]. Dokument ve formátu HTML. Dostupný na Internetu: http://www.root.cz/clanky/png-is-not-gif/. Praktické základy Kryptologie a Steganografie [on-line]. 2004. [cit. 20. 11. 2009]. Dokument ve formátu HTML. Dostupný na Internetu: http://www.security-portal.cz/clanky/ praktické-základy-kryptologie-steganografie. Pravda a mýty o GIFu [on-line]. 2006. [cit. 25. 11. 2009]. Dokument ve formátu HTML. Dostupný na Internetu: http://www.root.cz/clanky/ pravda-a-myty-o-gifu/. Schneier, B. Applied Cryptography: Protocols, Algorithms, and Source Code in C. 2. vyd. New York: John Wiley & Sons, 1996. 758 s. ISBN 0-471-11709-9. Singh, S. Kniha kódů a šifer. Praha: Dokořán, 2003. 382 s. ISBN 80-86569-18-7.
10
LITERATURA
42
Steganografie [on-line]. [cit. 22. 11. 2009]. Dokument ve formátu HTML. Dostupný na Internetu: https://is.mendelu.cz/eknihovna/opory/ zobraz cast.pl?cast=7030. Žára, J. – Beneš, B. – Felkel, P. Moderní počítačová grafika. 1. vyd. Praha: Computer Press, 1998. 16 s. ISBN 80-7226-049-9.
11
43
PŘÍLOHY
11 11.1
Přílohy Příloha A – screenshoty aplikace
Obr. 1: Kódování zprávy do obrázku
11.1
Příloha A – screenshoty aplikace
Obr. 2: Dekódování zprávy z obrázku
44
11.1
Příloha A – screenshoty aplikace
Obr. 3: Možnosti nastavení aplikace
45
11.2
Příloha B – zdrojový kód aplikace (CD)
11.2
Příloha B – zdrojový kód aplikace (CD)
46