Kuvat koostuvat yksittäisistä pikseleistä, jotka koostuvat kolmen värin (punainen, vihreä, sininen) numeerisista arvoista. Yleisimmin palettina käytetään 24-bittistä palettia jossa jokaisella kolmella värillä on jokin sävy väliltä 0 - 255 (0 on musta, 255 valkoinen). Toisaalta taas yleisessä merkistössä (ASCII) yksi merkki voidaan ilmaista myös numeerisesti numerolla väliltä 0-255. Täten yhteen kuvan pikseliin voidaan pistää kolme merkkiä, jokaiseen värin kolmeen komponenttiin yksi merkki. Juuri tähän perustuu tämä "rajapinta". Se muuntaa merkkijonon kuvaresurssiksi (jonka sitten voi tulostaa vaikka imagepng-funktiolla), ja päinvastoin.
Taas vähän turhaa kikkailua, mutta mikäs tässä kun aikaa on ;)
funktiot.php
<?php //Tekee merkkijonosta kuvaresurssin //Jokainen pikseli sisältää kolme asciimerkkiä, jotka ovat siis ascii-merkkien numeroina pikselin RGB arvoissa function str_image_encode($sMerkkijono) { $iMerkkijono_pituus = strlen($sMerkkijono); //Määritellään tulevan kuvan korkeus ja leveys //Älä kysy lopullista periaatetta näille leveys/korkeussuhteille, en muista enään itsekään ;) $iKuvan_leveys = (int) ceil(pow($iMerkkijono_pituus, 0.5)); $iKuvan_korkeus = (int) ceil(ceil($iMerkkijono_pituus / 3) / $iKuvan_leveys); //exit("Debug: leveys, $iKuvan_leveys ; korkeus, $iKuvan_korkeus ; merkkijonopituus, $iMerkkijono_pituus"); $rKuva = imagecreatetruecolor($iKuvan_leveys, $iKuvan_korkeus); $rTaustaväri = imagecolorallocate($rKuva, 255, 255, 255); //Kuvan rivit lävitse for ($y = 0; $y < $iKuvan_korkeus; $y++) { //Kuvan sarakkeet lävitse for ($x = 0; $x < $iKuvan_leveys; $x++) { //Pikselin 3 väriä (3 merkkiä) lävitse for ($z = 0; $z < 3; $z++) { //Pistetään taulukkoon kolme merkkiä kerrallaan $iMerkkiOrd[$z] = ord($sMerkkijono[$iMerkkijonoPointer]); //MerkkijonoPointer siis muistaa missä merkissä ollaan menossa merkkijonon läpikäymisessä $iMerkkijonoPointer++; } //Haetaan näitä kolmea merkkiä vastaava väri $rKuvaväri = imagecolorallocate($rKuva, $iMerkkiOrd[0], $iMerkkiOrd[1], $iMerkkiOrd[2]); //Asetetaan kuvan pikseli imagesetpixel($rKuva, $x, $y, $rKuvaväri); } } return $rKuva; } //Tekee kuvaresurssista merkkijonon //Jokainen pikseli sisältää kolme asciimerkkiä, jotka ovat siis ascii-merkkien numeroina pikselin RGB arvoissa //Jos $bRaw on tosi niin kuvaan väkisinkin jäävät loput nollamerkitkin tulostetaan //(voi olla tarpeellinen esimerkiksi merkkijonoa pakattaessa) function str_image_decode($rKuva, $bRaw = false) { $iKuvan_leveys = imagesx($rKuva); $iKuvan_korkeus = imagesx($rKuva); //Kuvan rivit lävitse for ($y = 0; $y < $iKuvan_korkeus; $y++) { //Kuvan sarakkeet lävitse for ($x = 0; $x < $iKuvan_leveys; $x++) { //Haetaan väri $iRgb = @imagecolorat($rKuva, $x, $y); //Hakee väristä red-, green- ja blue-komponentit $sMerkkijono .= chr(($iRgb >> 16) & 0xFF); $sMerkkijono .= chr(($iRgb >> 8) & 0xFF); $sMerkkijono .= chr($iRgb & 0xFF); } } if ($bRaw) return $sMerkkijono; else return str_replace(chr(0), "", $sMerkkijono); } ?>
esimerkki.php
<?php require_once('funktiot.php'); //Otetaan esimerkkinä ohjelmointiputkan etusivu kuvana $sMerkkijono = file_get_contents("https://www.ohjelmointiputka.net/"); $rKuva = str_image_encode($sMerkkijono); header("Content-type: image/png"); imagepng($rKuva); ?>
Hmm, miksei koodiväritys toimi?
Aika jännä idea :)
Erilaiset teksti->kuva koodaukset ovat ihan kivoja.
Kokeiles vaikka seuraavaksi tehdä steganografia-ohjelma, jolla tekstiä voi piilottaa kuvaan. Yhden merkin voi piilottaa piilottaa yhteen pixeliin esim. siten, että jaat merkin 2-bitin osiin ja vähennät nämä arvot pikselin eri väriarvoista (alpha, punainen, vihreä, sininen). Värin arvo muuttuu niin vähän, eroa tuskin huomaa. Tekstin saa takaisin, kun vertaa muokattua kuvaa alkuperäiseen.
Tuollaista alunperin mietinkin, mutta lopulta päätin jättää sen vain teorian tasolle (toisinsanoen en jaksanut värkätä tätä asiaa enempää ;). Mutta tuollainen voisi olla ihan mielenkiintoinen tehdä kyllä.
Steganografiasta löytyi muuten ihan mielenkiintoista luettavaa hakukoneella, kiitos siitä termistä, en ole aiemmin kuullutkaan.
Olettekos muuten koskaan koittanut kryptata kuvaa normaalilla xor kryptauksella? (vai mikä lie olikaan) Joskus koitin, mutta kuvasta näki silti kaikki muodot helposti :S
lainaus:
Olettekos muuten koskaan koittanut kryptata kuvaa normaalilla xor kryptauksella? (vai mikä lie olikaan) Joskus koitin, mutta kuvasta näki silti kaikki muodot helposti :S
Tuo ei ole vain xor-kryptauksen ongelma, vaan myös joidenkin kehittyneempien salauksien triviaaliratkaisuilla tapahtuu tuollaista.
Esim. DES-salauksen ECB-moodi:
http://en.wikipedia.org/wiki/
Sangen nerokas :)
Hassua miten paljon dataa mahtuu pieneen kuvaan
Tolla sai nätin varmuuskopion inssityöstä windowsin taustakuvaksi :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.