<?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</title>
	<atom:link href="http://mindunpacked.com/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>Crittografia asimmetrica e algoritmo RSA. Parte II</title>
		<link>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-ii/</link>
		<comments>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-ii/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 17:33:29 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[chiave pubblica]]></category>
		<category><![CDATA[crittografia]]></category>
		<category><![CDATA[crittografia asimmetrica]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RSA]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=468</guid>
		<description><![CDATA[In questa seconda parte dell&#8217;articolo vedremo come implementare l&#8217;algoritmo RSA di cui si era precedentemente discusso in quest&#8217;altro articolo solamente in linea teorica. Il linguaggio di programmazione usato sara&#8217; Java, poiche&#8217; fornisce nativamente una classe BigInteger per il supporto di numeri interi di   dimensione arbitraria, che useremo per manipolare gli enormi numeri primi [...]]]></description>
			<content:encoded><![CDATA[<p>In questa seconda parte dell&#8217;articolo vedremo come implementare l&#8217;<strong>algoritmo RSA</strong> di cui si era precedentemente discusso in <a href="http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-i/">quest&#8217;altro articolo</a> solamente in linea teorica. Il linguaggio di programmazione usato sara&#8217; <strong>Java</strong>, poiche&#8217; fornisce nativamente una classe BigInteger per il supporto di numeri interi di   dimensione arbitraria, che useremo per manipolare gli enormi numeri primi necessari alla generazione delle chiavi, impossibili da gestire con tipi di dati   primitivi. Non mi soffermero&#8217;, ovviamente, su questioni sintattiche relative al linguaggio; inoltre non commentero&#8217; tutto il codice ma solo le parti piu&#8217;   importanti, mentre potrete leggere il resto scaricando l&#8217;archivio in fondo all&#8217;articolo.  La prima funzione necessaria al funzionamento della classe e&#8217; quella relativa alla generazione delle chiavi. Come avevamo visto nel precedente articolo, per   generare le chiavi si segue una procedura standard che e&#8217; facilmente implementabile usando la classe BigInteger di Java.<br />
<span id="more-468"></span></p>
<pre class="brush: java;">
		BigInteger p = BigInteger.probablePrime(keyLength/2, new SecureRandom()); // Generiamo un numero &quot;probabilmente&quot; primo, p
		BigInteger q = BigInteger.probablePrime(keyLength/2, new SecureRandom()); // Generiamo un numero &quot;probabilmente&quot; primo, q

		// Calcoliamo n e phi
		BigInteger n = p.multiply(q);
		BigInteger phi = p.subtract(new BigInteger(&quot;1&quot;)).multiply(q.subtract(new BigInteger(&quot;1&quot;)));

		// publicKey conterra' l'esponente pubblico e,
		// scegliendo e come il primo numero primo successivo a
		// p, esso sara' anche coprimo con phi (come richiesto nell'algoritmo)
		this.publicKey = p.nextProbablePrime();
		this.privateKey = publicKey.modInverse(phi);
		this.n = n;
	}
</pre>
<p>Una precisazione sulla funzione probablePrime() e nextProbablePrime(): esse restituiscono un numero che <strong>probabilmente</strong> e&#8217; primo, utilizzando dei test di   probabilita&#8217; probabilistici. Il margine di errore e&#8217; molto basso: per essere precisi, la probabilita&#8217; che un numero restituito da queste due funzioni sia   composto e&#8217; sempre minore di 2^-100 e la velocita&#8217; dell&#8217;algoritmo lo rende preferibile ad uno deterministico nella generazione delle chiavi. Una volta generate le chiavi, si possono gia&#8217; creare le due funzioni di base per criptare/decriptare un numero intero. Ecco il codice:</p>
<pre class="brush: java;">
	public BigInteger encrypt(BigInteger m) {
		return m.modPow(publicKey, n); // (m^publicKey) % n
	}
	public BigInteger decrypt(BigInteger m) {
		return m.modPow(privateKey, n); // (m^privateKey) % n
	}
</pre>
<p>Dovrebbe essere abbastanza chiaro. La funzione modPow(e, n) restituisce semplicemente this ^ e % n e ci risparmia un po di calcoli. Con queste due semplici funzioni possiamo pero&#8217; criptare unicamente numeri interi; per poter usare l&#8217;algoritmo su un testo piu&#8217; o meno lungo dobbiamo creare   altre due funzioni che processano il testo in maniera tale da essere compatibile con l&#8217;algoritmo, i passi principali saranno questi:</p>
<ol>
<li> aggiungere del padding (casuale) al testo in modo da renderlo divisibile in blocchi di uguali dimensioni. la dimensione di ogni blocco sara&#8217; la   lunghezza della chiave.</li>
<li>processare ogni blocco, convertire il testo in un intero e cifrarlo</li>
</ol>
<p>Per il processo inverso, invece:</p>
<ol>
<li> dividere il testo nel numero di blocchi in base alla chiave.</li>
<li> decriptare ogni blocco e convertire gli interi nel testo corrispondente</li>
<li> rimuovere il padding.</li>
</ol>
<p>Ecco il codice con alcuni commenti esplicativi:</p>
<pre class="brush: java;">
	public String encrypt(String m) {
		/* Per comodita' (piu' sotto si vedra' perche') convertiamo i
		 * caratteri del messaggio nel loro codice ASCII (esadecimale)
		 */
		String mHex = &quot;&quot;;
		for (int i = 0; i &lt; m.length(); i++) {
			mHex += Integer.toHexString(m.charAt(i));
		}

		/* Calcoliamo quanto padding e' necessario, chiamiamolo N, e poi concateniamo al messaggio
		 * N-1 bytes di padding casuale. L'ultimo non deve essere casuale ma deve contenere appunto
		 * il numero N, cosi' da poter poi rimuovere la giusta quantita di padding nella funzione decrypt().
		 */
		int padding = blockSize - (mHex.length()/2)%blockSize;
		for (int i = 0; i &lt; padding-1; i++) { // Prima generiamo N-1 byte casuali
			int randomPadding = (int)(10*Math.random());
			mHex += randomPadding &lt; 10 ? &quot;0&quot; + Integer.toHexString(randomPadding) : Integer.toHexString(randomPadding);
		}
		// Ultimo byte di padding
		mHex += padding &lt; 10 ? &quot;0&quot; + Integer.toHexString(padding) : Integer.toHexString(padding);

		int numBlocks = (mHex.length()/2)/blockSize; // Numero di blocchi in cui dividere il messaggio

		String result = &quot;&quot;, currentBlock = &quot;&quot;;
		for (int b = 0; b &lt; numBlocks; b++) {
			currentBlock = mHex.substring(b*blockSize*2, (b+1)*blockSize*2);

			/* Il blocco corrente, essendo una stringa in formato esadecimale,
			 * quindi un numero, puo' essere criptato con le due funzioni che abbiamo gia'
			 * creato precedentemente che accettano come argomento un BigInteger.
			 */
			// Questo costruttore accetta una stringa, e la base come secondo argomento
			BigInteger r = encrypt(new BigInteger(currentBlock, 16)); 

			/* Puo' accadere che la string che otteniamo come risultato abbia un byte in meno,
			 * in questo caso, per non avere problemi nel decriptare il messaggio, aggiungiamo
			 * uno zero iniziale che non cambia niente, ma la rende della dimensione corretta.
			 */
			if (r.toString(16).length() == blockSize*4) {
				result += r.toString(16);
			} else {
				result += (&quot;0&quot; + r.toString(16));
			}
		}
		return result;
	}

	public String decrypt(String m) {
		int numBlocks = (m.length()/2)/(blockSize*2);

		String temp = &quot;&quot;, currentBlock = &quot;&quot;;
		/* Questo ciclo, quasi uguale a quello della funzione encrypt(), scorre ogni
		 * blocco, lo decripta e concatena il risultato in una nuova stringa.
		 */
		for (int b = 0; b &lt; numBlocks; b++) {
			currentBlock = m.substring(b*blockSize*4, (b+1)*blockSize*4);
			BigInteger r = decrypt(new BigInteger(currentBlock, 16));
			temp += r.toString(16);
		}

		/* Il padding e' uguale all'ultimo byte della
		 * stringa, come avevamo precedentemente impostato.
		 */
		int padding = Integer.parseInt(temp.substring(temp.length()-2), 16);
		int actualLength = temp.length() - padding*2;

		// Rimuove il padding
		temp = temp.substring(0, actualLength);

		String result = &quot;&quot;;
		// Riconverte la stringa da esadecimale a testo
		for (int i = 0; i &lt; temp.length(); i+=2) {
			result += (char)Integer.parseInt(temp.substring(i,i+2), 16);
		}
		return result;
	}
</pre>
<p>Tutto il codice e&#8217; contenuto in <a href="http://www.mindunpacked.com/risorse/RSA.zip">questo archivio</a> disponibile per il download.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crittografia asimmetrica e algoritmo RSA. Parte I</title>
		<link>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-i/</link>
		<comments>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-i/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 14:47:42 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[chiave pubblica]]></category>
		<category><![CDATA[crittografia]]></category>
		<category><![CDATA[crittografia asimmetrica]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RSA]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=451</guid>
		<description><![CDATA[La crittografia asimmetrica, o crittografia a chiave pubblica, e&#8217; un particolare tipo di crittografia nel quale vengono utilizzate, al posto della singola chiave privata utilizzata nella crittografia simmetrica, una coppia di chiavi di cui una pubblica (per cifrare il messaggio) ed una privata (per decifrarlo).

Uno dei problemi principali da risolvere quando si utilizza la crittografia [...]]]></description>
			<content:encoded><![CDATA[<p>La <strong>crittografia asimmetrica</strong>, o crittografia <strong>a chiave pubblica</strong>, e&#8217; un particolare tipo di crittografia nel quale vengono utilizzate, al posto della singola chiave privata utilizzata nella crittografia simmetrica, una coppia di chiavi di cui una pubblica (per cifrare il messaggio) ed una privata (per decifrarlo).<br />
<span id="more-451"></span><br />
Uno dei problemi principali da risolvere quando si utilizza la crittografia simmetrica e&#8217; infatti quello dello <strong>scambio della chiave</strong>: utilizzando la stessa chiave per cifrare e decifrare il messaggio, le parti comunicanti devono in qualche modo entrare in contatto prima di scambiarsi il messaggio proprio per scambiare la chiave con cui, successivamente, operare. In pratica, bisogna trovare un canale sicuro per comunicarsi la chiave, altrimenti esiste sempre il rischio che essa possa essere carpita dall&#8217;esterno.</p>
<p>L&#8217;idea di base della <strong>crittografia a chiave pubblica</strong> serve proprio a porre fine a questo inconveniente e a rendere non piu&#8217; necessaria una comunicazione preliminare (e sicura) tra le parti per scambiarsi una chiave. In un algoritmo a chiave asimmetrica vengono infatti create due chiavi anziche&#8217; una: quella pubblica verra&#8217; usata da chi vuole cifrare un messaggio da inviare al possessore di quella chiave, quella privata verra&#8217; utilizzata dallo stesso per decifrare il messaggio ricevuto. La chiave pubblica di ognuno viene, insomma, resa disponibile a chiunque voglia inviargli un messaggio, che sara&#8217; poi decifrabile solamente usando la chiave privata, tenuta segreta.</p>
<p>Chiaramente le due chiavi devono essere correlate in qualche modo per avere la proprieta&#8217; sopra descritta, e cioe&#8217; che si possa crittografare un testo con una chiave (quella pubblica) e decriptarlo con un&#8217;altra (quella privata) ottenendo lo stesso testo di partenza. In particolare, esistendo questa relazione tra le chiavi bisogna evitare che dalla chiave pubblica, che tutti possono leggere, si possa risalire a quella privata. Bisogna cioe&#8217; trovare un modo per generarla che sia facile da percorrere in un verso (cioe&#8217; generare la chiave), ma che sia quasi impossibile da percorrere nell&#8217;altro, cioe&#8217; trovare i dati usati per generarla partendo dalla chiave pubblica (altrimenti, una volta ottenuti i dati, si potrebbe generare la chiave privata ad essa associata).</p>
<p>I primi ad inventare un tale sistema furono W. <strong>Diffie</strong> e M. <strong>Hellman</strong> nel 1976, ma fu nel &#8216;77 che Rivest, Shamir e Adleman, tutti studenti del MIT, realizzarono uno degli algoritmi a chiave pubblica piu&#8217; utilizzato al giorno d&#8217;oggi e che prende il nome di RSA. La sicurezza dell&#8217;<strong>algoritmo RSA</strong> si basa sulla difficolta&#8217; di fattorizzare in tempi accettabili il prodotto di due grandi numeri primi: infatti, mentre e&#8217; facilissimo calcolare il prodotto di questi due numeri, non esiste un algoritmo che possa fattorizzarlo velocemente. Nel resto di questo articolo vedremo a grandi linee come opera l&#8217;algoritmo RSA mentre nella seconda parte vedremo un&#8217;implementazione in Java.</p>
<p>In linea generale possiamo distinguere tre &#8220;fasi&#8221; dell&#8217;algoritmo: generazione delle chiavi, criptaggio, decriptaggio (si, lo so che suonano malissimo).</p>
<p><strong>Generazione delle chiavi</strong></p>
<ol>
<li>Si generano due grandi numeri primi <em>p</em>, <em>q</em> tali che il loro prodotto <em>n = pq</em> ha la lunghezza in bit che desideriamo.</li>
<li>Si calcola <em>n = pq</em>, e <em>phi = (p-1)(q-1)</em></li>
<li>Si sceglie un intero positvo <em>e</em> &lt; <em>phi</em> e coprimo con phi (cioe&#8217; MCD(e, phi) = 1)</li>
<li>Si calcola un intero positivo <em>d &lt; phi</em> tale che<span> <em>ed</em> <em>≡ 1 (mod phi)</em></span></li>
<li><span>La coppia (n, e) forma la chiave pubblica, la coppia (n, d) quella privata.</span></li>
</ol>
<p><strong>Criptaggio</strong><br />
Per criptare un messaggio si ottiene la chiave pubblica del destinatario e, dopo aver trasformato il messaggio di testo in un numero intero, si utilizza la formula <em>c = m<sup>e</sup> mod n</em>, dove m e&#8217; il messaggio.</p>
<p><strong>Decriptaggio</strong><br />
Partendo dal testo criptato si usa la formula <em>m = c<sup>d</sup> mod n, </em>dove c e&#8217; il testo cifrato.</p>
<p>L&#8217;unico modo per decriptare un messaggio, come e&#8217; evidente dall&#8217;algoritmo, e&#8217; quello di essere a conoscenza dell&#8217;esponente segreto <em>d</em> e del modulo, <em>n. </em>Mentre l&#8217;esponente e&#8217; segreto, il modulo e&#8217; pubblico poiche&#8217; e&#8217; utilizzato anche per criptare il messaggio:<em> </em>ad ogni modo, per risalire a <em>d</em>, che permetterebbe di accedere al contenuto del messaggio, abbiamo bisogno non di <em>n</em>, ma di <em>p</em> e <em>q</em>, i due grandi numeri primi usati per generarlo. Se i numeri primi sono abbastanza grandi, e&#8217; impossibile fattorizzare <em>n</em> in tempi accettabili con gli algoritmi attuali.</p>
<p>In questo articolo non abbiamo visto una prova teorica del funzionamento dell&#8217;RSA e cioe&#8217; una prova del fatto che criptando un messaggio con la chiave pubblica e decriptandolo con la chiave privata si ottiene sempre di nuovo il messaggio in chiaro, ma potete trovare una dimostrazione (in inglese) a questo link: <a title="RSA Proof" href="http://www.di-mgt.com.au/rsa_theory.pdf" target="_blank">http://www.di-mgt.com.au/rsa_theory.pdf</a>. Per comprenderla sono necessarie nozioni (non troppo avanzate) di teoria dei numeri.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DeCSS e i numeri primi illegali</title>
		<link>http://mindunpacked.com/2009/decss-e-i-numeri-primi-illegali/</link>
		<comments>http://mindunpacked.com/2009/decss-e-i-numeri-primi-illegali/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 14:57:14 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[decss]]></category>
		<category><![CDATA[numeri primi]]></category>
		<category><![CDATA[numeri primi illegali]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=407</guid>
		<description><![CDATA[Che un numero primo (ma anche un numero e basta) possa essere considerato illegale e&#8217; assurdo, ed effettivamente non esiste nessuna norma che miri a rendere illegale il possesso di alcuni numeri. Qualche anno fa si e&#8217; pero&#8217; verificata una curiosa coincidenza (intenzionale) quando un matematico di nome Phil Carmody scopri&#8217; un numero primo che [...]]]></description>
			<content:encoded><![CDATA[<p>Che un <strong>numero primo</strong> (ma anche un numero e basta) possa essere considerato <strong>illegale</strong> e&#8217; assurdo, ed effettivamente non esiste nessuna norma che miri a rendere illegale il possesso di alcuni numeri. Qualche anno fa si e&#8217; pero&#8217; verificata una curiosa coincidenza (intenzionale) quando un matematico di nome Phil Carmody scopri&#8217; un numero primo che rappresentava la versione compressa con gzip di un noto programma usato per bypassare il sistema di protezione CSS dei DVD, DeCSS. Ma partiamo dall&#8217;inizio&#8230;<br />
<span id="more-407"></span><br />
<strong>DeCSS</strong> e&#8217; un programma rilasciato nell&#8217;Ottobre 1999 da un gruppo di tre persone di cui due rimangono ancora anonime. John Lec Johansen, che si era occupato della creazione dell&#8217;interfaccia grafica, e&#8217; l&#8217;unico membro noto di questo gruppo, ed ovviamente e&#8217; stato anche l&#8217;unico a subire le conseguenze legali della pubblicazione su internet di DeCSS. Dopo vari processi iniziati nel 2000, nel 2004 Joahansen viene assolto a il suo caso viene chiuso. Tra il 2000 e il 2004 per protestare contro le leggi che impedivano la pubblicazione di codice sorgente di programmi come DeCSS, nacquero nuovi metodi piu&#8217; o meno originali per diffonderne il codice sorgente, attraverso immagini steganografate, <a title="DeCSS Haiku" href="http://www-2.cs.cmu.edu/~dst/DeCSS/Gallery/decss-haiku.txt">poemi haiku</a>, codice stampato sulle magliette o&#8230; numeri primi illegali.<br />
<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>Per <strong>Phil Carmody</strong> l&#8217;idea che del codice sorgente potesse essere intrinsecamente illegale era assolutamente bizarra, e cosi&#8217; si mise a cercare un modo di rappresentare il codice di <strong>DeCSS</strong> che non potesse essere in alcun modo considerato illegale. Il sito che attualmente si trova a <a title="Prime Numbers Archive" href="http://primes.utm.edu/">questo indirizzo</a> archiviava, e archivia ancora, i numeri primi che hanno particolari proprieta&#8217;. Cosi&#8217;, armatosi di molta pazienza e di vari tool per lavorare sui numeri primi (come test di primalita&#8217; probabilistici o deterministici), riusci&#8217; a trovare un <strong>numero primo</strong> abbastanza lungo (1901 cifre) da meritare di essere archiviato sul sito, anche perche&#8217; rientrava nella top 20 dei numeri primi testati con l&#8217;algoritmo ECPP. Tra l&#8217;altro, visto che gzip ignora i caratteri dopo uno zero binario alla fine di un file compresso, dovrebbero in realta&#8217; esistere infiniti numeri primi che rappresentano la stessa cosa, cioe&#8217; il codice compresso di DeCSS.</p>
<p>Dopo qualche mese, Phil Carmody e&#8217; anche riuscito a trovare un numero primo che rappresenta un eseguibile valido in ambiente Linux e che offre le stesse funzionalita di DeCSS. Se volete qualche dettaglio piu&#8217; tecnico sulla ricerca di questi due numeri primi potete visitare <a title="Illegal prime 1" href="http://www.asdf.org/~fatphil/maths/illegal1.html" target="_blank">questa</a> e <a title="Illegal prime 2" href="http://www.asdf.org/~fatphil/maths/illegal.html" target="_blank">questa pagina</a>. Se non vi fidate sul fatto che quel numero primo corrisponda esattamente ad un archivio che genera il codice di DeCSS vi lascio questo programma in Perl (non scritto da me, ma opera di un certo Jamie McCarthy) che prende il numero primo da una pagina web, crea un archivio gzip ed estrae il codice:</p>
<pre class="brush: perl;">
#!/usr/bin/perl
use LWP::Simple;
use Math::BigInt;
my $html = get(&quot;http://www.utm.edu/research/primes/curios/48565...29443.html&quot;);
my($prime) = $html =~ m{&lt;blockquote&gt;([^&lt;]+)&lt;/blockquote&gt;};
$prime =~ s{\D+}{};
$prime = Math::BigInt-&gt;;new($prime);
my $binary = '';
while ($prime &gt; 0) {
$binary = pack(&quot;N&quot;, ($prime % 2**32)) . $binary;
$prime /= 2**32;
}
$binary =~ s{^\0+}{};
open(my $fh, &quot;| gunzip -c 2&gt;/dev/null&quot;) or die &quot;cannot gunzip, $!&quot;;
print $fh $binary;
close $fh;
</pre>
<p>Sulla pagina inglese di Wikipedia dedicata ai <a href="http://en.wikipedia.org/wiki/Illegal_prime">numeri primi illegali</a> trovate anche i due numeri (quello del file gzip e quello del file eseguibile) che ho omesso in questo articolo. Alla prossima.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/decss-e-i-numeri-primi-illegali/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mind Unpacked e&#8217; tornato</title>
		<link>http://mindunpacked.com/2009/mind-unpacked-e-tornato/</link>
		<comments>http://mindunpacked.com/2009/mind-unpacked-e-tornato/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 21:29:32 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Altro]]></category>
		<category><![CDATA[mind unpacked]]></category>
		<category><![CDATA[mindunpacked]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=404</guid>
		<description><![CDATA[Dopo molti mesi di inattivita&#8217;, ravvivati solo dai continui attacchi degli spambot che hanno riempito il blog di utilissimi commenti, Mind Unpacked torna ad essere attivo, o almeno l&#8217;intenzione e&#8217; questa. Visto che scrivere articoli per un blog di questo tipo non e&#8217; semplice (e soprattutto non e&#8217; semplice scriverli con una certa frequenza) rinnovo [...]]]></description>
			<content:encoded><![CDATA[<p>Dopo molti mesi di inattivita&#8217;, ravvivati solo dai continui attacchi degli spambot che hanno riempito il blog di utilissimi commenti, Mind Unpacked torna ad essere attivo, o almeno l&#8217;intenzione e&#8217; questa. Visto che scrivere articoli per un blog di questo tipo non e&#8217; semplice (e soprattutto non e&#8217; semplice scriverli con una certa frequenza) rinnovo l&#8217;invito a collaborare a chiunque sia interessato. Se avete un articolo che volete pubblicare, o anche solo l&#8217;idea per un articolo interessante, potete contattarci a mindunpacked [at] gmail [dot] com.</p>
<p>PS: fateci anche sapere se vi piace il nuovo tema.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/mind-unpacked-e-tornato/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Acido picrico (trinitrofenolo)</title>
		<link>http://mindunpacked.com/2009/acido-picrico-trinitrofenolo/</link>
		<comments>http://mindunpacked.com/2009/acido-picrico-trinitrofenolo/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 14:15:10 +0000</pubDate>
		<dc:creator>Marco</dc:creator>
				<category><![CDATA[Chimica]]></category>
		<category><![CDATA[acido picrico]]></category>
		<category><![CDATA[aspirina]]></category>
		<category><![CDATA[esplosivo]]></category>
		<category><![CDATA[sintesi]]></category>
		<category><![CDATA[TNF]]></category>
		<category><![CDATA[trinitrofenolo]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=399</guid>
		<description><![CDATA[L&#8217;esplosivo che andremo a produrre è un derivato dei fenoli. Si tratta dell&#8217;acido picrico, molto tossico, e per questo non viene più usato come esplosivo. Esso è moderatamente più potente del TNT (trinitrotoluene). Solitamente viene prodotto facendo fondere il fenolo in una soluzione di acido solforico, successivamente la soluzione viene diluita con acqua distillata e [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm; text-align: justify;">L&#8217;esplosivo che andremo a produrre è un derivato dei fenoli. Si tratta dell&#8217;<strong>acido picrico</strong>, molto tossico, e per questo non viene più usato come esplosivo. Esso è moderatamente più potente del TNT (trinitrotoluene). Solitamente viene prodotto facendo fondere il fenolo in una soluzione di acido solforico, successivamente la soluzione viene diluita con acqua distillata e per finire il tutto viene nitrato usando dell&#8217;acido nitrico. Noi useremo l&#8217;aspirina (acido acetilsalicilico) come sostituto del fenolo, e del nitrato di potassio o di sodio in sostituzione del acido nitrico.<span id="more-399"></span></p>
<table style="height: 265px;" border="0" cellspacing="0" cellpadding="0" width="450">
<tbody>
<tr>
<td>
<p><div class="wp-caption alignnone" style="width: 210px"><img title="Molecola animata TNF" src="http://mindunpacked.com/risorse/TNF.gif" alt="Molecola animata TNF" width="200" height="199" /><p class="wp-caption-text">Molecola animata TNF</p></div></td>
<td>
<p style="margin-bottom: 0cm; padding-left: 30px;" align="left"><strong>Materiali</strong></p>
<p style="margin-bottom: 0cm; padding-left: 30px;" align="left">• 50 aspirine (qualsiasi marca va bene)</p>
<p style="margin-bottom: 0cm; padding-left: 30px;" align="left">• Alcol metilico o etilico senza coloranti</p>
<p style="margin-bottom: 0cm; padding-left: 30px;" align="left">• 150 ml Acido solforico ad alta concentrazione</p>
<p style="margin-bottom: 0cm; padding-left: 30px;" align="left">• 60g di nitrato di sodio o 80g di nitrato di potassio</p>
<p style="margin-bottom: 0cm; padding-left: 30px;" align="left">• Acqua distillata e ghiaccio</p>
<p style="margin-bottom: 0cm; padding-left: 30px;" align="left">• Vaselina</p>
<p style="margin-bottom: 0cm; padding-left: 30px;" align="left">• Cera (paraffina)</p>
</td>
</tr>
</tbody>
</table>
<p style="margin-bottom: 0cm;" align="left"><strong>Estrazione dell&#8217;acido acetilsalicilico</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Le aspirine, così come vengono vendute, contengono degli eccipienti che potrebbero ostacolare le varie reazioni. E&#8217; quindi necessario un processo per isolare il solo acido acetilsalicilico. Prendete le aspirine e frantumatele fino ad ottenere una polvere. Versate in una ciotola dell&#8217;alcol metilico caldo (circa 40 °), e metteteci dentro la polvere di aspirina. Agitate con un cucchiaio per almeno 2 minuti. Non tutta la polvere si dissolverà, ma ne rimarrà una parte sul fondo. Dovete filtrare il tutto, conservando solamente il liquido senza la parte insoluta. Mettete la soluzione ad evaporare. Otterrete dei cristalli bianchi sul fondo, quello è acido acetilsalicilico puro.</p>
<p style="margin-bottom: 0cm;" align="left"><strong> </strong></p>
<p style="margin-bottom: 0cm;" align="left"><strong>Procedimento</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Prendete 40g di acido acetilsalicilico e dissolvetelo il 150ml di acido solforico. Riscaldate la soluzione per favorire la dissoluzione dei cristalli. In questo modo otterrete dell&#8217;acido fenolsulfonico, che dopo la nitrazione diventerà acido picrico. Il prossimo passaggio ha bisogno di un&#8217;ottima ventilazione, e possibilmente anche di una mascherina per proteggersi dai fumi tossici. Quindi LENTAMENTE aggiungete 60g di nitrato di sodio, o in alternativa 80g di nitrato di potassio, mescolando mentre versate. Durante questo passaggio si formerà del fumo rosso, questo è triossido di azoto, il quale è molto tossico anche a basse quantità. Non inalatelo per nessun motivo. Mentre aggiungete il nitrato, state anche attenti alla schiuma che si formerà perché potrebbe far traboccare l&#8217;acido fuori dal recipiente. A questo punto la soluzione deve essere raffreddata, versandola lentamente in un recipiente contenete acqua distillata e ghiaccio macinato. Vedrete formarsi dei cristalli di un color giallo accesso. Filtrate questi ultimi, e immergeteli in dell&#8217;acqua distillata bollente, lasciate poi raffreddare il tutto a temperatura ambiente. Avrete ottenuto del trinitrofenolo (acido picrico) molto puro.</p>
<p style="margin-bottom: 0cm;" align="left"><strong> </strong></p>
<p style="margin-bottom: 0cm;" align="left"><strong>Plastificare l&#8217;esplosivo</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Potete mischiare i cristalli ottenuti con il 10% di cera e 5% di vaselina. Fatele fondere e poco prima che il tutto si solidifichi, versate i cristalli di trinitrofenolo mescolando. Avrete ottenuto un buon esplosivo al plastico, utilizzabile tra i 0 ° e i 40 ° C.</p>
<p style="margin-bottom: 0cm;" align="left"><strong> </strong></p>
<p style="margin-bottom: 0cm;" align="left"><strong>Precauzioni</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Il trinitrofenolo è molto tossico. Non va assolutamente messo a contatto con i metalli perché forma dei sali altamente instabili. Usare i guanti per maneggiarlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/acido-picrico-trinitrofenolo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Estrazione acido-base di alcaloidi</title>
		<link>http://mindunpacked.com/2009/estrazione-acido-base-di-alcaloidi/</link>
		<comments>http://mindunpacked.com/2009/estrazione-acido-base-di-alcaloidi/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 13:53:07 +0000</pubDate>
		<dc:creator>Marco</dc:creator>
				<category><![CDATA[Chimica]]></category>
		<category><![CDATA[acido]]></category>
		<category><![CDATA[alcaloidi]]></category>
		<category><![CDATA[base]]></category>
		<category><![CDATA[estrazione]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=386</guid>
		<description><![CDATA[PREMESSA
In questo articolo un tipo di estrazione molto comune in ambito chimico, ed è usata principalmente per estrarre i principi attivi dai vegetali, e precisamente degli alcaloidi. Questi ultimi prendono Il nome da alcalis, ovvero basico. Sono componenti dal gusto amaro e anche più o meno tossici (un esempio banale è la caffeina). Nella loro [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm;" align="left"><strong>PREMESSA</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">In questo articolo un tipo di estrazione molto comune in ambito chimico, ed è usata principalmente per estrarre i principi attivi dai vegetali, e precisamente degli <a href="http://it.wikipedia.org/wiki/Alcaloidi">alcaloidi</a>. Questi ultimi prendono Il nome da alcalis, ovvero basico. Sono componenti dal gusto amaro e anche più o meno tossici (un esempio banale è la caffeina). Nella loro struttura molecolare è sempre presente almeno un atomo di azoto legato a dei metaboliti organici. Per ogni alcaloide i componenti utilizzati per l&#8217;estrazione sono leggermente diversi, ma il metodo che andrò a descrivere è generalizzato e quindi applicabile a tutti gli alcaloidi. <span id="more-386"></span></p>
<p style="margin-bottom: 0cm;" align="left">Di seguito riporto gli alcaloidi più comuni che è possibile estrarre con questo metodo.</p>
<p style="margin-bottom: 0cm;" align="left">• Caffeina</p>
<p style="margin-bottom: 0cm;" align="left">• Nicotina</p>
<p style="margin-bottom: 0cm;" align="left">• Cocaina</p>
<p style="margin-bottom: 0cm;" align="left">• Morfina</p>
<p style="margin-bottom: 0cm;" align="left">• LSA</p>
<p style="margin-bottom: 0cm;" align="left">• DMT</p>
<p style="margin-bottom: 0cm;" align="left">e molti altri.</p>
<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 style="margin-bottom: 0cm;" align="left"><strong>MATERIALE NECESSARIO</strong></p>
<p style="margin-bottom: 0cm;" align="left">• Almeno 5 vasi di vetro, le dimensioni dipendono dalla quantità di materiale organico.</p>
<p style="margin-bottom: 0cm;" align="left">• Acido muriatico (in alternativa potete usare del semplice succo di limone o aceto di</p>
<p style="margin-bottom: 0cm;" align="left">vino bianco)</p>
<p style="margin-bottom: 0cm;" align="left">• Soda caustica o bicarbonato di sodio</p>
<p style="margin-bottom: 0cm;" align="left">• Acqua distillata</p>
<p style="margin-bottom: 0cm;" align="left">• Solvente organico non polare (vedi in seguito)</p>
<p style="margin-bottom: 0cm;" align="left">• Cartine tornasole</p>
<p style="margin-bottom: 0cm;" align="left">• Una calza, un filtro da caffè a trama fine o analogo</p>
<p style="margin-bottom: 0cm;" align="left">• Un piatto di ceramica</p>
<p style="margin-bottom: 0cm;" align="left">• Una discreta quantità di materiale organico secco</p>
<p style="margin-bottom: 0cm;" align="left"><span style="color: #ffffff;">.</span></p>
<p style="margin-bottom: 0cm;" align="left"><strong>SOLVENTE ORGANICO NON-POLARE</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Il solvente è quello che permette di estrarre gli alcaloidi in forma base dalla soluzione basica. Deve essere non-polare, ossia non deve mescolarsi con l&#8217;acqua ma creare due livelli ben distinti (è quello che succede con l&#8217;aceto e l&#8217;olio per farla semplice). Ecco alcuni solventi organici non polari adatti al nostro scopo:</p>
<p style="margin-bottom: 0cm;" align="left">• Naphta (ossia il petrolio bianco. Vi sconsiglio il suo utilizzo, anche se il suo costo è molto basso, ma i suoi tempi di evaporazione sono molto lunghi)</p>
<p style="margin-bottom: 0cm;" align="left">• Etere di petrolio (costa più della naphta ma evapora in pochissimo tempo e lascia pochi residui. Viene usato per l&#8217;estrazione industriale della cocaina)</p>
<p style="margin-bottom: 0cm;" align="left">• Cloruro di Metile (questo è estremamente tossico, se lo usate munitevi di mascherine. Inoltre creerà un livello che sta al di sotto della soluzione acquosa, al contrario dell&#8217;etere e della naphta)</p>
<p style="margin-bottom: 0cm;" align="left">Questi solventi sono molto volatili e infiammabili, è opportuno prendere le dovute precauzioni.</p>
<p style="margin-bottom: 0cm;" align="left"><span style="color: #ffffff;">.</span></p>
<p style="margin-bottom: 0cm;" align="left"><strong>FASE 1: Preparazione del materiale e sua decantazione in soluzione acida</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Prendete la vostra scorta di materiale organico e polverizzatela il più possibile, aiutandovi anche con un frullatore. Per facilitare questa operazione potrebbe essere utile congelare il materiale e poi triturarlo. Prendete un vaso di vetro sufficientemente grande per contenere tutto il vostro materiale, riempitelo per metà di acqua distillata e aggiungeteci un po di acido muriatico. Se usate il limone, spremete un limone intero per ogni 500ml d&#8217;acqua. Per essere precisi, usate le cartine tornasole e verificate che il pH sia circa 3. Non esagerate con l&#8217;acidificazione. Ora versate il materiale all&#8217;interno della soluzione acida (Il liquido deve essere quasi il doppio del volume vegetale, fate sembrare il tutto ad un minestrone). Lo scopo di questa fase è fare in modo che la maggior parte degli alcaloidi si trasformi in sali, e quindi solubili in acqua. Per velocizzare il processo riscaldate il tutto senza far evaporare il liquido, e mescolate ogni tanto. Lasciate riposare per almeno 48 ore, sempre mescolando di tanto in tanto.</p>
<p style="margin-bottom: 0cm;" align="left"><span style="color: #ffffff;">.</span></p>
<p style="margin-bottom: 0cm;" align="left"><strong>FASE 2: Filtrare il contenuto del primo vaso ed eliminare i componenti indesiderati</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Preparate un altro vaso, di dimensioni simili al precedente e stirate bene sulla sua imboccatura un pezzo di calza. Vi servirà come filtro. Versate il contenuto del primo vaso nel secondo, facendo passare il liquido attraverso la calza. Tutto il materiale vegetale potrà essere scartato una volta filtrata completamente tutta la soluzione acida. A questo punto vi ritrovate con una soluzione acida, privata da componenti indesiderati, al cui interno sono presenti gli alcaloidi sotto forma di sali. Versate in questa soluzione il vostro solvente organico. Non serve esagerare, per 500ml di soluzione bastano 75ml di solvente. Agitate il tutto, e lasciate che si formino due livelli. Se usate il cloruro di metile, il livello del solvente andrà a formarsi sul fondo. Vedrete che verranno “catturate” delle sostanze, visibili sotto forma di una poltiglia all&#8217;interno del solvente. Quando i due livelli saranno ben distinti dovete eliminare quello del solvente, per farlo vi conviene utilizzare un recipiente con un piccolo rubinetto sul fondo.</p>
<p style="margin-bottom: 0cm;" align="left"><span style="color: #ffffff;">.</span></p>
<p style="margin-bottom: 0cm;" align="left"><strong>FASE 3: Basificare la soluzione</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Ora sarò necessario basificare la soluzione acida ottenuta precedentemente. Per fare questo versate in un recipiente dell&#8217;acqua distillata, e successivamente aggiungeteci della soda caustica. Il pH deve risultare circa 10. Versate un po&#8217; di questa soluzione nella soluzione acida filtrata nella fase precedente. Il liquido diventerà più scuro, e avverrà una reazione esotermica, i cui scatenanti sono l&#8217;acido e la base che entrano in contrasto. Gli alcaloidi che precedentemente erano dei sali, ora ritorneranno nella loro forma base e saranno completamente separati dall&#8217;acqua.</p>
<p style="margin-bottom: 0cm;" align="left"><span style="color: #ffffff;">.</span></p>
<p style="margin-bottom: 0cm;" align="left"><strong>FASE 4: Estrazione degli alcaloidi dalla soluzione</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Per estrarre gli alcaloidi dalla soluzione dovete solo versarci dentro del solvente organico, agitare, e aspettare che si formino due livelli ben distinti. Usate etere, cloruro di metile o petrolio bianco. Dovete agitare il tutto in modo da creare un emulsione. Aggiunto il solvente e agitato, dovete lasciare riposare per almeno 24 ore (chiudete con un tappo il recipiente, altrimenti il solvente potrebbe evaporare soprattutto se è etere). Alla fine ritroverete due livelli ben distinti. Ricordate che se usate il cloruro di metile, il suo livello resterà sul fondo. Il solvente “catturerà” i vostri alcaloidi. Ora dovete isolare il solvente dal resto della soluzione acquosa. Vi conviene utilizzare sempre un recipiente con un piccolo rubinetto sul fondo.</p>
<p style="margin-bottom: 0cm;" align="left"><span style="color: #ffffff;">.</span></p>
<p style="margin-bottom: 0cm;" align="left"><strong>FASE 5: Evaporazione del solvente</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Arrivati a questo punto non vi resta che far evaporare il solvente e quindi ottenere gli alcaloidi sotto forma di cristalli. Versate il solvente in un piatto di ceramica e lasciate che evapori completamente. A completa evaporazione il residuo rimasto saranno i vostri alcaloidi, solitamente sotto forma di cristalli.<br />
Per velocizzare il processo potete riscaldare il piatto, ma mai oltre i 40° C perché i solventi sono molto infiammabili. Il tempo di evaporazione è comunque diverso da solvente a solvente. Diciamo che utilizzando l&#8217;etere, in massimo 48 ore non avrete più sue tracce, la naphta, invece, può necessitare anche più di una settimana per evaporare completamente</p>
<p style="margin-bottom: 0cm;" align="left"><span style="color: #ffffff;">.</span></p>
<p style="margin-bottom: 0cm;" align="left"><strong>Conclusioni</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">Come avevo già detto, con questo metodo potete estrarre facilmente in casa i principi attivi contenuti nelle piante, sempre se questi ultimi siano degli alcaloidi. Se il metodo viene applicato in modo preciso, si può anche ottenere un risultato discretamente puro. Con grandi quantità di materiale vegetale riuscirete ad ottenere una buona quantità di principi attivi più o meno puri.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/estrazione-acido-base-di-alcaloidi/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Robocode: guerre tra robot in Java</title>
		<link>http://mindunpacked.com/2009/robocode-guerre-tra-robot-in-java/</link>
		<comments>http://mindunpacked.com/2009/robocode-guerre-tra-robot-in-java/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 19:48:56 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[crobots]]></category>
		<category><![CDATA[Intelligenza artificiale]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[robocode]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=378</guid>
		<description><![CDATA[Molti di voi probabilmente conosceranno o avranno sentito parlare di CRobots, il gioco di programmazione in cui gli sfidanti devono creare, usando un sottoinsieme delle istruzioni del linguaggio C, un robot che distrugga tutti gli altri robot (creati da altri programmatori) presenti nell&#8217;arena. Bene, Robocode e&#8217; un gioco molto simile ma con alcune differenze: i [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Molti di voi probabilmente conosceranno o avranno sentito parlare di <strong>CRobots</strong>, il gioco di programmazione in cui gli sfidanti devono creare, usando un sottoinsieme delle istruzioni del linguaggio C, un robot che distrugga tutti gli altri robot (creati da altri programmatori) presenti nell&#8217;arena. Bene, <strong>Robocode</strong> e&#8217; un gioco molto simile ma con alcune differenze: i robot si scrivono in Java e non ci sono limiti alla fantasia del programmatore come avveniva in CRobots (perche&#8217; usava solo un set limitato di istruzioni) rendendo possibile creare anche robot dalla complessa intelligenza artificiale!<br />
<span id="more-378"></span><br />
Sul <a href="http://robocode.sourceforge.net">sito ufficiale</a> di <strong>Robocode</strong> trovate molte info e l&#8217;installer in Java. Vediamo subito come creare il nostro primo robot dopo aver effettuato l&#8217;installazione. Subito dopo aver aperto Robocode, aprite il menu Robot e cliccate su Editor; si aprira&#8217; una nuova finestra, cioe&#8217; l&#8217;editor tramite il quale possiamo programmare i nostri robot. Cliccate su File-&gt;New-&gt;Robot. Battezzate la vostra creature e scegliete un nome o una sigla caratteristica per tutti i vostri robot (il programma crea una cartella contenente tutti i robot che creerete usando come nome la seconda sigla che inserite).</p>
<p style="text-align: justify;">Quello che vedete ora nell&#8217;editor e&#8217; il codice di base per un robot molto semplice che non fa altro che muoversi avanti e indietro e girare il suo cannone di 360 gradi, sparando quando vede un nemico. Ma analizziamo piu&#8217; da vicino il codice:</p>
<pre class="brush: java;">
public class MURobot extends Robot {
</pre>
<p>Creiamo una classe che eredita tutti gli attributi e i metodi dalla classe di base Robot.</p>
<pre class="brush: java;">
	/* Qui possiamo dichiarare tutte le variabili utilizzate dal nostro robot,
	 * in questo caso non ne abbiamo.
	 */
	public void run() {
		while(true) {
			ahead(100);
			turnGunRight(360);
			back(100);
			turnGunRight(360);
		}
	}
</pre>
<p style="text-align: justify;">Dopo aver dichiarato le eventuali variabili utilizzate all&#8217;interno della classe, vediamo il metodo run(). Questo metodo viene chiamato ogni qualvolta inizia la battaglia. All&#8217;interno di run() si trova quasi sempre un ciclo infinito: se l&#8217;esecuzione di run() termina, infatti, il nostro robot non fara&#8217; altro che stare fermo e sparare ai robot che rientrano nel suo campo visivo. Se dobbiamo svolgere delle azioni particolari, come il posizionamento in una particolare zona della mappa, conviene inserirle prima di entrare nel ciclo infinito.<br />
All&#8217;interno del ciclo il robot si muove in avanti (ahead(100)) fa un giro completo del cannone, torna indietro, fa lo stesso giro e cosi&#8217; finche&#8217; non viene distrutto o distrugge tutti i robot nell&#8217;arena.</p>
<p style="text-align: justify;">
<pre class="brush: java;">
	public void onScannedRobot(ScannedRobotEvent e) {
		fire(1);
	}
</pre>
<p><!--adsense--><br />
Il metodo onScannedRobot() e&#8217; uno dei tanti metodi per gestire gli eventi forniti di default. Questo metodo viene automaticamente eseguito quando un robot nemico rientra nel campo visivo del nostro: in questo caso l&#8217;azione e&#8217; di sparare. L&#8217;oggetto e (sta per event) passato come argomento contiene informazioni utili come la direzione del proiettile, la distanza da noi, etc&#8230; non utilizzate nel nostro caso. Potete consultare la documentazione sulle API di Robocode che e&#8217; molto esaustiva a riguardo.</p>
<pre class="brush: java;">
	public void onHitByBullet(HitByBulletEvent e) {
		turnLeft(90 - e.getBearing());
	}
}
</pre>
<p style="text-align: justify;">L&#8217;ultimo metodo viene chiamato quando il nostro robot viene colpito da un proiettile: per evitare di essere colpiti di nuovo il robot si gira nella direzione perpendicolare al proiettile e quindi si sposta grazie alle istruzioni all&#8217;interno del metodo run(). Il metodo getBearing() restituisce l&#8217;angolo tra la direzione in cui ci stiamo muovendo e la direzione del proiettile ed e&#8217; sempre compreso tra -180 e 180, ed e&#8217; uno dei tanti metodi di cui vi parlavo in precedenza.</p>
<p style="text-align: justify;">Se provate a iniziare una battaglia tra questo robot e altri leggermente piu&#8217; avanzati presenti gia&#8217; di default, vi accorgerete che le sue prestazioni non sono proprio ottimali, di fatto perdera&#8217; la maggior parte delle battaglie se non tutte (ovviamente dipende contro chi lo fate combattere), ma e&#8217; comunque un inizio. Il metodo migliore per realizzare robot sempre piu&#8217; avanzati e&#8217; cominciare da subito a crearne: ricordate anche che avendo abbastanza padronanza con Java non ci sono limiti a quello che si puo&#8217; realizzare!</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/robocode-guerre-tra-robot-in-java/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>I cavi per gli impianti Hi-Fi</title>
		<link>http://mindunpacked.com/2009/i-cavi-per-gli-impianti-hi-fi/</link>
		<comments>http://mindunpacked.com/2009/i-cavi-per-gli-impianti-hi-fi/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 17:59:30 +0000</pubDate>
		<dc:creator>Marco</dc:creator>
				<category><![CDATA[Elettronica]]></category>
		<category><![CDATA[alta fedeltà]]></category>
		<category><![CDATA[altoparlanti]]></category>
		<category><![CDATA[cavi]]></category>
		<category><![CDATA[Hi-Fi]]></category>
		<category><![CDATA[preamplificatori]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=366</guid>
		<description><![CDATA[Ci sono molte persone che ostentano i loro cavetti dell&#8217;impianto Hi-Fi imputandoli di rendere il suono apparentemente migliore. Le pubblicità di questi fantomatici cavi prolificano nelle riviste specializzate, ed anzi, gli stessi articolisti arrivano a consigliarli. Ma saranno veramente utili come vogliono farci credere? I materiali “pregiati” con cui vengono costruiti possono davvero migliorare le [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm; text-align: justify;">Ci sono molte persone che ostentano i loro cavetti dell&#8217;impianto Hi-Fi imputandoli di rendere il suono apparentemente migliore. Le pubblicità di questi fantomatici cavi prolificano nelle riviste specializzate, ed anzi, gli stessi articolisti arrivano a consigliarli. Ma saranno veramente utili come vogliono farci credere? I materiali “pregiati” con cui vengono costruiti possono davvero migliorare le caratteristiche di un impianto Hi-Fi?<br />
<span id="more-366"></span></p>
<p style="margin-bottom: 0cm; text-align: justify;">La risposta è no, e le motivazioni saranno date nel corso dell&#8217;articolo.<br />
Convincere un audiofilo condizionato dalla pubblicità martellante, che i cavi non migliorano le caratteristiche del suo impianto non è cosa facile, ma alla fine di questo articolo vedrete che tutti quelli che comprano dei cavi “speciali” vi sembreranno solo degli idioti, od al massimo dei fanatici dell&#8217;estetica.<br />
Andiamo con ordine. Ci sono due tipi di cavi per impianti Hi-Fi: quelli per collegare le fonti audio al preamplificatore e quelli per collegare l&#8217;amplificatore agli altoparlanti.</p>
<p style="margin-bottom: 0cm;">
<p><!--adsense--></p>
<h3 style="margin-bottom: 0cm;"><strong>I cavi per altoparlanti</strong></h3>
<p style="margin-bottom: 0cm; text-align: justify;">Questi cavi vengono usati per collegare l&#8217;amplificatore agli altoparlanti e solitamente sono delle semplici piattine a due fili. La prima peculiarità che i produttori di cavi “speciali” promettono è un&#8217;induttanza molto bassa. Ma vediamo perché questa caratteristica è ininfluente in un comune impianto casalingo.<br />
L&#8217;induttanza del cavo potrebbe influire sul segnale soltanto se questo raggiungesse una lunghezza pari a ¼ d&#8217;onda. La formula per calcolare la lunghezza d&#8217;onda in metri conoscendo la frequenza in Khz è:</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;"><strong>lunghezza d&#8217;onda = 300.000 : Khz</strong></p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm; text-align: justify;">Da ciò si capisce che l&#8217;induttanza del cavo influisce notevolmente sul segnale solo se ha una lunghezza maggiore di:</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;"><strong>300.000 : 25 = 12.000 metri</strong></p>
<p style="margin-bottom: 0cm;"><strong>12.000 :4 = 3.000 metri</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">
<p style="margin-bottom: 0cm; text-align: justify;">Quindi se all&#8217;uscita dell&#8217;amplificatore e all&#8217;ingresso della cassa acustica applicassimo un cavo lungo 3 chilometri, allora questo potrebbe avere la sua influenza, ma poiché solitamente la lunghezza di questi cavi – in ambito casalingo, ma anche in altri luoghi – non supera mai una decina di metri e la gamma delle frequenza acustiche va da un minimo di 10 Hz ad un massimo di 20.000 Hz, il segnale di bassa frequenza arriva alle casse senza alcuna alterazione.<br />
L&#8217;induttanza di un cavo che abbia i fili appaiati varia al variare del diametro del filo da un minimo di 0,3 microHenry per metro ad un massimo di 0,8 microHenry per metro. L&#8217;induttanza è maggiore se il filo è sottile, minore se il filo è grosso. Solo le frequenze tra i 15.000 – 20.000 Hz possono venire attenuate da un&#8217;induttanza eccessivamente elevata.</p>
<p style="margin-bottom: 0cm; text-align: justify;">
<p style="margin-bottom: 0cm; text-align: justify;">Altra cosa che i cavi “speciali” promettono di ridurre è la capacità parassita: anche questa varia al variare del diametro del filo; più questo è grosso più la capacità è alta, al contrario più è sottile e più la capacità sarà bassa. Alcuni consigliano di distanziare i due fili della piattina per ridurre la capacità parassita. Questo è vero, ma è altrettanto vero che l&#8217;induttanza aumenterà eccessivamente. In ogni caso la capacità parassita – se non troppo elevata &#8211; non influenza assolutamente il suono. Quanto detto vale per cavi non più lunghi di 10-12 metri, e quindi nella maggior parte degli impianti casalinghi.</p>
<p style="margin-bottom: 0cm; text-align: justify;">
<p style="margin-bottom: 0cm; text-align: justify;">Alcuni possessori di questi cavetti potrebbero obiettare dicendo che il suono è realmente migliore, e che quindi hanno speso bene i loro soldi. E&#8217; chiaro che costoro sono stati semplicemente suggestionati dalla pubblicità e dall&#8217;apparenza vistosa di certi cavi che presentano contatti dorati, plastiche colorate etc. Per stabilire le differenze tra un cavo e l&#8217;altro, qualora ve ne fossero, non è sufficiente l&#8217;orecchio umano ma apparecchiature professionali come oscilloscopi, analizzatori di spettro, distorsimetri, audiotracer etc., perché solo con questi strumenti è possibile misurare anche quelle piccole differenze che l&#8217;orecchio umano non potrà mai per sua natura rilevare.</p>
<p style="margin-bottom: 0cm; text-align: justify;">
<p style="margin-bottom: 0cm; text-align: justify;">In definitiva abbiamo visto come l&#8217;unica cosa che potrebbe mutare in qualche modo il suono è l&#8217;induttanza del cavo, ma vi posso assicurare che non serve spendere cifre esorbitanti per dei cavi con bassa induttanza. E&#8217; sufficiente acquistare un comunissimo cavo di gomma con 4 cavetti conduttori al suo interno. Il diametro deve essere proporzionato alla potenza del vostro amplificatore. L&#8217;unica cosa che dovete fare è collegare in parallelo due fili, ottenendo così un perfetto cavo per altoparlanti con un&#8217;induttanza parassita che potrà variare da un minimo di 0,25 <a href="http://it.wikipedia.org/wiki/Henry">microHenry</a> per metro ad un massimo di 0,4 microHenry per metro. Avrete ottenuto, con una spesa irrisoria, un cavo tranquillamente paragonabile a quelli più costosi e rinomati.</p>
<div id="attachment_367" class="wp-caption aligncenter" style="width: 375px"><a href="http://mindunpacked.com/wp-content/uploads/2009/01/cavo.gif"><img class="size-medium wp-image-367" title="Cavo artigianale per altoparlanti" src="http://mindunpacked.com/wp-content/uploads/2009/01/cavo-300x65.gif" alt="Cavo artigianale per altoparlanti" width="365" height="79" /></a><p class="wp-caption-text">Cavo artigianale per altoparlanti</p></div>
<p style="margin-bottom: 0cm;"><span style="color: #ffffff;">.</span></p>
<h3 style="margin-bottom: 0cm;"><strong>I cavi d&#8217;ingresso per i preamplificatori</strong></h3>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm; text-align: justify;">Questi cavi differiscono dai precedenti perché sono schermati. Questi tipi di cavi si possono trovare con sostanziali differenze di prezzo. Del comune cavo schermato si può trovare a circa 0,30 centesimi al metro, ma quelli tanto pubblicizzati dalle riviste hanno dei costi imbarazzanti. Quando si va ad applicare un segnale di BF su questi cavetti, non importa se la frequenza è di 100 Hz o di 20,000 Hz, poiché sull&#8217;estremità opposta preleveremo sempre queste due identiche frequenze. L&#8217;unica differenza che si riscontra tra i cavi schermati comuni e quelli “firmati” è la loro capacità parassita, esattamente come avevamo visto per gli altri cavi. Si può sminuire anche qui questa peculiarità dicendo che la capacità potrebbe influire sull&#8217;ampiezza delle sole frequenze dei super-acuti, e comunque soltanto nei casi in cui venissero usati dei cavetti più lunghi di 3 metri – cosa improbabile visto che solitamente la sorgente e l&#8217;amplificatore sono molto vicini.</p>
<p style="margin-bottom: 0cm; text-align: justify;">Quanto detto si può provare con una formula per calcolare il taglio di frequenza di un filtro passa/basso, ovvero qualsiasi cavo schermato:</p>
<p style="margin-bottom: 0cm; text-align: justify;">
<p style="margin-bottom: 0cm; text-align: justify;"><strong>Herz = 159.000 : (R1 kiloohm x C1 nanoF)</strong></p>
<p style="margin-bottom: 0cm; text-align: justify;">
<p style="margin-bottom: 0cm; text-align: justify;">R1 è il valore dell&#8217;impedenza d&#8217;uscita della sorgente, quindi se prendiamo il massimo valore che è 2000 ohm otteniamo 2 kohm. C1 è la capacità parassita del cavo espressa in nanofard. un normalissimo cavo schermato ha solitamente una capacità parassita di 400 picofard, quindi otteniamo 0,4 nanofard.</p>
<p style="margin-bottom: 0cm; text-align: justify;">
<p style="margin-bottom: 0cm; text-align: justify;">159.000 : (2 x 0,4) = 198.750 Hz</p>
<p style="margin-bottom: 0cm; text-align: justify;">
<p style="margin-bottom: 0cm; text-align: justify;">Questo significa che tutte le frequenze inferiori a 198.750 hz non subiranno nessuna attenuazione. Poiché la massima frequenza che il nostro orecchio riesce a percepire si aggira attorno ai 20.000-22.000 hz, è chiaro che un cavo del genere si può tranquillamente usare anche in ambito Hi-Fi. I più pignoli possono usare un cavo coassiale di tipo RG.174, il quale costa poco più dei cavi schermati normali ma ha una capacità parassita non superiore a 100 pF.</p>
<p style="margin-bottom: 0cm; text-align: justify;"><span style="color: #ffffff;">.</span></p>
<p style="margin-bottom: 0cm; text-align: justify;">
<h3 style="margin-bottom: 0cm; text-align: justify;"><strong>Conclusione</strong></h3>
<p style="margin-bottom: 0cm; text-align: justify;">
<p style="margin-bottom: 0cm; text-align: justify;">In ultimo spendere cifre esorbitanti in cavetti sperando di migliorare le prestazioni del proprio impianto Hi-Fi è pura follia. Comprare certi cavi è farsi fregare allegramente dai produttori degli stessi. Al lato pratico non c&#8217;è nessunissima differenza, l&#8217;unica cosa che cambia è l&#8217;estetica, ma volete realmente spendere dei soldi per abbellire qualcosa che solo la polvere potrà vedere?</p>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm;">
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/i-cavi-per-gli-impianti-hi-fi/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Matrici e filtri di convoluzione</title>
		<link>http://mindunpacked.com/2009/matrici-e-filtri-di-convoluzione/</link>
		<comments>http://mindunpacked.com/2009/matrici-e-filtri-di-convoluzione/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 17:23:34 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[filtri convoluzione]]></category>
		<category><![CDATA[image processing]]></category>
		<category><![CDATA[matrici convoluzione]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=310</guid>
		<description><![CDATA[Per matrice di convoluzione si intende una matrice che viene applicata ad un&#8217;immagine per ottenere una seconda immagine con caratteristiche particolari. I filtri di convoluzione sono appunto quei filtri, presenti in quasi tutti i programmi di grafica, che modificano l&#8217;immagine imprimendogli alcuni effetti come per esempio la sfocatura (blur), una maggiore definizione (sharpen), etc&#8230; quasi [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Per <strong>matrice di convoluzion</strong>e si intende una matrice che viene applicata ad un&#8217;immagine per ottenere una seconda immagine con caratteristiche particolari. I <strong>filtri di convoluzione</strong> sono appunto quei filtri, presenti in quasi tutti i programmi di grafica, che modificano l&#8217;immagine imprimendogli alcuni effetti come per esempio la sfocatura (blur), una maggiore definizione (sharpen), etc&#8230; quasi tutti questi filtri fanno uso di matrici di convoluzione, e vedremo come creare un semplice programma in C++ che, data un&#8217;immagine in input ed una matrice di convoluzione produca l&#8217;immagine di output.</p>
<p style="text-align: justify"><span id="more-310"></span> Sebbene le matrici di convoluzione, chiamate anche &#8220;<strong>kerne</strong><strong>l</strong>&#8220;, possano essere di qualsiasi dimensione, le piu&#8217; usate sono quelle 5&#215;5 e <strong>3x</strong><strong>3</strong>. In questo articolo prenderemo in considerazione solo le seconde, che sono sufficienti a creare una grande varieta&#8217; di effetti. La matrice va applicata separatamente ad ogni canale dell&#8217;immagine (R, G, B) nel seguente modo. Supponiamo di operare esclusivamente sul canale R, visto che le operazioni sono analoghe agli altri canali, e di avere pixel con i valori indicati nella matrice a sinistra a cui vogliamo applicare la matrice di convoluzione presente a destra:</p>
<table style="text-align: center;" border="0">
<tbody>
<tr>
<td>
<table style="text-align: center;" border="0">
<tbody>
<tr>
<td>255</td>
<td>180</td>
<td>100</td>
</tr>
<tr>
<td>125</td>
<td><span style="color: #ff0000;">175</span></td>
<td>150</td>
</tr>
<tr>
<td>0</td>
<td>123</td>
<td>20</td>
</tr>
</tbody>
</table>
</td>
<td>
<table border="0">
<tbody>
<tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>Il pixel evidenziato in rosso e&#8217; quello su cui stiamo lavorando in questo momento, mentre la matrice a destra e&#8217; il nostro kernel. Per applicare il filtro di convoluzione sul pixel dobbiamo immaginare di sovrapporre l&#8217;elemento centrale della matrice kernel con il pixel che stiamo considerando e di fare la somma di tutti i prodotti degli elementi sovrapposti. In poche parole dobbiamo moltiplicare gli elementi corrispondenti tra le due matrici e sommare tutti i risultati. Notate che non stiamo effettuando una normale moltiplicazione tra matrici (cioe&#8217; un prodotto riga per colonna)!</p>
<p style="text-align: justify">Nel nostro caso il calcolo e&#8217;:</p>
<p style="text-align: justify">255*0 + 180*0 + 100*0 + 125*0 + 175*1 + 150*0 + 0*0 + 123*0 + 20*0 == 175</p>
<p style="text-align: justify">La matrice di convoluzione che abbiamo scelto, potrebbe essere paragonata alla matrice identita&#8217; nel caso di un prodotto tra matrici. Come la matrice identita&#8217; non cambia il risultato, cosi&#8217; questa matrice  fornisce come risultato lo stesso pixel e quindi l&#8217;immagine di output rimane invariata. Ovviamente questo e&#8217; un caso particolare, e alla fine dell&#8217;articolo vedremo alcuni degli effetti prodotti da altre matrici particolari.</p>
<p style="text-align: justify">Comunque, quando la matrice di convoluzione viene applicata a tutti i pixel dell&#8217;immagine il lavoro e&#8217; terminato ed abbiamo ottenuto la nostra immagine modificata. Vediamo alcune parti del codice in C++ che trovate allegato alla fine dell&#8217;articolo. Ah, il codice fa uso, come al solito, delle librerie EasyBMP per la gestione delle BMP.</p>
<pre class="brush: cpp;">int mat[DIM][DIM];

typedef struct pixel {
	int red, green, blue;
};
</pre>
<p><!--adsense--></p>
<p style="text-align: justify">Creiamo una matrice DIMxDIM (dove DIM = 3 nel nostro caso), che sara&#8217; la nostra matrice di convoluzione, e creiamo un nostro tipo per descrivere i pixels. Dopo aver fatto inserire all&#8217;utente i 9 valori degli elementi della matrice, possiamo iniziare i calcoli. Nelle righe 38-56 (non le scrivo qua perche&#8217; vengono formattate male) svolgiamo i calcoli veri e propri. Gli indici i e j sono le coordinate x e y del pixel che stiamo esaminando; notate che escludiamo i pixel appartenenti al bordo esterno dell&#8217;immagine semplicemente perche&#8217; non hanno 8 pixel confinanti come tutti gli altri, e quindi verrebbe piu&#8217; difficile applicare la matrice perche&#8217; dovremmo escludere alcuni pixel dal conteggio; il risultato non cambia di molto.</p>
<p style="text-align: justify">I nuovi valori dei pixel vengono salvati in un array di oggetti pixel (il typedef che abbiamo definito poco piu&#8217; su). Quello che ci manca è riportare questi valori in un intervallo 0&#8230;255. Sappiamo infatti che 255 e&#8217; il valore massimo per ogni componente di un pixel, ma dall&#8217;applicazione del nostro filtro, potremmo avere (e&#8217; spesso e&#8217; cosi&#8217;) valori che superano questa soglia. Per fare cio&#8217; calcoliamo la somma di tutti gli elementi della matrice di convoluzione e dividiamo tutti i valori di output per questa somma. Se dopo questa operazione ci saranno ulteriori valori &gt; 255, li imposteremo uguali a 255, cosi&#8217; come imposteremo a 0 quelli &lt; 0.</p>
<p style="text-align: justify">Vediamo un esempio:</p>
<table border="0">
<tbody>
<tr>
<td><a href="http://www.mindunpacked.com/risorse/2.bmp"><img class="alignnone" title="Immagine originale" src="http://www.mindunpacked.com/risorse/2_th.bmp" alt="" width="200" height="183" /></a></td>
<td>
<p style="text-align: center">MATRICE DI CONVOLUZIONE</p>
<p style="text-align: center">0 -1  0</p>
<p style="text-align: center">-1  4  -1</p>
<p style="text-align: center">0  -1  0</p>
</td>
<td><a href="http://www.mindunpacked.com/risorse/out.bmp"><img class="alignnone" title="Risultato" src="http://www.mindunpacked.com/risorse/out_th.bmp" alt="" width="200" height="183" /></a></td>
</tr>
</tbody>
</table>
<p style="text-align: justify">In questo esempio, e&#8217; stata applicata all&#8217;immagine una matrice per individuare i bordi (edge detection). Le immagini sono piuttosto pesanti essendo BMP e quindi non compresse.</p>
<p style="text-align: justify">Su Internet si trovano facilmente altre matrici di convoluzione associate a risultati particolari. Ecco il <a title="Codice C++ matrici di convoluzione" href="http://www.mindunpacked.com/risorse/matrix.zip" target="_self">codice del programma</a>. Alla prossima.</p>
<p style="text-align: justify">
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/matrici-e-filtri-di-convoluzione/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Buffer overflow: Windows</title>
		<link>http://mindunpacked.com/2009/buffer-overflow-windows/</link>
		<comments>http://mindunpacked.com/2009/buffer-overflow-windows/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 14:16:01 +0000</pubDate>
		<dc:creator>Marco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[arwin]]></category>
		<category><![CDATA[Buffer overflow]]></category>
		<category><![CDATA[exploit]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=352</guid>
		<description><![CDATA[Nella parte introduttiva sull&#8217;overflow mi sembra di aver spiegato abbastanza chiaramente i fondamenti di questo tipo di errore, quasi un incubo per i programmatori. In questo articolo vedremo come sfruttare la suddetta vulnerabilità in ambiente Windows.
Il primo overflow
Passo subito alla pratica, proprio perché nel precedente articolo ho già trattato la parte teorica. Vediamo quindi un [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Nella <a href="http://mindunpacked.com/2008/il-buffer-overflow-introduzione/">parte introduttiva sull&#8217;overflow</a> mi sembra di aver spiegato abbastanza chiaramente i fondamenti di questo tipo di errore, quasi un incubo per i programmatori. In questo articolo vedremo come sfruttare la suddetta vulnerabilità in ambiente Windows.<span id="more-352"></span></p>
<p><strong>Il primo overflow</strong></p>
<p style="text-align: justify;">Passo subito alla pratica, proprio perché nel precedente articolo ho già trattato la parte teorica. Vediamo quindi un semplice programma vulnerabile all&#8217;overflow dello stack:</p>
<pre class="brush: cpp;">
#include
int main(int argc, char **argv) {
char buf[20];  //inizializzo un buffer di 20 bytes
FILE* f=NULL;
int i=0;
printf(&quot;\nTest BOF&quot;);
f=fopen(&quot;input.txt&quot;,&quot;rb&quot;); //apro il file...

while(!feof(f)) { //...e comincio a leggerne il contenuto
buf[i]=fgetc(f); //salvo i byte nel buffer
i++;
}
fclose(f); //chiudo il file
}
</pre>
<p style="text-align: justify;">Si tratta di un esempio tipico di buffer overflow, dovuto all&#8217;uso incauto di un buffer nella lettura da file. Se infatti il file contiene dati per più di 20 bytes il programma andrà in crash, visualizzando il classico avviso di Windows.</p>
<p><a href="http://mindunpacked.com/wp-content/uploads/2009/01/avviso.gif"><img class="aligncenter size-medium wp-image-353" title="Crash del programma" src="http://mindunpacked.com/wp-content/uploads/2009/01/avviso.gif" alt="Crash del programma" width="454" height="229" /></a></p>
<p style="text-align: justify;">Il codice, infatti, non fa altro che leggere un carattere alla volta dal file input.txt fino alla fine per poi copiarlo nella variabile buf. Naturalmente, poiché non c&#8217;è nessun controllo sulla dimensione del file, basta superare il limite del buffer per provocare la condizione di overflow. Nell&#8217;esempio, per far crashare il programma, ho inserito di proposito una stringa di 28 bytes (AAAABBBBCCCCDDDDEEEEFFFFGGGG) dove “FFFFGGGG” sono i byte eccedenti. Ma dove finiscono questi dati? Come detto la scorsa volta i dati che causano il traboccamento del buffer vanno a sovrascrivere lo stack della memoria. In questo caso, se si usa un debugger per visionare lo stato della memoria al momento dell&#8217;overflow, si noterà che il registro EIP ha assunto il valore 0&#215;47474747 e quello EBP il valore 0&#215;46464646, che rispettivamente equivalgono – in esadecimale – ai caratteri GGGG e FFFF.</p>
<p><!--adsense--></p>
<p><strong>Primi passi verso l&#8217;exploit</strong></p>
<p style="text-align: justify;">Modificare il registro EIP significa, in parole povere, riuscire a modificare l&#8217;esecuzione del programma, dirigendolo in una qualsiasi zona a nostro piacere. Una volta chiarito questo punto possiamo iniziare a progettare un exploit in grado di sfruttare l&#8217;overflow individuato per prendere il controllo del programma. Si procede studiando l&#8217;esecuzione del programma fino alla condizione di overflow, passo dopo passo, grazie ad un debugger. Vediamo ora la prima parte del programma. Dovete comunque tenere conto che se disassemblate un eseguibile da voi compilato l&#8217;output potrebbe differire dal mio, ciò è dovuto dalla differenza del compilatore, od anche da una versione diversa dello stesso:</p>
<pre class="brush: cpp;">
00401000 push ebp //salva EBP nello stack
00401001 mov ebp,esp
00401003 sub esp,1Ch //riserva spazio per buffer
00401006 mov dword ptr [ebp-18h],0 //variabile FILE* f
0040100D mov dword ptr [ebp-1Ch],0 //variabile int i
</pre>
<p style="margin-bottom: 0cm; text-align: justify;">Questa parte iniziale di codice viene generata dal compilatore e si “preoccupa” di riservare spazio nello stack utile per allocare buf (0&#215;1C byte) e le altre variabili. Sono riportati i valori dei registri dello stack ESP e EPB prima e dopo l&#8217;esecuzione delle istruzioni. Successivamente il programma esegue la stampa a video con printf() della stringa “Test BOF”. In linguaggio assembly i prametri di una funzione vengono passati mediante salvataggio nello stack: prima della chiamata a printf() troviamo infatti un&#8217;istruzione PUSH che memorizza nello stack l&#8217;offset della stringa di testo.</p>
<pre class="brush: cpp;">
00401014 push 407030h //offset stringa  “\nTest”
00401019 call 00401114 //printf()
0040101E add esp,4
...
</pre>
<p style="margin-bottom: 0cm;">Analizziamo ora il ciclo while che legge fino alla fine del file i byte memorizzandoli nella variabile buf:</p>
<pre class="brush: cpp;">
00401033 mov dword ptr [ebp-18h], eax
00401036 mov eax, dword ptr [ebp-18h]
00401039 mov eax, dword ptr [eax-0Ch]
0040103C and ecx,10h
0040103F test ecx,ecx //test di fine file (EOF)
00401041 jne 00401061
00401043 mov edx, dword ptr [ebp-18h]
00401046 push edx
00401047 call 004010C7 //lettura da file fgetc()
0040104C add esp,4
0040104F mov ecx, dword ptr [ebp-1Ch]
00401052 mov byte ptr [ebp+ecx-14h],al //memorizza il byte in buf
00401056 mov edx, dword ptr [ebp-1Ch]
00401059 add edx,1 //incremento variabile i (i++)
0040105C mov dword ptr [ebp-1Ch],edx
0040105F jmp 00401036
</pre>
<p style="margin-bottom: 0cm;">
<p style="margin-bottom: 0cm; text-align: justify;">l&#8217;istruzione alla riga 12 è quella che scrive nel buffer il dato letto da file mediante fget(). L&#8217;indirizzo del buffer è dato da [EBP+ECX-14h]; il valore vinere incrementato ad ogni iterazione grazie al registro ECX. E&#8217; tuttavia la parte finale del programma, quella che segue immediatamente all&#8217;istruzione fclose(), la più interessante: viene ripristinato il valore del registro EBP e per chiudere la procedura si esegue un&#8217;istruzione di ritorno RET. Tale istruzione ha l&#8217;effetto di estrarre una word (32 bit) dallo stack e di memorizzare in eip, modificando l&#8217;indirizzo dell&#8217;istruzione corrente e spostando così il flusso di esecuzione del programma. E&#8217; in questo momento che emergono i problemi dell&#8217;overflow e il programma raggiunge una condizione indefinita. Il ciclo while infatti, non si accorge di scrivere nel buffer più dati di quelli previsti (28 contro 20) e di conseguenza inizia a scrivere sopra lo stack alterando i valori in esso memorizzati.</p>
<pre class="brush: cpp;">
00401061 mov eax, dword ptr [ebp-18h]
00401064 push eax
00401065 call 00401071
0040106A add esp,4
0040106D mov esp,ebp
0040106F pop ebp //ripristina EBP
00401070 ret //istruzione di ritorno
</pre>
<p style="margin-bottom: 0cm; text-align: justify;">Tutto ciò si traduce con un errore che scatta nel momento in cui si eseguono le istruzioni POP e RET: i valori estratti dallo stack non sono quelli corretti, ma sono diventati parte dei dati letti da input; infatti, nel momento in cui si verifica il crash, ci si accorge che i registri EBP e EIP contengono i valori 0&#215;46464646 e 0&#215;47474747, che corrispondono proprio ai caratteri in eccedenza nel file input.txt (rispettivamente le stringe “FFFF” e “GGGG”).<br />
Vediamo ora com&#8217;è possibile creare un exploit capace di sfruttare l&#8217;overflow del programma di esempio. Si è visto come sia possibile controllare l&#8217;andamento del programma fornendo input in eccedenza, ma è possibile andare oltre: se nell&#8217;input invece di fornire stringhe di testo, memorizziamo istruzioni assembly a nostro piacimento, possiamo iniettare il nostro codice direttamente nello stack affidato al programma e quindi modificare l&#8217;andamento del flusso d&#8217;esecuzione, dirottando il registro EIP nel punto in cui si trova il codice iniettato. L&#8217;unica difficoltà di questa fase è il calcolo degli indirizzi e degli offset di allineamento, che dovranno combaciare perfettamente per far sì che il programma ad un certo punto esegua le nostre istruzioni; analizzando la stringa di overflow ci si accorge che il valore GGGG pilota il registro EIP. La struttura dell&#8217;exploit prevede, quindi, un input di questa forma: in testa possiamo sfruttare i primi 20 byte del buffer per memorizzare il codice che vogliamo far eseguire, aiutandoci con eventuali istruzioni NOP (istruzione assembly che corrisponde a no-operation, quindi ininfluente) per allineare il codice esattamente alla dimensione di 20 byte. Seguono due word da 32 bit che corrispondono ai valori scritti dall&#8217;overflow nei registri EBP e EIP; infine, poiché per questo exploit ho pensto di visualizzare una semplice stringa di testo, memorizzeremo nella parte finale dell&#8217;input quest&#8217;ultima, terminata da 0.</p>
<table border="1" cellspacing="0" cellpadding="4" width="100%" bordercolor="#000000">
<col width="60"></col>
<col width="38"></col>
<col width="51"></col>
<col width="51"></col>
<col width="57"></col>
<tbody>
<tr valign="top">
<td width="23%">
<p align="center"><strong>Codice 			iniettato</strong></p>
</td>
<td width="15%">
<p align="center"><strong>NOP 			(0&#215;90)</strong></p>
</td>
<td width="20%">
<p align="center"><strong>EBP</strong></p>
</td>
<td width="20%">
<p align="center"><strong>EIP</strong></p>
</td>
<td width="22%">
<p align="center"><strong>String\0</strong></p>
</td>
</tr>
<tr valign="top">
<td width="23%">0&#8230;</td>
<td width="15%">
<p align="right">&#8230;20</p>
</td>
<td width="20%">
<p align="center">1 			word (4byte)</p>
</td>
<td width="20%">1 			word (4byte)</td>
<td width="22%">“Exploit 			works”</td>
</tr>
</tbody>
</table>
<p style="margin-bottom: 0cm; text-align: justify;">Il registro EIP servirà per dirottare il flusso del programma verso l&#8217;inizio del codice da noi iniettato. Analizzando col debugger l&#8217;esecuzione del programma, si nota che il valore di EBP prima dell&#8217;overflow è 0&#215;0012FF80, mentre lo stack usato per memorizzare i dati inizia all&#8217;offset 0&#215;0012FF6C, che sarà proprio il punto in cui partirà il codice iniettato. Conosciamo quindi i valori delle word di EBP e di EIP, non resta che scrivere il codice da ineittare.<br />
Come ho accennato prima, descriverò un exploit di esempio che non frà altro che stampare a schermo una stringa di testo. E&#8217; ovvio che ci si può spingere oltre e creare i cosiddetti shellcode, ovvero del codice assembly in grado di aprire una shell sul sistema vittima, solitamente con privilegi da amministratore. Alla fine di questo articolo accennerò alla costruzione di uno shellcode, ma un argomento del genere andrebbe approfondito non poco, e richiederebbe un articolo a parte.</p>
<p style="margin-bottom: 0cm; text-align: justify;">Ritornando all&#8217;exploit, per stampare del testo abbiamo bisogno di conoscere l&#8217;offset in cui risiede la stringa e l&#8217;indirizzo  di printf(), che come si è visto prima, è localizzata a 0&#215;00401114. Il codice assembly da iniettare sarà il seguente, per un totale di 3+5+5=13 byte.</p>
<p style="margin-bottom: 0cm;">
<table border="1" cellspacing="0" cellpadding="4" width="408" bordercolor="#000000">
<col width="188"></col>
<col width="202"></col>
<tbody>
<tr valign="top">
<td width="188"><strong><span style="font-family: Courier New;">OPCODES</span></strong></td>
<td width="202"><strong><span style="font-family: Courier New;">ISTRUZIONE</span></strong></td>
</tr>
<tr valign="top">
<td width="188"><span style="font-family: Courier New;">83 EC 20</span></td>
<td width="202"><span style="font-family: Courier New;">SUB ESP, 0&#215;20</span></td>
</tr>
<tr valign="top">
<td width="188"><span style="font-family: Courier New;">68 x1 x2 x3 x4</span></td>
<td width="202"><span style="font-family: Courier New;">PUSH offset(stringa)</span></td>
</tr>
<tr valign="top">
<td width="188"><span style="font-family: Courier New;">E8 y1 y2 y3 y4</span></td>
<td width="202"><span style="font-family: Courier New;">CALL printf()</span></td>
</tr>
</tbody>
</table>
<p style="margin-bottom: 0cm;">
<p style="text-align: justify;">Per raggiungere  i 20 bytes richiesti dall&#8217;overflow, si aggiungono 7 istruzioni NOP alla fine del codice. Gli opcodes sono i codici esadecimali che corrispondono univocamente alle istruzioni assembly; ad esempio 83 EC identifica l&#8217;istruzione SUB ESP, che seguita dal valore 0&#215;20, sottrae 20 byte dal registro EBP. Non rimane che calcolare i valori “x1 x2 x3 x4” e “y1 y2 y3 y4” della PUSH e della CALL. L&#8217;offset della stringa di testo si calcola partendo dall&#8217;indirizzo iniziale del nostro buffer (dove inizia il codice, 0&#215;0012FF6C) a cui si aggiungono i 28 byte del buffer, ottenendo 0&#215;0012FF88. Per calcolare il valore di  y1 y2 y3 y4 occorre invece partire dall&#8217;indirizzo della funzione printf() 0&#215;00401114 a cui bisogna sottrarre l&#8217;offset in cui si trova l&#8217;istruzione CALL, che è dato da 0&#215;0012FF6C+3+5+5 = 0&#215;0012FF79. Quindi otteniamo il valore di 0&#215;002D119B. In definitiva:</p>
<table border="1" cellspacing="0" cellpadding="4" width="455" bordercolor="#000000">
<col width="220"></col>
<col width="217"></col>
<tbody>
<tr valign="top">
<td width="220"><strong><span style="font-family: Courier New;"><span style="font-size: small;">OPCODES</span></span></strong></td>
<td width="217"><strong><span style="font-family: Courier New;"><span style="font-size: small;">S</span></span><span style="font-family: Courier New;"><span style="font-size: small;">I</span></span><span style="font-family: Courier New;"><span style="font-size: small;">TRUZIONE</span></span></strong></td>
</tr>
<tr valign="top">
<td width="220"><span style="font-family: Courier New;"><span style="font-size: small;">83 EC 20</span></span></td>
<td width="217"><span style="font-family: Courier New;"><span style="font-size: small;">SUB ESP, 0&#215;20</span></span></td>
</tr>
<tr valign="top">
<td width="220"><span style="font-family: Courier New;"><span style="font-size: small;">68 88 FF 12 00</span></span></td>
<td width="217"><span style="font-family: Courier New;"><span style="font-size: small;">PUSH 0&#215;0012FF88</span></span></td>
</tr>
<tr valign="top">
<td width="220"><span style="font-family: Courier New;"><span style="font-size: small;">E8 9B 11 2D 00</span></span></td>
<td width="217"><span style="font-family: Courier New;"><span style="font-size: small;">CALL 0&#215;002D119B</span></span></td>
</tr>
<tr valign="top">
<td width="220"><span style="font-family: Courier New;"><span style="font-size: small;">90</span></span></td>
<td width="217"><span style="font-family: Courier New;"><span style="font-size: small;">NOP</span></span></td>
</tr>
<tr valign="top">
<td width="220"><span style="font-family: Courier New;"><span style="font-size: small;">90</span></span></td>
<td width="217"><span style="font-family: Courier New;"><span style="font-size: small;">NOP</span></span></td>
</tr>
<tr valign="top">
<td width="220"><span style="font-family: Courier New;"><span style="font-size: small;">90</span></span></td>
<td width="217"><span style="font-family: Courier New;"><span style="font-size: small;">NOP</span></span></td>
</tr>
<tr valign="top">
<td width="220"><span style="font-family: Courier New;"><span style="font-size: small;">90</span></span></td>
<td width="217"><span style="font-family: Courier New;"><span style="font-size: small;">NOP</span></span></td>
</tr>
<tr valign="top">
<td width="220"><span style="font-family: Courier New;"><span style="font-size: small;">90</span></span></td>
<td width="217"><span style="font-family: Courier New;"><span style="font-size: small;">NOP</span></span></td>
</tr>
<tr valign="top">
<td width="220"><span style="font-family: Courier New;"><span style="font-size: small;">90</span></span></td>
<td width="217"><span style="font-family: Courier New;"><span style="font-size: small;">NOP</span></span></td>
</tr>
<tr valign="top">
<td width="220"><span style="font-family: Courier New;"><span style="font-size: small;">90</span></span></td>
<td width="217"><span style="font-family: Courier New;"><span style="font-size: small;">NOP</span></span></td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">Va specificato che gli indirizzi e gli offset delle istruzioni assembly vanno scritti al contrario, cioè leggendoli da destra verso sinistra. Per creare un file di input di fatto in questo modo basta ricorrere ad un <a href="http://mindunpacked.com/risorse/file_gen.cpp">semplice programma in c++</a> che unisca vari pezzi dell&#8217;exploit scrivendoli su di un unico file “input.txt”. Usando il file così generato come input per il programma mostrato ad inizio articolo, l&#8217;exploit prenderà il controllo del programma visualizzando la stringa “Exploit works”. In ogni caso, al termine della funzione printf() il programma si trova in un punto indefinito, e quindi andrà in crash comunque. Ciò si può evitare aggiungendo una chiamata ad una funzione come exit().</p>
<p><strong>Windows Shellcoding</strong></p>
<p style="text-align: justify;">Non approfondirò questo argomento, sarebbe troppo lungo e andrebbe aldilà dello scopo di questi articoli. Scrivere degli shellcode è complesso, e non cambia solo da sistema a sistema ma addirittura a seconda delle diverse versioni dello stesso. In generale uno shellcode dovrebbe aprire una shell sul sistema vittima, ma può essere usato per richiamare qualsiasi funzione di sistema approfittando dei privilegi del programma vulnerabile al buffer overflow. La difficoltà di scrivere shellcode universali è appunto dovuto al fatto che gli indirizzi delle varie funzioni cambiano a seconda del sistema. In windows è possibile risalire a tali indirizzi con un <a href="http://mindunpacked.com/risorse/arwin.c">comodo programma di nome arwin</a>. Esso permette di estrapolare l&#8217;indirizzo di una funzione presente in una determinata libreria di sistema (DLL).</p>
<p>C:\&gt;arwin kernel32.dll GetProcAddressarwin<br />
- win32 address resolution program &#8211; by steve hanna &#8211; v.01<br />
GetProcAddress is located at <strong>0&#215;77e7b332</strong> in kernel32.dll</p>
<p style="text-align: justify;">In questo caso siamo riusciti a capire l&#8217;indirizzo della funzione GetProcAddres, che fra l&#8217;altro è molto utile per risalire a qualsiasi altra API di sistema. Il codice da iniettare dovrà essere scritto usando gli indirizzi così ricavati, avrete quindi capito che  con uno shellcode si può fare qualsiasi cosa, capacità di programmazione assembly permettendo. <img src='http://mindunpacked.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/buffer-overflow-windows/feed/</wfw:commentRss>
		<slash:comments>1</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 -->
