Skjule hemmelig tekst i bilder (steganografi)
Steganografi er kunsten å skjule en melding inne i noe helt vanlig, slik at ingen ser at meldingen finnes. Denne guiden viser hvordan du legger hemmelig tekst inn i pikslene til et bilde og henter den ut igjen etterpå. Alt er gratis og skjer helt i nettleseren din, uten at en eneste fil forlater maskinen.
Slik fungerer det
Et digitalt bilde er bare et rutenett av piksler, og hver piksel har tre fargeverdier: rød, grønn og blå, hver fra 0 til 255. Hver verdi er lagret som et byte, altså åtte bit. Den siste biten i tallet kalles den minst signifikante biten (LSB), fordi den betyr aller minst for verdien.
Ta rødverdien 200. Binært er det 11001000. Endrer vi bare den siste biten, får vi 11001001, som er 201. Forskjellen mellom rød 200 og rød 201 er så liten at øyet ikke klarer å se den. Nettopp det utnytter steganografi: vi skriver meldingen vår, bit for bit, inn i disse siste bitene, og bildet ser helt uendret ut.
Meldingen blir først til tall. Bokstaven “H” er tegn nummer 72, som binært er 01001000. Hver av disse åtte bitene havner i den minst signifikante biten til én pikselkanal. Åtte kanaler senere er hele “H”-en skjult, og programmet går videre til neste bokstav. For å lese meldingen igjen samler dekoderen bare inn den siste biten fra kanal etter kanal og setter bitene sammen til bytes på nytt.
Hvor mye kan du skjule
Kapasiteten avhenger av hvor mange piksler bildet har, og hvor mange kanaler du bruker. Med bare rødkanalen får du én bit per piksel. Bruker du rød, grønn og blå sammen, får du tre bit per piksel, altså omtrent tre ganger så mye plass.
| Bildestørrelse | Bare rød | RGB (tre kanaler) |
|---|---|---|
| 100x100 px | ca. 1,2 KB | ca. 3,6 KB |
| 1280x720 px | ca. 115 KB | ca. 345 KB |
| 1920x1080 px | ca. 259 KB | ca. 778 KB |
Koderen vår lar deg velge mellom Rød, RGB og RGBA. Rød alene er mest diskret fordi du rører færrest verdier. RGB gir deg omtrent tre ganger kapasiteten, og RGBA legger til alfakanalen for enda litt mer plass. For korte meldinger holder rødkanalen med god margin.
Skjul en melding
Last opp et bilde, skriv teksten du vil gjemme, og klikk Kod. Verktøyet under gjør alt lokalt.
Fremgangsmåten er enkel. Last opp et bilde, skriv meldingen din, og velg eventuelt RGB hvis teksten er lang og trenger mer plass. Vil du ha et ekstra lag med beskyttelse, setter du et passord. Klikk Kod, og last ned resultatet.
Utdataen er alltid en PNG. Det er ikke tilfeldig. PNG er et tapsfritt format, som betyr at hver piksel lagres nøyaktig slik den er, inkludert de skjulte bitene. JPEG er derimot tapsbasert: det kaster bort detaljer for å gjøre filen mindre, og de detaljene er akkurat de minst signifikante bitene der meldingen din bor. En JPEG ville derfor ødelagt teksten.
Avslør en melding
For å lese en skjult melding trenger du bare selve PNG-filen.
Slipp PNG-en inn i dekoderen, så leser den ut den skjulte teksten med en gang. Var meldingen passordbeskyttet, skriver du inn passordet for å låse den opp. En detalj verdt å merke seg: dekoderen prøver automatisk mange varianter av LSB-steganografi, ikke bare det formatet koderen vår bruker. Den tester ulike kanaler (R, RGB, RGBA, samt bare grønn eller bare blå), både lengdeprefiks og null-terminering, og begge bitrekkefølgene (MSB og LSB). Valideringen er streng, slik at et helt vanlig bilde uten skjult tekst bare returnerer tomt i stedet for tilfeldig søppel.
Legg til et passord (kryptering)
Setter du et passord i koderen, blir meldingen kryptert med AES-256-GCM før den skrives inn i bildet. Passordet ditt blir ikke brukt direkte som nøkkel; det strekkes først med PBKDF2, som gjør det tregt og dyrt å gjette seg gjennom mange passord.
Effekten er at de skjulte bitene ser ut som ren tilfeldig støy for alle som ikke har passordet. Selv om noen skulle mistenke at bildet inneholder noe og trekke ut bitene, får de bare krypterte data uten mening. Et feil passord avslører heller ingenting, fordi GCM har en innebygd autentiseringstagg som avviser data som ikke stemmer.
Her er poenget: steganografi og kryptering løser to forskjellige problemer. Steganografi skjuler at det finnes en melding i det hele tatt. Kryptering gjør meldingen uleselig selv om noen finner den. Bruker du dem sammen, må en angriper både oppdage at noe er skjult og deretter knekke krypteringen. Det er langt sterkere enn hver av delene alene.
Grenser og vanlige feil
Teknikken er elegant, men den har klare grenser, og det er bedre å kjenne dem enn å bli overrasket.
Den fungerer bare på tapsfrie PNG-filer. Lagrer du bildet på nytt som JPEG, tar en skjermdump av det, eller kjører det gjennom et redigeringsprogram som komprimerer, forsvinner meldingen. De minst signifikante bitene er akkurat det slik behandling endrer først.
Vær også forsiktig med hvordan du deler filen. Mange chat-apper og sosiale nettverk komprimerer bilder på nytt automatisk når du laster dem opp, og da er meldingen borte når den kommer frem. Del PNG-en som en vanlig fil (for eksempel som vedlegg eller via en tjeneste som ikke rører filen), ikke gjennom en kanal som pakker den om.
Til slutt: dette er LSB-steganografi. Dekoderen er god på nettopp den familien av metoder, men den er ingen universell detektor. Skjuler noen data på en helt annen måte, for eksempel i DCT-koeffisientene inne i et JPEG-bilde, vil ikke dette verktøyet finne det.
Ofte stilte spørsmål
Er det privat? Ja. Alt kjører lokalt i nettleseren din via Canvas API. Bildet, teksten og et eventuelt passord lastes aldri opp noe sted, så ingen server ser dataene dine.
Kan jeg bruke hvilket som helst bilde? Du kan starte fra hvilket som helst bilde, men resultatet lagres alltid som PNG, siden meldingen bare overlever i et tapsfritt format. Større bilder rommer lengre meldinger; et lite bilde kan bli for trangt for mye tekst.
Ser det kodede bildet annerledes ut? Nei, ikke for det blotte øye. Vi endrer kun den minst signifikante biten i noen fargeverdier, som gir en forskjell på ett trinn av 256. Det er umulig å se i praksis.
Kan noen lese det uten passordet? Uten passord er teksten skjult, men ikke kryptert, så en som kjenner metoden kan trekke den ut. Setter du et passord, blir meldingen kryptert med AES-256-GCM, og da avslører verken uvedkommende eller et feil passord noe som helst.
Klar til å prøve? Skjul teksten din med Steganografi-koderen, og hent den ut igjen med Steganografi-dekoderen.