„Az összevisszaságban találd meg az egyszerűséget, a hangzavarban a harmóniát...”

Szteganográf alkalmazás készítése

„A szteganográfia a rejtett üzenetek oly módon történő létrehozásának tudománya és művészete, hogy az üzenet létezéséről csak a címzett tudjon.” - Wikipedia

AkrosztichonA fent definiált titkosításnak számtalan formája van, és a mindennapi életben teljes természetességgel használjuk is, anélkül, hogy akár tudnánk róla. Első példám a kártya-, vagy társasjátékok, ahol különböző jelzéseket leadva közölhetjük csapattársunkkal, hogy milyen lapokkal rendelkezünk, milyen lépéseket tervezünk. Az információ átadása teljesen nyílt, az asztal felett történik, mindenki látja, de a közlemény mégis csak az adó és vevő fél között nyer értelmet, mert az üzenetből kizárt személyek magáról a csatorna létezéséről és mikéntjéről nem tudnak. Még jobb példa talán azok a versek, ahol a sorok első betűit összeolvasva juthatunk új információhoz (Akrosztichon). Ott van a szemünk előtt, elolvassuk, mégis rejtve maradhat.

A digitális világban azért célszerű képeket alkalmazni erre a feladatra, mert rengeteg információt tartalmaznak, illetve a képek küldözgetése nagyon elterjedt. Egyetlen képpont négy adattal bír (RGBA, vagyis a piros-zöld-kék színösszetevők, és az alfa csatorna), úgyhogy egy viszonylag kis méretű képbe is temérdek információt bele lehet szuszakolni. Én most a színinformációk manipulálásán alapuló titkosítást készítettem, szokásomhoz hűen, teljesen minimalista szemlélettel. Az alkalmazás itt érhető el.

Ahhoz, hogy az eredeti képben ne okozzon nagy változást az üzenet belehelyezése, a színinformációk alsó, vagyis jelentéktelenebb félbájtját (nibble) kell felhasználni. A létrejövő képben zaj keletkezik, picivel el fog térni az eredetitől, de egy eleve zajos képnél ez észrevétlen marad. A tűéles, esetleg teljesen egyszínű képeknél ez a módszer láthatóan belerondít. Egy képpontot egy karakter letárolására használok. Vagyis képpontonként 12 bit áll rendelkezésemre, ami 4096 féle karaktert jelent. Az "ű" betű letárolása így nem akadály, de azért a kínai karakterek hanyagolandók.

Rejtett üzenet - ToldiAz össz tárolókapacitás könnyen kiszámítható a kép dimenzióiból egyszerű szorzás művelettel. Mivel a kép üzenetet nem tartalmazó része is értelmezhető üzenetként, ezért annak végét egy speciális flaggel jelölöm. Ez pár karakter, aminek hossza lejön a teljes mennyiségből. A nagyobb hatásfok érdekében a kódolandó adatot lehetne még előtte tömöríteni, de én most a legegyszerűbb módszert, illetve magát az elvet vázolom. Sőt, a tömörítés talán felesleges is. Hogy miért? Hiszitek vagy sem, de a mellékelt kis kép Arany János Toldiját rejti magában, mind a 12 énekkel, ami ~67000 karakter. Aki nem hiszi, töltse be a képet az alkalmazásba, ami vissza fogja azt kódolni.

A program működése roppant egyszerű. A beolvasáskor egy canvasra rárajzolom a képet, majd lekérem sorban a pixelek adatait. A színinformációk alsó fél bájtjának összeolvasztásával keletkezik egy karaktersorozat. Ha megtalálom benne a titkos üzenet meglétét jelző speciális karaktersorozatomat, akkor kiírom a szövegmezőbe az üzenetet. Íráskor ugyanez visszafelé: a megadott üzenetet karakterenként 12 bájton eltárolom az eredeti kép RGB infóinak alsó nibbléjében. Az üzenet utáni részeket a képen változatlanul hagyom. A komplett forráskód nyúlfarknyi, ha valaki kellően nagy monitorral rendelkezik, akkor még görgetnie sem kell az átbogarászásához.

Bármilyen (nem átlátszó) képet megadhatunk a programnak, a végeredmény mindig PNG formátumban keletkezik. Veszteséges tömörítés nem engedhető meg, mert azonnal odaveszne a behekkelt információ. Ugyanabba a képbe újabb és újabb üzenet belehelyezése nem jár további minőségromlással, mivel csak a zaj mikéntje változik, a felső bájtok, vagyis a lényeg mindvégig érintetlenül marad.

A technológia gyakorlati haszna kérdőjeles. De el tudnám ezt képzelni például webshopokban, a promókódok kiváltására. Nem egy hosszú számsort kellene megjegyezni vagy letárolni, hanem egy emberbarátabb kupon képet. A belekódolt kedvezményt a vásárláskor a kép feltöltésével lehetne érvényesíteni.