<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mind Unpacked &#187; LSB</title>
	<atom:link href="http://mindunpacked.com/tag/lsb/feed/" rel="self" type="application/rss+xml" />
	<link>http://mindunpacked.com</link>
	<description>informatica.elettronica.chimica.new stuff</description>
	<lastBuildDate>Tue, 22 Dec 2009 17:35:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
<link>http://mindunpacked.com</link>
<url>http://mindunpacked.com/wp-content/plugins/maxblogpress-favicon/icons/favicon-2.ico</url>
<title>Mind Unpacked</title>
</image>
		<item>
		<title>Steganografia in C++</title>
		<link>http://mindunpacked.com/2008/steganografia-in-c/</link>
		<comments>http://mindunpacked.com/2008/steganografia-in-c/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 19:13:21 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[LSB]]></category>
		<category><![CDATA[Steganografia]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=321</guid>
		<description><![CDATA[Su Mind Unpacked abbiamo gia&#8217; parlato di steganografia digitale in due precedenti articoli (Introduzione alla steganografia digitale e Algoritmi steganografici), oggi percio&#8217; discuteremo di un&#8217;implementazione in C++ dell&#8217;algoritmo LSB. L&#8217;algoritmo e&#8217; gia&#8217; stato trattato dal punto di vista teorico nei precedenti articoli, quindi non mi soffermero&#8217; piu&#8217; di tanto su di esso e passero&#8217; quasi [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Su Mind Unpacked abbiamo gia&#8217; parlato di <strong>steganografia</strong> digitale in due precedenti articoli (<a title="Introduzione alla steganografia digitale" href="http://mindunpacked.com/2008/introduzione-alla-steganografia-digitale/" target="_blank">Introduzione alla steganografia digitale</a> e <a title="Algoritmi steganografici" href="http://mindunpacked.com/2008/algoritmi-steganografici/" target="_blank">Algoritmi steganografici</a>), oggi percio&#8217; discuteremo di un&#8217;<strong>implementazione in C++ dell&#8217;algoritmo LSB</strong>. L&#8217;algoritmo e&#8217; gia&#8217; stato trattato dal punto di vista teorico nei precedenti articoli, quindi non mi soffermero&#8217; piu&#8217; di tanto su di esso e passero&#8217; quasi subito alla spiegazione del codice.</p>
<p><span id="more-321"></span></p>
<p style="text-align: justify">L&#8217;algoritmo <strong>LSB</strong> (least significat bit) mira a nascondere un messaggio in un contenitore (immagine, file audiom file video) modificando i bit meno significativi. Nel nostro caso creeremo un programma per <strong>nascondere file di testo all&#8217;interno di immagin</strong><strong>i</strong> bitmap. Ogni pixel della nostra immagine e&#8217; rappresentato da una terna di numeri che indicano le tre componenti RGB. Modificheremo il bit meno significativo di ogni componente di ogni pixel e lo adatteremo ai bit del nostro messaggio di testo. Il cambiamento che otteremo modificando solo il bit meno significativo sara&#8217; al massimo di una unita&#8217; e, di conseguenza, produrra&#8217; immagini all&#8217;apparenza identiche, poiche&#8217; un tale cambiamento non e&#8217; percepibile ad occhio nudo.</p>
<p style="text-align: justify">Il nostro programma e&#8217; sostanzialmente diviso in due parti: quella per nascondere il testo nell&#8217;immagine e quella per recuperarlo.</p>
<p style="text-align: justify"><strong>Steganografare un testo</strong></p>
<p style="text-align: justify">La prima parte del programma si occupera&#8217; di fare le seguenti operazioni:</p>
<ol>
<li style="text-align: justify">Leggere il messaggio da un file di testo</li>
<li>Calcolare il numero di pixels necessari ad occultare il messaggio nell&#8217;immagine ed accertarsi che l&#8217;immagine sia abbastanza grande da poterlo fare. Salvare in forma binaria il valore di ogni componente di questi pixels.</li>
<li>Modificare i bit meno significativi per adattarli a quelli del messaggio</li>
<li>Scrivere i nuovi bit su una nuova immagine apparentemente uguale alla prima, ma contenente il testo.</li>
</ol>
<p>Saltando il passo 1 (che spero chiunque sia capace di fare), passiamo al due:</p>
<pre class="brush: cpp;">
numbits = message.size()*8;  // La stringa message contiene il messaggio letto dal file
numpixels = (numbits%3 == 0 ? numbits/3 : (int)numbits/3 + 1);
numrows = (int)numpixels/img.TellWidth() + 1;
if (numrows &gt; img.TellHeight()) {
	cout &lt;&lt; &quot;Errore: il messaggio e' troppo lungo per essere contenuto in questa immagine.&quot; &lt;&lt; endl;
	exit(0);
}
for (int i = 0; i &lt; numrows; i++) {
	for (int j = 0; j &lt; img.TellWidth(); j++) {
		bits.push_back(bitset&lt;8&gt;((int)img(j, i)-&gt;Red));
		bits.push_back(bitset&lt;8&gt;((int)img(j, i)-&gt;Green));
		bits.push_back(bitset&lt;8&gt;((int)img(j, i)-&gt;Blue));
	}
}
</pre>
<p><center><script type="text/javascript">
heyos_ad_user = 11334;
heyos_ad_type = "G";
heyos_ad_format = "1";
heyos_color_border = "23292b";
heyos_color_bg = "23292b";
heyos_color_link = "FFFFFF";
heyos_color_text = "21b8ca";
heyos_color_url = "21b8ca";
</script>
<script type="text/javascript" src="http://admaster.heyos.com/core/bnr.js"></script></center></p>
<p>Il programma calcola il numero di bit e il numero di pixel necessari in base alla lunghezza del messaggio. Visto che ogni pixel puo&#8217; nascondere 3 bit, il numero di pixel viene calcolato semplicemente dividendo il numero di bit per 3 e arrotondando per eccesso nel caso di resto. numrows contiene invece il numero di righe dell&#8217;immagine che bisogna copiare in memoria. Se il numero di righe e&#8217; maggiore dell&#8217;altezza del&#8217;immagine il programma genera un errore poiche&#8217; l&#8217;immagine e&#8217; troppo piccola per contenere il messaggio. Dopo aver fatto cio&#8217;, salviamo i tutti i valori RGB dei pixel che ci servono in un array di bitset. bits e&#8217; un vettore (classe vector delle STL) di oggetti bitset, una classe della STL creata appositamente per gestire dati in forma binaria. La notazione bitset&lt;8&gt;(&#8230;) crea un oggetto bitset con 8 bit che assumono il valore dell&#8217;argomento che gli si passa tra parentesi. Visto che i valori RGB di un&#8217;immagine sono compresi tra 0 e 255 8 bit sono sufficienti.</p>
<pre class="brush: cpp;">
count = 0;
for (int i = 0; i &lt; message.size(); i++) {
	bitset&lt;8&gt; temp = bitset&lt;8&gt;(message[i]);
	for (int b = 7; b &gt;= 0; b--) {
		bits[count].set(0, temp[b]); // 0 e' l'indice del bit meno significativo; 		temp[b] e' il b-esimo bit della lettera che stiamo esaminando
		count++;
	}
}
</pre>
<p>Dopo aver salvato i valori in memoria, dobbiamo modificare il bit meno significativo di ogni elemento salvato per renderlo uguale a quello del nostro messaggio. Il codice qui sopra svolge questo compito: scorre ogni lettera del messaggio e crea un oggetto bitset contenente il valore di quella lettera in binario. Il ciclo innestato scorre tutti i bit della lettera e modifica i bit meno significativi dell&#8217;immagine in modo appropriato.</p>
<pre class="brush: cpp;">
for (int i = 0; i &lt; numrows; i++) {
	for (int j = 0; j &lt; img.TellWidth(); j++) {
		imgout(j, i)-&gt;Red = (int)bits[count++].to_ulong();
		imgout(j, i)-&gt;Green = (int)bits[count++].to_ulong();
		imgout(j, i)-&gt;Blue = (int)bits[count++].to_ulong();
	}
}
for (int i = numrows; i &lt; img.TellHeight(); i++) {
	for (int j = 0; j &lt; img.TellWidth(); j++) {
		imgout(j, i)-&gt;Red = img(j, i)-&gt;Red;
		imgout(j, i)-&gt;Green = img(j, i)-&gt;Green;
		imgout(j, i)-&gt;Blue = img(j, i)-&gt;Blue;
	}
}
imgout.WriteToFile(&quot;out.bmp&quot;);
</pre>
<p><center><script type="text/javascript">
heyos_ad_user = 11334;
heyos_ad_type = "G";
heyos_ad_format = "1";
heyos_color_border = "23292b";
heyos_color_bg = "23292b";
heyos_color_link = "FFFFFF";
heyos_color_text = "21b8ca";
heyos_color_url = "21b8ca";
</script>
<script type="text/javascript" src="http://admaster.heyos.com/core/bnr.js"></script></center></p>
<p>Una volta che i bit sono stati modificati in maniera corretta, dobbiamo solo riscriverli su una nuova immagine. Il primo ciclo scrive i bit contenenti il messaggio (la funzione to_ulong() converte un bitset nel suo valore decimale), mentre il secondo riscrive semplicemente i valori dei pixel che non sono stati modificati riprendendoli dall&#8217;immagine originale.</p>
<p><strong>Recuperare il testo steganografato</strong></p>
<p>La seconda parte del programma e&#8217; quella che, data in input un&#8217;immagine recupera il testo contenuto in essa. Un difetto del programma e&#8217; quello di richiedere la lunghezza del messaggio per poterlo estrarre: in realta&#8217; si potrebbe ovviare a questo problema in maniera piuttosto semplice (dopo vedremo come) ma per ora, bisognera&#8217; accontentarsi di andare a tentativi se non si conosce la lunghezza del messaggio completo.</p>
<p>La struttura di questa seconda parte ricalca quella della prima: dopo aver preso in input la lunghezza del messaggio ed aver calcolato in base ad essa il numero di pixel che sono stati modificati, il programma prende dall&#8217;immagine i valori delle componenti di questi pixel e li mette in un array di bitset. Un secondo ciclo:</p>
<pre class="brush: cpp;">
for (int i = 1; i &lt; numbits; i++) {
	temp.set(count, bits[i-1][0]);
	count--;
	if (count == -1) {
		count = 7;
		cout &lt;&lt; (char)temp.to_ulong();
	}
}
</pre>
<p>si occupa di prendere i bit meno significativi a gruppi di 8 e di stampare il corrispondente valore alfanumerico.</p>
<p><strong>Possibili miglioramenti</strong></p>
<p>Il programma in questa maniera e&#8217; piuttosto rudimentale, ecco alcuni possibili miglioramenti che potreste allenarvi a mettere in pratica:</p>
<ol>
<li>Evitare di dover richiedere la lunghezza quando bisogna estrarre un messaggio. Una possibilita&#8217; potrebbe essere quella di conservare i primi N bit meno significativi dell&#8217;immagine per salvare la lunghezza del messaggio e per estrarla al volo senza doverla richiedere all&#8217;utente. 10 bit permetterebbero, per esempio, di salvare un numero fino a 2<sup>10</sup> = 1024.</li>
<li>Introdurre la possibilita&#8217; di inserire una chiave. Una chiave potrebbe essere un numero intero N che indicherebbe al programma di modificare non tutti i pixel uno per uno ma di prendere 1 pixel ogni N. Questo ridurrebbe la capacita&#8217; dell&#8217;immagine di contenere messaggi ma renderebbe piu&#8217; difficile un&#8217;eventuale individuazione del messaggio.</li>
<li>Introdurre la possibilita&#8217; di crittografare un messaggio prima di steganografarlo per una maggiore sicurezza.</li>
</ol>
<p>Ecco il codice del programma: <a href="../../risorse/Stego.zip">Steganografia in C++</a>. Fa uso delle librerie EasyBMP per la gestione delle immagini presenti nell&#8217;archivio stesso.</p>
<p>Ciao!</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2008/steganografia-in-c/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Introduzione alla steganografia digitale</title>
		<link>http://mindunpacked.com/2008/introduzione-alla-steganografia-digitale/</link>
		<comments>http://mindunpacked.com/2008/introduzione-alla-steganografia-digitale/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 22:41:45 +0000</pubDate>
		<dc:creator>Marco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[LSB]]></category>
		<category><![CDATA[Steganografia]]></category>
		<category><![CDATA[Watermark]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=30</guid>
		<description><![CDATA[Introduzione
La parola steganografia significa letteralmente – in greco &#8211; “scrittura nascosta”, e questo vi potrebbe far pensare subito alla crittografia in quanto anche questa, in un certo senso, ha lo scopo di occultare dei messaggi. Tuttavia fra le due c&#8217;è una differenza sostanziale: mentre la crittografia si preoccupa di rendere un messaggio illeggibile agli occhi [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm;"><strong>Introduzione</strong></p>
<p style="text-align: justify;">La parola steganografia significa letteralmente – in greco &#8211; “scrittura nascosta”, e questo vi potrebbe far pensare subito alla crittografia in quanto anche questa, in un certo senso, ha lo scopo di occultare dei messaggi. Tuttavia fra le due c&#8217;è una differenza sostanziale: mentre la crittografia si preoccupa di rendere un messaggio illeggibile agli occhi di una persona non autorizzata, la steganografia fa in modo che una persona non autorizzata non si renda nemmeno conto dell&#8217;esistenza del messaggio in questione, malgrado esso sia totalmente in chiaro. La fusione delle due tecniche, cioè steganografare un messaggio criptato, è un ottima soluzione per aumentare il livello di sicurezza.<span id="more-30"></span></p>
<p style="margin-bottom: 0cm; text-align: justify;">La steganografia è piuttosto antica come tecnica, e solo ultimamente è stata introdotta in campo digitale. Gli stessi geroglifici egiziani possono essere considerati una sorta di messaggi steganografati, in quanto potrebbero essere dei semplici disegni per chi non ne conosce il significato, ma al contrario fonte di molte informazioni per chi sa decifrarli. A parte questo esempio, i fautori di questa tecnica furono proprio i greci che incidevano il testo su delle tavolette per poi ricoprirle di cera, e quindi occultare il testo. Lo sviluppo concreto della tecnica, tuttavia, fu opera di <a href="http://it.wikipedia.org/wiki/Johannes_Trithemius" target="_blank">Johannes Trithemius</a> (pseudonimo di <em><span style="font-style: normal;">Johann</span></em><span style="font-style: normal;"> Heidenberg)</span> che inventò quello che oggi è conosciuto a tutti come <strong>acrostico</strong>, ovvero una frase che si forma mettendo insieme delle parole – in modo più o meno sensato &#8211; le cui iniziali vadano a comporre un ulteriore messaggio. Questa tecnica fu comunque perfezionata da Heidenberg stesso, seguendo alcuni piccoli accorgimenti. Più recentemente, ed in particolare durante la seconda guerra mondiale, i nazisti usavano la tecnica dei micropunti fotografici: sono delle particolari fotografie dalle dimensioni irrisorie che una volta sviluppate ed ingrandite svelano il messaggio nascosto.</p>
<p style="margin-bottom: 0cm;">Questo era un breve excursus storico, ma ora passiamo a cose più tecniche.</p>
<p><!--adsense--></p>
<p><strong>La steganogarfia digitale</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">In ambito digitale occultare una qualche informazione equivale a sostituire dei bit relativamente poco importanti (chiamati bit ridondanti) con bit che, rimessi insieme con un opportuno algoritmo, formino un&#8217;informazione diversa dal file che li contiene. I dati da nascondere vengono celati all&#8217;interno di contenitori (detti cover o medium), i quali possono essere dei file di diversa natura (immagini, video, testi etc). I metodi utilizzati per fare ciò sono sostanzialmente tre:</p>
<p style="margin-bottom: 0cm; text-align: justify;"><strong>Iniezione</strong>: questo metodo consiste nell&#8217;aggiungere &#8211; quindi qui non si parla di sostituzione &#8211; dei bit all&#8217;interno del cover. La pecca di questa tecnica è che la grandezza del file può aumentare anche considerevolmente, a seconda dei bit iniettati, ma ovviamente per dei piccoli dati può andare bene.</p>
<p style="margin-bottom: 0cm; text-align: justify;"><strong>Sostituzione</strong>: si tratta di sostituire i bit inutili, o meglio ridondanti, presenti nel file, con quelli da noi voluti. A seconda della percentuale di bit sostituiti l&#8217;aspetto del file può variare più o meno considerevolmente. In un&#8217;immagine, ad esempio, alcuni dettagli potrebbero svanire o degradarsi.</p>
<p style="text-align: justify;"><strong>Generazione di un nuovo file</strong>: in questo caso non è necessario nessun cover, ma ne viene creato uno che sia perfettamente adatto ad ospitare i dati da occultare. In questo modo eventuali artefatti non si dovrebbero notare.</p>
<p style="margin-bottom: 0cm;">Vorrei aprire una piccola parentesi riguardo ai <strong>watermark</strong> ed ai <strong>fingerprint</strong>.</p>
<p style="margin-bottom: 0cm; text-align: justify;">I watermark non sono altro che messaggi o semplicemente delle firme che vengono nascoste nelle immagini il più delle volte per identificarne l&#8217;autore, così da ridurre le violazioni del copyright. Molti programmi di grafica professionale includono questa funzione. Anche svariate macchine fotografiche digitali inseriscono nelle foto dati riguardanti l&#8217;esposizione i tempi e quant&#8217;altro, ed il tutto può essere all&#8217;occorrenza letto. Si tratta anche qui di algoritmi steganografici, che però vengono usati per scopi più pratici che per questioni di sicurezza o privacy.</p>
<p style="margin-bottom: 0cm; text-align: justify;">Il fingerprint, invece, è una sorta di watermark, ma applicato principalmente a dei prodotti software per prevenire la copia pirata degli stessi. In pratica per ogni copia venduta viene iniettato un codice univoco in qualche file del software, ed in caso di necessità questo viene usato per verificare l&#8217;autenticità dello stesso, ovvero che non esistano altri software con il medesimo codice.</p>
<p style="margin-bottom: 0cm; text-align: justify;">Ritornando ai suddetti metodi di occultaggio, quello di sostituzione è il più utilizzato, questo perché raggiunge un compromesso tra perdita di informazioni del cover ed informazioni iniettate. Inoltre si può adattare a moltissimi tipi di file.</p>
<p style="margin-bottom: 0cm; text-align: justify;">Per questa introduzione mi limiterò a descrivere uno degli algoritmi di base più diffusi, usato principalmente per occultare informazioni nelle immagini (in questo caso immagini senza compressione, come le bitmap). Si tratta dell&#8217;algoritmo LSB (Least Significant Bit, bit meno significativo) che in parole povere non fa altro che sostituire gli ultimi bit di una sequenza di byte, quindi riducendo al minimo gli <a href="http://it.wikipedia.org/wiki/Artefatto_(segnali)" target="_blank">artefatti</a>. Questo è possibile anche grazie ad alcune nozioni spiegate dalla teoria dell&#8217;informazione e dipende dall&#8217;<a href="http://it.wikipedia.org/wiki/Entropia_(teoria_dell%27informazione)" target="_blank">entropia</a> sempre minore del 100% che contraddistingue la maggior parte dei file non compressi. Comunque non approfondirò questo argomento in questa sede, anche perché andrei abbastanza fuori tema.</p>
<p><strong>L&#8217;algoritmo LSB</strong></p>
<p>Come già detto questo algoritmo non fa altro che cambiare il bit low-end dei vari byte, ad esempio:</p>
<p>1100101(1)</p>
<p style="text-align: justify;">in questo caso l&#8217;ultimo bit (1) è quello che possiamo modificare. Vediamo ora com&#8217;è possibile sostituire dei bit nelle immagini bitmap, o comunque prive di compressione.<br />
Queste immagini sono solitamente in modalità RGB, cioè ad ogni pixel corrisponde un determinato valore di rosso, verde e blu. 255, 255, 255 = pixel bianco 0, 0, 0 = pixel nero. E così per tutti gli altri colori. Ora, se voi provate a colorare un pixel con la sequenza 255, 253, 255 il risultato vi sembra forse diverso dal bianco? A meno che non abbiate una vista da superdotati, la risposta è no.</p>
<p style="margin-bottom: 0cm;">Per ogni pixel quindi sono necessari 3 byte per definirne il colore:</p>
<p style="margin-bottom: 0cm;">1111 1111<br />
1111 1111<br />
1111 1111</p>
<p style="margin-bottom: 0cm; text-align: justify;">in questo caso viene definito il colore bianco, ricordando comunque che il primo byte determina la percentuale di rosso, il secondo di verde, ed il terzo di blu. L&#8217;algoritmo sfrutta proprio questa particolarità della struttura delle immagini per inserire dati in bit che sono sostanzialmente irrilevanti.<br />
Quindi poniamo di voler occultare la lettera “a” (01100001) in una sequenza di byte, quale può essere un&#8217;immagine:<br />
&#8230;<br />
11011010<br />
10001011<br />
11001000<br />
01011010<br />
11001111<br />
11101010<br />
01011010<br />
11001011<br />
&#8230;</p>
<p>ecco come procedere:</p>
<p>&#8230;<br />
11011010<br />
10001011<br />
1100100(1) &lt;&#8211; bit modificato<br />
01011010<br />
1100111(0) &lt;&#8211; bit modificato<br />
11101010<br />
01011010<br />
11001011<br />
&#8230;</p>
<p style="text-align: justify;">Come avete visto è bastato modificare solo due bit perché gli altri corrispondevano già a quelli da nascondere. In questo caso è praticamente impossibile capire che il file è stato steganografato, ma ovviamente può capitare di dover nascondere molti più bit, e quindi mutarne di più. Per esempio anche una semplice frase che in totale occupa 20 byte necessiterà – nel peggiore dei casi &#8211; di una sequenza di 160 byte. Comunque nella quasi totalità dei casi, secondo statistiche, il numero di bit da alterare è circa la metà dei bit da occultare nel file.</p>
<p style="margin-bottom: 0cm; text-align: justify;">L&#8217;LSB sta alla base di molti altri algoritmi di sostituzione che riescono ad iniettare informazioni anche in immagini compresse come le jpeg o le gif, oppure in file audio o video. Tratterò questi algoritmi nello specifico in altri articoli, magari anche citando alcuni programmi che ne fanno uso.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2008/introduzione-alla-steganografia-digitale/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->
