Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Tiedon piilotus kuvaan

Sivun loppuun

kayttaja-2791 [03.04.2006 23:22:41]

#

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);
?>

kayttaja-2791 [11.04.2006 10:04:25]

#

Hmm, miksei koodiväritys toimi?

Meitsi [12.04.2006 20:05:29]

#

Aika jännä idea :)

FooBat [13.04.2006 13:49:08]

#

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.

kayttaja-2791 [13.04.2006 19:02:42]

#

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.

T.M. [14.04.2006 12:42:59]

#

Olettekos muuten koskaan koittanut kryptata kuvaa normaalilla xor kryptauksella? (vai mikä lie olikaan) Joskus koitin, mutta kuvasta näki silti kaikki muodot helposti :S

FooBat [14.04.2006 16:04:45]

#

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/Block_cipher_modes_of_operation

msdos464 [17.04.2006 00:23:08]

#

Sangen nerokas :)

Hassua miten paljon dataa mahtuu pieneen kuvaan

ajv [20.04.2006 12:26:03]

#

Tolla sai nätin varmuuskopion inssityöstä windowsin taustakuvaksi :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta