4. Zkuste si s námi: praktické schovávání zprávy do obrázku
V minulé kapitole jsme si pověděli, co to steganografie je, a v téhle si nějaké schovávání jednoho obrázku do druhého vlastnoručně vyzkoušíme.
Příprava
Abychom si steganografii s obrázky mohli zkusit, potřebujeme si napřed stáhnout procvičovací prográmek (je určený pro počítače se systémem Windows, na kterých funguje prostředí Java) z téhle adresy: https://cbia.fi.muni.cz/files/software/mjuni/MjUNI-Steganografie.zip.
„Jako u každého stahování souborů z internetu nezapomeň nechat stažené soubory hned zkontrolovat antivirem. Pokud nevíš, jak na to, popros třeba rodiče.“
Pak je ještě potřeba na stažený soubor „MjUNI-Steganografie.zip“ kliknout ve správci souborů, najet na záložku pro rozbalení (u nás je zvýrazněná růžově), a tam kliknout na tlačítko pro rozbalení (na obrázku je zakroužkované).
Poté by mělo vyskočit okno, kde můžeme změnit adresář, do kterého chceme stažený prográmek rozbalit, a pak rozbalení potvrdíme zakroužkovaným tlačítkem:
A po chvilce rozbalování by mělo být hotovo.
Zbývá už jen vstoupit do vzniklé složky „ImageJ-Steganografie2021“, a tam dvojkliknutím spustit program „ImageJ.exe“:
Pokud všechno proběhlo správně, mělo by se nám po chvíli otevřít tohle malé okénko programu ImageJ:
První pokusy
Pojďme se tedy podívat na první ukázkový obrázek: v okénku ImageJ rozbalte menu „File“ a v něm klikněte na „Open…“.
Uvnitř složky „ImageJ-Steganografie2021“ bys měl(a) mít podsložku „images“, a v ní několik obrázkových souborů. Vyber obrázek „Vlajka+Pismeno.png“ a nech ho programem otevřít — ukáže se ti obrázek s českou vlajkou. Když budeš nad obrázkem přejíždět kurzorem myši (zatím neklikej, jen se nad obrázkem pohybuj), můžeš si všimnout, že se ti v hlavním okénku vypisují čísla. To jsou čísla, kterými počítač popisuje barvu toho pixelu, na který právě ukazuješ myší.
Na ukázce máme ta čísla zakroužkovaná a vidíme, že když myší ukazujeme na nějaký pixel v bílém pruhu vlajky, ukazují se nám čísla 255, 255, 255 — to znamená bílou, neboli „všechny tři základní složky (červená, zelená i modrá) rozsvícené naplno“. Když myší posuneme někam do červeného pruhu vlajky, uvidíme zase čísla 215, 21, 27 — jasně vidíme, že nejvyšší z těch tří čísel je to první, které určuje množství červené části barvy, takže jde opravdu o nějaký odstín červené.
Když ale budeme po obrázku vlajky ještě chvilku šmejdit myší, všimneme si něčeho zvláštního: v některých místech nemá obrázek takovou barvu, jakou bychom čekali — tady vidíme, že na tomhle místě není pixel dokonale bílý, ale jen skoro bílý, má hodnoty 254, 254, 254:
A podobně v červeném pruhu vlajky najdeme některé podezřelé pixely, které budou mít hodnoty 214, 20, 26, a i v modrém trojúhelníku jsou některé pixely, které se od svých sousedů nepatrně liší. Že by… že by někdo do tohohle obrázku schoval nějaký jiný právě tím způsobem, o kterém jsme si pověděli v předchozí kapitole?
Než postoupíme dál, zkus si schválně trochu zmapovat, jaký tvar má ta podezřelá oblast — kde je barva vlajky nepatrně odlišná od okolí? Okem to asi nepoznáš, ale když budeš po obrázku ještě chvíli přejíždět myší, přesná čísla barvy v okénku ImageJ ti pomůžou. Napovíme, že podezřelá oblast má tvar jednoho velkého tiskacího písmene.
„Já jsem lenoch, takže místo zdlouhavého zkoumání bych si ten obrázek „Vlajka+Pismeno.png“ otevřel v nějakém kreslicím programu, třeba v obyčejném Malování ve Windows, a zkusil bych použít nástroj kyblík barvy. Jestli je tam nějaký kus nepatrně odlišnou barvou, takhle bych ho měl odhalit taky.“
Odhalení
Abychom se teď podívali na řešení, rozbalte menu „Plugins“, v něm podmenu „Mjuni“ a v něm klikni na příkaz „Display Odd Pixels“:
Co se to stalo? „Display Odd Pixels“ znamená anglicky „zobraz liché pixely“, a příkaz dělá přesně to: tam, kde má složka pixelu (červená, zelená nebo modrá) lichou hodnotu, se daná část rozsvítí naplno, a tam, kde má složka pixelu sudou hodnotu, zůstane daná barevná složka zhasnutá. Takže třeba pixely, které měly barvu 255, 255, 255 nebo 215, 21, 27 budou po provedení příkazu bílé — protože všechny tři složky jsou liché, a tak se tam červená, zelená i modrá složka barvy rozsvítí. A naopak třeba pixely s barvou 214, 20, 26 se promění na černé, protože jsou všechna tři čísla sudá, a tak se tam všechny tři základní barvy zhasnou.
Ve výsledku bys tedy měl(a) vidět to samé písmeno, které se ti před chvílí podařilo zmapovat tím, že jsi obrázek zkoumal(a). Nezapomeň ale, že to zkoumání bylo možné jen díky tomu, že vlajka se skládala jen ze tří velkých ploch vyplněných vždy přesně tím stejným odstínem barvy — takže jsi mohl(a) poznat, které barvy jsou ty trochu jiné, podezřelé. Co když ale místo vlajky vezmeme nějakou obyčejnou fotku se spoustami různých odstínů? A co když ten schovaný obrázek nebude jednoduchý veliký obrázek jednoho písmene, ale něco složitějšího?
Zkus si postupně otevřít a příkazem „Display Odd Pixels“ prozkoumat další obrázky ze složky „images“. Můžeš třeba zkusit zjistit, o čem se zdá kocouru Vincentovi z fotky „Vincent+DruhaKocka.png“, nebo si přečíst pohádku schovanou do obrázku „Jablko+Pohadka.png“. V těch obrázcích, u nichž po příkazu „Display Odd Pixels“ dostaneš jen barevný chaos, nejspíš nic schované není.
Zkus si to sám
Schování jednoho obrázku do druhého si teď můžeš vyzkoušet i sám/sama: pomocí menu příkazu „File/Open…“ si otevři třeba obrázek „Tygr.png“, nech ho otevřený a pak ještě jednou tím samým příkazem otevři „Vincent.png“.
Zkusíme to teď udělat naopak a schováme Vincenta do obrázku tygra.
Abychom to mohli udělat, musíme napřed Vincenta převést do zjednodušených barev — když si vzpomeneš na závěr předchozí kapitoly, do jednoho pixelu naší tygří fotky můžeme schovat jenom velmi málo informace: „červená: 0 nebo 1, zelená: 0 nebo 1, modrá: 0 nebo 1“ — to nám stačí jen na osm různých barev.
Osmibarevná paleta
- černá (= červená 0, zelená 0, modrá 0)
- modrá (= červená 0, zelená 0, modrá 1)
- zelená (= červená 0, zelená 1, modrá 0)
- azurová (= červená 0, zelená 1, modrá 1)
- červená (= červená 1, zelená 0, modrá 0)
- purpurová (= červená 1, zelená 0, modrá 1)
- žlutá (= červená 1, zelená 1, modrá 0)
- bílá (= červená 1, zelená 1, modrá 1)
Pro převod do těchto barev tedy klikni na okno s Vincentem, a pak z menu v ImageJ okně vyber příkaz „Plugins/Mjuni/Dithering“:
Tímhle by se obrázek Vincenta měl převést do palety pouhých osmi různých barev — podobně, jako by ho namaloval třeba impresionistický malíř, který se nesnaží míchat přesné odstíny, ale tvoří obraz ze spousty malých teček v základních barvách.
„Spíš než impresionismus to připomíná pointilismus. To je tak, když o výtvarném umění necháš mluvit lidi od počítačů. Každopádně třeba takový Vincent van Gogh, jmenovec našeho kocoura, se věnoval oběma těmto výtvarným směrům.“
Jako poslední krok pak použiješ příkaz „Plugins/Mjuni/Merge Images“:
V okénku, které se otevře, vyber jako hlavní obrázek „Tygr.png“ a jako obrázek ke schování „Vincent.png“, který jsme právě převedli do zjednodušených barev:
Po kliknutí na „OK“ se vytvoří nový obrázek nazvaný „Kombinace: Tygr.png a Vincent.png“, který si pak můžeme uložit pomocí příkazu „File/Save As/PNG…“.
Výsledek vypadá skoro stejně jako ten původní obrázek tygra, ale barvy pixelů v něm byly upravené na sudé nebo liché hodnoty tak, jak to bylo potřeba pro uložení schovávaného obrázku. Takže ve skutečnosti je v tom výsledném tygrovi schovaný Vincent, jak se můžeme přesvědčit příkazem „Plugins/Mjuni/Display Odd Pixels“, který jsme si vyzkoušeli před chvílí.
Můžeme si tedy zkusit hrát s dalšími obrázky a různě je kombinovat. Důležité je akorát vzít vždycky dva obrázky, které mají stejné rozměry, jinak by postup nefungoval — naše ukázkové obrázky mají všechny 720 × 720 pixelů, takže jde kombinovat kterékoliv dva z nich.