<?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; Steganografia</title>
	<atom:link href="http://mindunpacked.com/tag/steganografia/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>Algoritmi steganografici</title>
		<link>http://mindunpacked.com/2008/algoritmi-steganografici/</link>
		<comments>http://mindunpacked.com/2008/algoritmi-steganografici/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 20:13:48 +0000</pubDate>
		<dc:creator>Marco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[permutazione]]></category>
		<category><![CDATA[S-Tools]]></category>
		<category><![CDATA[Steganografia]]></category>
		<category><![CDATA[Texto]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=67</guid>
		<description><![CDATA[Nel precedente articolo avevo parlato dell&#8217;algoritmo LSB, che è il capostipite degli algoritmi steganografici basati sulla sostituzione dei bit ridondanti. In questo articolo descriverò abbastanza dettagliatamente uno degli algoritmi steganografici più utilizzati, ovvero quello di Andrew Brown, fra l&#8217;altro implementato in un software chiamato S-Tools.
Prima di arrivare a ciò, vorrei descrivere come la steganografia possa [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm; text-align: justify;">Nel <a href="http://mindunpacked.com/2008/introduzione-alla-steganografia-digitale/" target="_blank">precedente articolo</a> avevo parlato dell&#8217;algoritmo <strong>LSB</strong>, che è il capostipite degli algoritmi steganografici basati sulla sostituzione dei bit ridondanti. In questo articolo descriverò abbastanza dettagliatamente uno degli algoritmi steganografici più utilizzati, ovvero quello di <strong>Andrew Brown</strong>, fra l&#8217;altro implementato in un software chiamato S-Tools.<span id="more-67"></span><br />
Prima di arrivare a ciò, vorrei descrivere come la steganografia possa essere attaccata in modo da vanificarne gli scopi.</p>
<p style="margin-bottom: 0cm; text-align: justify;">In primis va chiarito che colui che tenta di violare una trasmissione di informazioni segreta viene chiamato steganalista, e la sua materia di studio è la steganalisi. Secondo il principio di Kerckhoff, valido egualmente anche in crittografia, la sicurezza della steganografia non fa imputata al fatto che il sistema steganografico sia sconosciuto allo steganalista, ma bensì che la sola chiave per accedere all&#8217;informazione non sia nota.<br />
Gli attacchi si possono raggruppare in due piccoli gruppi, quelli passivi e quelli attivi:</p>
<p style="margin-bottom: 0cm;" align="left"><span style="color: #ff6600;"><strong>Attacchi passivi:</strong></span></p>
<p style="text-align: justify;"><strong>stego-only-attack:</strong> lo stegoanalista intercetta il file steganografato ed è in grado di 	analizzarlo. E&#8217; il più importante tipo di attacco contro un sistema 	steganografico perché è quello che solitamente capita di 	utilizzare.<br />
<strong>stego-attack:</strong> il mittente ha usato lo stesso 	cover ripetutamente per nascondere i dati. Lo steganalista  possiede 	un file steganografato diverso ma originato dallo stesso cover. La 	differenza è che il messaggio celato all&#8217;interno sarà diverso, ma 	il compito di analisi sarà agevolato dal fatto che il file 	contenitore è il medesimo. Per rendere inutile questo tipo di 	attacco, come anche il precedente, basta avere l&#8217;accortezza di 	utilizzare sempre un file contenitore diverso, e soprattutto di 	scarsa notorietà.<br />
<strong>cover-stego-attack:</strong> In questo caso lo 	steganalista intercetta un file steganografato ma è a conoscenza di 	quale file “vergine” è stato utilizzato come cover. Basterà 	fare un confrontro tra i due per identificare i bit modificati, ed 	in caso di assenza di protezioni aggiuntive, risalire 	all&#8217;informazione.<br />
<strong>cover-emb-stego-attack:</strong> Bè, questo è il caso più favorevole, in cui lo stegoanalista possiede tutte le informazioni necessarie per estrapolare l&#8217;informazione. Tuttavia ad successiva sessione i dati potrebbero cambiare, e quindi costringere l&#8217;analista ad un stego-only-attack.</p>
<p><strong><span style="color: #008000;">Attacchi attivi:</span></strong></p>
<p><strong>manipulating the stego data:</strong> L&#8217;analista è in grado di frapporsi tra il mittente ed il destinatario, modificare il file steganografato eliminando l&#8217;informazione occultata e quindi inviare il file modificato al destinatario. Una sorta di attacco man in the middle.<strong><br />
manipulating the cover data:</strong> In questo caso si è in grado di manipolare il cover e intercettare il file steganografato. Si potrà risalire all&#8217;informazione nascosta attraverso passaggi più o meno compessi, magari sempre confrontando i due file cercando di scoprire i bit incriminati.<strong><br />
</strong><br />
<!--adsense--><br />
<span style="color: #999999;"><strong>L&#8217;algoritmo di A. Brown e S-Tools</strong></span></p>
<p style="margin-bottom: 0cm; text-align: justify;">Andrew Brown è l&#8217;artefice di uno degli algoritmi steganografici più utilizzati, che lui stesso ha implementato in un software chiamato S-Tools (scaricabile <a href="ftp://ftp.ntua.gr/pub/crypt/mirrors/idea.sec.dsi.unimi.it/code/s-tools4.zip">qui</a>).</p>
<p style="margin-bottom: 0cm; text-align: justify;">Si tratta di un algoritmo sostitutivo appartenente alla famiglia LSB. E&#8217; in grado di nascondere più messaggi nello stesso file, che in questo caso può essere un&#8217;immagine in formato gif o bitmap oppure un file sonoro con estensione wav. L&#8217;algoritmo procede attraverso tre fasi:</p>
<ul>
<li>
<p style="margin-bottom: 0cm;" align="justify">Compressione dei file da 	nascondere</p>
</li>
<li>
<p style="margin-bottom: 0cm;" align="justify">Cifratura dei dati 	mediante vari algoritmi (<strong>IDEA</strong>, <strong>DES</strong>, <strong>triplo DES</strong> e <strong>MDC</strong>) con password 	scelta dall&#8217;utente</p>
</li>
<li>
<p style="margin-bottom: 0cm;" align="justify">Generazione casuale di 	una serie di numeri che individuano i byte dove inserire il 	messaggio nascosto.</p>
</li>
</ul>
<p style="margin-bottom: 0cm; text-align: justify;">I primi due stadi sono dei preliminari e consentono di pretrattare i dati da nascondere secondo metodi distinti dalla steganografia; essi infatti vengono compressi in modo che occupino meno spazio e quindi criptati per avere un ulteriore grado di sicurezza. Il primo punto consente anche di avere un cover di dimensioni più piccole.</p>
<p style="margin-bottom: 0cm; text-align: justify;">Il terzo passo è il più importante da un punto di vista steganografico. Tale fase si occupa di iniettare il messaggio nascosto nei bit meno significativi di alcuni byte scelti casualmente, o meglio, a seconda della password inserita dall&#8217;utente. Considerando come file di copertura un wav, è noto come quest&#8217;ultimo si ottiene attraverso la simultanea applicazione dei due procedimenti di campionamento e <a href="http://it.wikipedia.org/wiki/Convertitore_analogico-digitale" target="_blank">quantizzazione</a>. Per esempio in Windows la quantizzazione è attuata con 8 o 16 bit, cosicché si può attingere rispettivamente a scale di 256 e <strong>65536</strong> valori. Cambiare il bit meno significativo di alcuni byte che operano la digitalizzazione, soprattutto nel secondo caso, produce modificazioni impercettibili anche alla più sensibile delle orecchie. Si stratta quindi di un processo del tutto analogo a quello adottato per le immagini. La particolarità dell&#8217;algoritmo di Brown sta nel fatto che i byte da modificare vengono scelti casualmente e dipendono sempre dalla password immessa dall&#8217;utente.</p>
<p style="margin-bottom: 0cm; text-align: justify;"><span style="color: #ffffff;">.</span></p>
<p style="margin-bottom: 0cm; text-align: justify;"><strong>Steganografia nei testi : Texto</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Alcuni algoritmi sono in grado di nascondere dei messaggi all&#8217;interno di frasi opportunamente generate, ed è proprio questo il caso di Texto (sorgenti scaricabili <a href="http://www.nic.funet.fi/pub/crypt/steganography/texto.tar.gz">qui</a>), un programma sviluppato da Kevin Maher. Va detto subito che le frasi prodotte, pur avendo un significato grammaticale, assumono un indiscutibile valore semantico, apparendo il più delle volte come periodi demenziali. Ovviamente le frasi generate da Texto sono in inglese, essendo lo stesso autore di lingua anglosassone. Maher ha approntato un dizionario di parole divise in categorie che sono: oggetti, luoghi, verbi, avverbi e aggettivi. Inoltre ha generato delle frase che fanno da template da completare con le parole appena menzionate.<br />
Ogni categoria è costituita da 64 alternative, quindi si possono codificare fino a 6 bit, ed essendo gli spazi vuoti cinque (per ciascun template), il testo segreto per ogni frase può essere costituito da un massimo di 30 bit. Il tutto funziona se il mittente ed il destinatario utilizzano il medesimo dizionario, inoltre è facile intuire come l&#8217;esigua quantità di parole faciliti il compito dello steganalista. Tuttavia la sicurezza può essere aumentata ampliando il dizionario ed il numero di template, o magari cifrando il testo prima di steganografarlo.</p>
<p style="margin-bottom: 0cm;"><strong><br />
</strong></p>
<p><span style="color: #999999;"><strong> <span>Permutazioni pseudo-casuali</span></strong></span></p>
<p style="margin-bottom: 0cm; text-align: justify;">Gli algoritmi di <strong>permutazione pseudo-casuale</strong> appartengono sempre alla famiglia degli LSB e si basano ugualmente sulla modifica dei bit meno significativi. La differenza sta nella scelta dei byte da modificare, che non viene fatta come una sequenza seppure random come nel caso di <strong>S-Tools</strong>, ma con la permutazione di un sottoinsieme di tali byte. Una permutazione di n oggetti è la nuova disposizione degli stessi secondo un nuovo ordine. Il numero totale di permutazioni aumenta in modo esponenziale all&#8217;aumentare del numero di oggetti – byte in questo caso. In particolare le permutazioni di n byte sono n! (n <a href="http://it.wikipedia.org/wiki/Fattoriale" target="_blank">fattoriale</a>), quindi anche una piccola frase da 512 bit può essere permutata in talmente tanti modi che l&#8217;analizzarli tutti richiederebbe – anche ad un computer – un tempo non indifferente. Scegliendo come successione di byte da modificare una permutazione del sottoinsieme prescelto si perde la caratteristica di ordine, cosicché il messaggio occultato viene “sparpagliato” tra i byte del cover. La distribuzione non ordinata dei bit modificati tra i byte disponibili fornisce un ulteriore elemento di sicurezza contro eventuali attacchi.<br />
Questa è una tecnica utilizzata molto anche in crittografia, ma ovviamente le modalità di impiego sono ben diverse.</p>
<h3 style="margin-bottom: 0cm; text-align: justify;"><span style="color: #ffffff;">.</span></h3>
<p style="margin-bottom: 0cm; text-align: justify;"><strong>Conclusione</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Bè, si fa per dire. D&#8217;altronde di cose da esporre sulla steganografia ce ne sarebbero ancora molte, ma diciamo che per il momento è tutto. Per il futuro ho intenzione di illustrarvi come funziona un&#8217;altra interessante applicazione pratica della steganografia, ovvero i file system steganografati. Continuate a seguirci <img src='http://mindunpacked.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2008/algoritmi-steganografici/feed/</wfw:commentRss>
		<slash:comments>2</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 -->
