{"id":859,"date":"2010-10-18T14:25:12","date_gmt":"2010-10-18T13:25:12","guid":{"rendered":"http:\/\/www.donatantonio.net\/blog\/?p=859"},"modified":"2016-12-22T12:34:18","modified_gmt":"2016-12-22T11:34:18","slug":"crittografia-con-phpblowfish","status":"publish","type":"post","link":"https:\/\/www.donatantonio.net\/blog\/guide_tutorial\/php\/crittografia-con-phpblowfish\/","title":{"rendered":"Crittografia con Php\/Blowfish"},"content":{"rendered":"<p>In questo articolo vedremo come utilizzare l&#8217;algoritmo Blowfish per cifrare un testo in chiaro.<br \/>\nInnazitutto <strong>Blowfish<\/strong> \u00e8 un algoritmo a chiave simmetrica a blocchi, ideato nel 1993 da Bruce Schneier e implementato in molti software di crittografia.<br \/>\nQuest\u2019algoritmo utilizza varie tecniche tra le quali la rete Feistel, le S-box dipendenti da chiavi e funzioni F non invertibili che lo rendono, forse, l\u2019algoritmo pi\u00f9 sicuro attualmente disponibile. Le chiavi utilizzate sono di dimensioni variabili fino ad un massimo di 448 bit e i blocchi utilizzati per la cifratura sono di 64 bit. Non si conoscono al momento tecniche di attacco valide nei suoi confronti. E&#8217; considerato uno degli algoritmi di cifratura a blocchi pi\u00f9 veloce (risulta pi\u00f9 veloce di DES e IDEA). Blowfish non \u00e8 brevettato ed \u00e8 di dominio pubblico.<\/p>\n<p>Evitando di entrare nel cuore dell&#8217;algoritmo (troppo complesso per essere spiegato in questa sede), realizzeremo una classe php che inglobi l&#8217;algoritmo fornendoci essenzialmente solo i metodi che ci interessano:<\/p>\n<ul>\n<li>Impostare la chiave<\/li>\n<li>Cifrare un testo<\/li>\n<li>Decifrare un testo<\/li>\n<\/ul>\n<p>Inoltre realizzeremo uno script di test e un form html per verificare il risultato finale.<br \/>\nDi seguito il codice della classe Crittografia:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;?php \r\n\/\/ Richiamo il codice che implementa Blowfish\r\nrequire_once('blowfish.php');\r\n\r\nclass Crittografia{\r\n\tvar $chiave;\r\n\tvar $blowfish;\r\n\r\n\t\/\/ Costruttore della classe Crittografia - prende in input la chiave in chiaro\r\n\tfunction Crittografia($stringa){\r\n\t\t$this-&gt;chiave = $stringa;\r\n\t}\r\n\r\n\t\/\/ Funzione di codifica di un testo in chiaro\r\n\tfunction cifratura($stringa){   \r\n\t\t$this-&gt;blowfish = new Horde_Cipher_blowfish;\r\n\t\t$encrypt = '';\r\n\t\t$mod = strlen($stringa) % 8;\r\n\t\tif ($mod &gt; 0) {\r\n\t\t\t$stringa .= str_repeat(&quot;&#92;&#48;&quot;, 8 - $mod);\r\n\t\t}\r\n\t\tforeach (str_split( $stringa, 8 ) as $chunk){\r\n\t\t\t$encrypt .= $this-&gt;blowfish-&gt;encryptBlock($chunk, $this-&gt;getChiave());\r\n\t\t}\r\n\t\treturn base64_encode($encrypt);\r\n\t}\r\n\r\n\t\/\/ Funzione di decodifica di un testo cifrato\r\n\tfunction decifratura($stringa){\r\n\t\t$this-&gt;blowfish = new Horde_Cipher_blowfish;\r\n\t\t$decrypt = '';\r\n\t\t$data = base64_decode($stringa);\r\n\t\tforeach (str_split( $data, 8 ) as $chunk){\r\n\t\t\t$decrypt .= $this-&gt;blowfish-&gt;decryptBlock($chunk, $this-&gt;getChiave());\r\n\t\t}\r\n\t\treturn trim($decrypt);\r\n\t}\r\n\r\n\t\/\/ Funzione per restituzione della chiave\r\n\tfunction getChiave(){\r\n\t\treturn $this-&gt;chiave;\r\n\t}\r\n}\r\n?&gt;\r\n<\/pre>\n<p>La classe Crittografia far\u00e0 uso dei metodi dell&#8217;algoritmo Blowfish, quindi il codice inizia con il <strong>require<\/strong> della classe.<br \/>\nIl costruttore della classe \u00e8 molto semplice, infatti acquisisce in input una stringa che sar\u00e0 la chiave utilizzata per la cifratura\/decifratura.<br \/>\nDi seguito i metodi fondamentali, cifratura e decifratura. Entrambi prendono come parametro una stringa e restituiscono una nuova stringa che nel primo caso sar\u00e0 il testo cifrato e viceversa nel secondo caso sar\u00e0 il testo in chiaro.<br \/>\nAll&#8217;interno di entrambi i metodi viene istanziato l&#8217;oggetto <strong>Horde_Cipher_blowfish<\/strong> e viene suddivisa la stringa di input in gruppi di 8 caratteri per effettuare la cifratura\/decifratura un blocco per volta.<br \/>\nVediamo quindi in che modo richiamare la classe Crittografia:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;?php \r\n\/\/ Richiamo la classe\r\nrequire_once 'crittografia.php';\r\n\r\n\/\/ Istanzio l'oggetto Crittografia con chiave $chiave\r\n$blowfish = new Crittografia($chiave);\r\n\r\n\/\/ Cifro un testo $txt\r\n$txt_cifrato = $blowfish-&gt;cifratura($txt);\r\n\r\n\/\/ Decifro il testo ottenuto dalla cifratura\r\n$txt_originale = $blowfish-&gt;decifratura($txt_cifrato);\r\n?&gt;\r\n<\/pre>\n<p>All&#8217;interno della cartella contenente il codice completo sono presenti i seguenti file:<\/p>\n<ul>\n<li>blowfish.php (l&#8217;algoritmo di cifratura)<\/li>\n<li>crittografia.php (la classe che inbloba l&#8217;algoritmo blowfish)<\/li>\n<li>test.php (lo script che effettua la cifratura\/decifratura)<\/li>\n<li>index.html (un form per il test di coppie chiave-testo in chiaro)<\/li>\n<\/ul>\n<p><strong>Cliccando <a href=\"http:\/\/www.donatantonio.net\/script\/phpBlowfish\/index.html\" target=\"_blank\">qui<\/a><\/strong> \u00e8 possibile vedere in azione il codice.<\/p>\n<p><strong>Cliccando <a href=\"http:\/\/www.donatantonio.net\/script\/phpBlowfish.rar\" target=\"_blank\">qui<\/a><\/strong> \u00e8 possibile scaricare il codice.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo articolo vedremo come utilizzare l&#8217;algoritmo Blowfish per cifrare un testo in chiaro.<br \/>\nInnazitutto Blowfish \u00e8 un algoritmo a chiave simmetrica a blocchi, ideato nel 1993 da Bruce Schneier e implementato in molti software di crittografia.<br \/>\nQuest\u2019algoritmo utilizza varie tecniche tra le quali la rete Feistel, le S-box dipendenti da chiavi e funzioni F non invertibili che lo rendono, forse, l\u2019algoritmo pi\u00f9 sicuro attualmente disponibile. Le chiavi utilizzate sono di dimensioni variabili fino ad un massimo di 448 bit e i blocchi utilizzati per la cifratura sono di 64 bit. Non si conoscono al momento tecniche di attacco valide nei suoi confronti. E&#8217; considerato uno degli algoritmi di cifratura a blocchi pi\u00f9 veloce (risulta pi\u00f9 veloce di DES e IDEA). Blowfish non \u00e8 brevettato ed \u00e8 di dominio pubblico.<\/p>\n<p>Evitando di entrare nel cuore dell&#8217;algoritmo (troppo complesso per essere spiegato in questa sede), realizzeremo una classe php che inglobi l&#8217;algoritmo fornendoci essenzialmente solo i metodi che ci interessano:<\/p>\n<p>Impostare la chiave<br \/>\nCifrare un testo<br \/>\nDecifrare un testo<\/p>\n<p>Inoltre realizzeremo uno script di test e un form html per verificare il risultato finale.<br \/>\nDi seguito il codice della classe Crittografia:<\/p>\n<p>&lt;?php<br \/>\n\/\/ Richiamo il codice che implementa Blowfish<br \/>\nrequire_once(&#8216;blowfish.php&#8217;);<\/p>\n<p>class Crittografia{<br \/>\n\tvar $chiave;<br \/>\n\tvar $blowfish;<\/p>\n<p>\t\/\/ Costruttore della classe Crittografia &#8211; prende in input la chiave in chiaro<br \/>\n\tfunction Crittografia($stringa){<br \/>\n\t\t$this-&gt;chiave = $stringa;<br \/>\n\t}<\/p>\n<p>\t\/\/ Funzione di codifica di un testo in chiaro<br \/>\n\tfunction cifratura($stringa){<br \/>\n\t\t$this-&gt;blowfish = new Horde_Cipher_blowfish;<br \/>\n\t\t$encrypt = &#8221;;<br \/>\n\t\t$mod = strlen($stringa) % 8;<br \/>\n\t\tif ($mod &gt; 0) {<br \/>\n\t\t\t$stringa .= str_repeat(&quot;&#92;&#48;&quot;, 8 &#8211; $mod);<br \/>\n\t\t}<br \/>\n\t\tforeach (str_split( $stringa, 8 ) as $chunk){<br \/>\n\t\t\t$encrypt .= $this-&gt;blowfish-&gt;encryptBlock($chunk, $this-&gt;getChiave());<br \/>\n\t\t}<br \/>\n\t\treturn base64_encode($encrypt);<br \/>\n\t}<\/p>\n<p>\t\/\/ Funzione di decodifica di un testo cifrato<br \/>\n\tfunction decifratura($stringa){<br \/>\n\t\t$this-&gt;blowfish = new Horde_Cipher_blowfish;<br \/>\n\t\t$decrypt = &#8221;;<br \/>\n\t\t$data = base64_decode($stringa);<br \/>\n\t\tforeach (str_split( $data, 8 ) as $chunk){<br \/>\n\t\t\t$decrypt .= $this-&gt;blowfish-&gt;decryptBlock($chunk, $this-&gt;getChiave());<br \/>\n\t\t}<br \/>\n\t\treturn trim($decrypt);<br \/>\n\t}<\/p>\n<p>\t\/\/ Funzione per restituzione della chiave<br \/>\n\tfunction getChiave(){<br \/>\n\t\treturn $this-&gt;chiave;<br \/>\n\t}<br \/>\n}<br \/>\n?&gt;<\/p>\n<p>La classe Crittografia far\u00e0 uso dei metodi dell&#8217;algoritmo Blowfish, quindi il codice inizia con il require della classe.<br \/>\nIl costruttore della classe \u00e8 molto semplice, infatti acquisisce in input una stringa che sar\u00e0 la chiave utilizzata per la cifratura\/decifratura.<br \/>\nDi seguito i metodi fondamentali, cifratura e decifratura. Entrambi prendono come parametro una stringa e restituiscono una nuova stringa che nel primo caso sar\u00e0 il testo cifrato e viceversa nel secondo caso sar\u00e0 il testo in chiaro.<br \/>\nAll&#8217;interno di entrambi i metodi viene istanziato l&#8217;oggetto Horde_Cipher_blowfish e viene suddivisa la stringa di input in gruppi di 8 caratteri per effettuare la cifratura\/decifratura un blocco per volta.<br \/>\nVediamo quindi in che modo richiamare la classe Crittografia:<\/p>\n<p>&lt;?php<br \/>\n\/\/ Richiamo la classe<br \/>\nrequire_once &#8216;crittografia.php&#8217;;<\/p>\n<p>\/\/ Istanzio l&#8217;oggetto Crittografia con chiave $chiave<br \/>\n$blowfish = new Crittografia($chiave);<\/p>\n<p>\/\/ Cifro un testo $txt<br \/>\n$txt_cifrato = $blowfish-&gt;cifratura($txt);<\/p>\n<p>\/\/ Decifro il testo ottenuto dalla cifratura<br \/>\n$txt_originale = $blowfish-&gt;decifratura($txt_cifrato);<br \/>\n?&gt;<\/p>\n<p>All&#8217;interno della cartella contenente il codice completo sono presenti i seguenti file:<\/p>\n<p>blowfish.php (l&#8217;algoritmo di cifratura)<br \/>\ncrittografia.php (la classe che inbloba l&#8217;algoritmo blowfish)<br \/>\ntest.php (lo script che effettua la cifratura\/decifratura)<br \/>\nindex.html (un form per il test di coppie chiave-testo in chiaro)<\/p>\n<p>Cliccando qui \u00e8 possibile vedere in azione il codice.<\/p>\n<p>Cliccando qui \u00e8 possibile scaricare il codice.<\/p>\n","protected":false},"author":1,"featured_media":2478,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[27],"tags":[199,189,191,190,188],"_links":{"self":[{"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/posts\/859"}],"collection":[{"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/comments?post=859"}],"version-history":[{"count":1,"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/posts\/859\/revisions"}],"predecessor-version":[{"id":2532,"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/posts\/859\/revisions\/2532"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/media\/2478"}],"wp:attachment":[{"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/media?parent=859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/categories?post=859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.donatantonio.net\/blog\/wp-json\/wp\/v2\/tags?post=859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}