<?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>Blog de Chris &#187; Java</title>
	<atom:link href="https://blog.developpez.com/chris/pcategory/java/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/chris</link>
	<description></description>
	<lastBuildDate>Mon, 19 Apr 2010 19:00:00 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Mémo &#8211; Gestion des flags à l&#8217;aide d&#8217;opérateurs binaires</title>
		<link>https://blog.developpez.com/chris/p7125/java/memo_gestion_des_flags_a_l_aide_d_operat</link>
		<comments>https://blog.developpez.com/chris/p7125/java/memo_gestion_des_flags_a_l_aide_d_operat#comments</comments>
		<pubDate>Mon, 26 Jan 2009 22:12:05 +0000</pubDate>
		<dc:creator><![CDATA[jproto]]></dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Suite à des questions récurrentes, voici un petit mémo sur l&#8217;utilisation des opérateurs binaires pour gérer de simples flags. Je ne rentrerai pas dans le détail, il existe de très bons tutoriel à ce sujet sur ce site. Je soulignerai juste que ce que j&#8217;illustre ici en java est réalisable dans n&#8217;importe quel langage possédant les opérateurs binaires (OR, AND, et NOT). L&#8217;exploitation la plus courante est donc la suivante : Placement d&#8217;un flag : [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Suite à des questions récurrentes, voici un petit mémo sur l&rsquo;utilisation des opérateurs binaires pour gérer de simples flags.<br />
<span id="more-4"></span><br />
Je ne rentrerai pas dans le détail, il existe de très bons tutoriel à ce sujet sur ce site.<br />
<em>Je soulignerai juste que ce que j&rsquo;illustre ici en java est réalisable dans n&rsquo;importe quel langage possédant les opérateurs binaires (OR, AND, et NOT).</em></p>
<p>L&rsquo;exploitation la plus courante est donc la suivante :</p>
<ol>
<li><strong>Placement d&rsquo;un flag :</strong><br />
<code class="codecolorer text default"><span class="text">flagSet = flagSet | f; &nbsp; &nbsp;// Fixe le flag f dans flagSet</span></code><br />
ou<br />
<code class="codecolorer text default"><span class="text">flagSet |= f;</span></code></p>
</li>
<li><strong>Retrait d&rsquo;un flag :</strong><br />
<code class="codecolorer text default"><span class="text">flagSet = flagSet &amp; ~f; &nbsp; &nbsp;// Désactive le flag f dans flagSet</span></code><br />
ou<br />
<code class="codecolorer text default"><span class="text">flagSet &amp;= ~f;</span></code></p>
</li>
<li><strong>Contrôle d&rsquo;un flag :</strong><br />
<code class="codecolorer text default"><span class="text">if((flagSet &amp; f) != 0) &nbsp; &nbsp;// Teste si le flag f est fixé dans flagSet</span></code></p>
</li>
</ol>
<p>Il n&rsquo;est pas rare de voir des fonctions codées pour assurer ce type de gestion car les opérateurs binaires font parfois <em>&laquo;&nbsp;peur&nbsp;&raquo;</em>.<br />
A part dans un cadre d&rsquo;encapsulation, je ne suis pas partisan dune telle solution. Ce mémo de quelques lignes tend à monter combien cette gestion est simple, et l&rsquo;impact de fonctions sur des tests aussi rudimentaires peut avoir un impact sur les performances.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ubuntu en USB Live (4/4) &#8211; Installation de Subversion</title>
		<link>https://blog.developpez.com/chris/p7003/java/ubuntu_en_usb_live_4_4_installation_de_s</link>
		<comments>https://blog.developpez.com/chris/p7003/java/ubuntu_en_usb_live_4_4_installation_de_s#comments</comments>
		<pubDate>Sun, 28 Dec 2008 19:00:00 +0000</pubDate>
		<dc:creator><![CDATA[jproto]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dernière exigence à satisfaire : installer un serveur Subversion sur ma clef. Le principe retenu est le suivant : L&#8217;administration SVN est installée sur la partition Ubuntu, alors que les repositories seront créés sur la partition de données. Ainsi, les repositories pourront éventuellement être exploités à partir d&#8217;un autre système possédant un serveur SVN. Pour l&#8217;installation du module administration de SVN (le serveur), tout est très simple et se résume à une ligne de commande [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dernière exigence à satisfaire : installer un serveur Subversion sur ma clef.</p>
<p>Le principe retenu est le suivant :<br />
L&rsquo;administration SVN est installée sur la partition Ubuntu, alors que les repositories seront créés sur la partition de données.<br />
Ainsi, les repositories pourront éventuellement être exploités à partir d&rsquo;un autre système possédant un serveur SVN.<br />
<span id="more-10"></span></p>
<p>Pour l&rsquo;installation du module administration de SVN (le serveur), tout est très simple et se résume à une ligne de commande :<br />
<code class="codecolorer text default"><span class="text">sudo apt-get install subversion</span></code><br />
J&rsquo;adore les choses simples !</p>
<p>A présent, il est possible de créer des repositories n&rsquo;importe où, donc aussi sur la partition de données.</p>
<ol>
<li>Se placer dans l&rsquo;arborescence désirée : <code class="codecolorer text default"><span class="text">cd /media/Chris-Data</span></code></li>
<li>Créer un répertoire destiné à accueillir l&rsquo;ensemble des repositories que l&rsquo;on souhaite gérer (Ce n&rsquo;est pas obligatoire, mais je compte en gérer plusieurs).<br />
<code class="codecolorer text default"><span class="text">mkdir SVN</span></code></li>
<li>Créer le repository souhaité (pour les détails de gestion d&rsquo;un repository SVN, je vous invite à vous reporter à la <a href="http://svnbook.red-bean.com/">doc officielle</a>) :<br />
<code class="codecolorer text default"><span class="text">svnadmin create /media/Chris-Data/SVN/Projet1</span></code></li>
</ol>
<p>Il n&rsquo;y a plus qu&rsquo;à utiliser n&rsquo;importe quel client SVN pour se connecter au repository créé.</p>
<p>Vous notez qu&rsquo;il n&rsquo;y a ici aucune gestion des droits, c&rsquo;est parce que nous sommes sur la partition de données.<br />
Si vous souhaitiez installer votre repository dans une arborescence du système telle que <code class="codecolorer text default"><span class="text">/usr</span></code>, il faudrait précéder l&rsquo;ensemble des commandes par <code class="codecolorer text default"><span class="text">sudo &lt;commande&gt;</span></code>.<br />
De plus, il faudrait rendre au compte ubuntu (<em>compte à travers nous sommes loggés en mode USB Live</em>) la propriété du répertoire afin de lui en permettre l&rsquo;administration :<br />
<code class="codecolorer text default"><span class="text">sudo chown -R ubuntu /media/Chris-Data/SVN</span></code></p>
<p>Je pense avoir fait le tour des exigences initiales.<br />
Il me reste donc à exploiter ce système au quotidien pour déceler ce qui pourrait m&rsquo;y manquer.<br />
Il faudra aussi que je me penche sur les possibilités de sauvegardes simples de cette partition système &#8230; on n&rsquo;est jamais à l&rsquo;abri d&rsquo;une petite bêtise.</p>
<p>Bien sûr, si vous exploitez déjà ce type de système, je suis preneur de tout retour d&rsquo;expérience.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu en USB Live (3/4) &#8211; Installation de NetBeans</title>
		<link>https://blog.developpez.com/chris/p7002/java/ubuntu_en_usb_live_3_4_installation_de_n</link>
		<comments>https://blog.developpez.com/chris/p7002/java/ubuntu_en_usb_live_3_4_installation_de_n#comments</comments>
		<pubDate>Sun, 28 Dec 2008 19:00:00 +0000</pubDate>
		<dc:creator><![CDATA[jproto]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour ce qui est de l&#8217;installation de NetBeans, il n&#8217;y a pas vraiment de quoi écrire un billet. Mais qu&#8217;à cela ne tienne, j&#8217;ai décidé de découper l&#8217;ensemble des points de mon installation en billets, je m&#8217;y tiens ! La démarche suivie est donc la suivante : Téléchargement de la version de NetBeans désirée (ici). Pour ma part, je me contente d&#8217;une version Java SE. De toute façon, tous les modules supplémentaires sont récupérable directement [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Pour ce qui est de l&rsquo;installation de NetBeans, il n&rsquo;y a pas vraiment de quoi écrire un billet.<br />
Mais qu&rsquo;à cela ne tienne, j&rsquo;ai décidé de découper l&rsquo;ensemble des points de mon installation en billets, je m&rsquo;y tiens !<br />
<span id="more-9"></span></p>
<p>La démarche suivie est donc la suivante :
<ol>
<li>Téléchargement de la version de NetBeans désirée (<a href="http://www.netbeans.org/downloads/index.html">ici</a>). Pour ma part, je me contente d&rsquo;une version Java SE. <em>De toute façon, tous les modules supplémentaires sont récupérable directement via le gestionnaire de plugins de NetBeans.</em><br />
On récupère alors un fichier <strong>*.sh</strong> (netbeans-6.5-ml-javase-linux.sh pour ma part)</li>
<li>Ajout des droits d&rsquo;exécution au fichier :<strong> chmod +x ./netbeans-6.5-ml-javase-linux.sh</strong></li>
<li>Lancement de l&rsquo;installateur en tant qu&rsquo;administrateur : <strong>sudo ./netbeans-6.5-ml-javase-linux.sh</strong><br />
A ce niveau, il suffit de suivre les étapes.<br />
Par défaut, l&rsquo;installation se réalise dans le répertoire <em>/usr/local/netbeans-6.5</em> ce qui me va très bien.
</li>
</ol>
<p>Le tour est joué. Nous pouvons à présent lancer le nouveau venu à travers le menu &laquo;&nbsp;Applications > Programmation > NetBeans IDE 6.5&Prime;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu en USB Live (2/4) &#8211; Installation d&#8217;un JDK</title>
		<link>https://blog.developpez.com/chris/p7001/java/ubuntu_en_usb_live_2_4_installation_d_un</link>
		<comments>https://blog.developpez.com/chris/p7001/java/ubuntu_en_usb_live_2_4_installation_d_un#comments</comments>
		<pubDate>Sun, 28 Dec 2008 19:00:00 +0000</pubDate>
		<dc:creator><![CDATA[jproto]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans un premier lieu, j&#8217;ai essayé de télécharger le jdk sur le site de sun. J&#8217;ai donc récupéré un fichier jdk-6u11-linux-i586.bin auquel j&#8217;ai donné des droits d&#8217;exécution, et que j&#8217;ai lancé ainsi : . ./jdk-6u11-linux-i586.bin Évidemment, si j&#8217;écris quelques lignes sur le sujet, c&#8217;est que les choses ne ce sont pas déroulées comme prévu. Bref, j&#8217;ai eu le droit d&#8217;accepter les conditions de la licence d&#8217;exploitation, et &#8230; c&#8217;est tout! L&#8217;installation se plante lamentablement. J&#8217;ai [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans un premier lieu, j&rsquo;ai essayé de télécharger le jdk sur le site de <a href="http://java.sun.com/javase/downloads/index.jsp">sun</a>.<br />
J&rsquo;ai donc récupéré un fichier <strong>jdk-6u11-linux-i586.bin</strong> auquel j&rsquo;ai donné des droits d&rsquo;exécution, et que j&rsquo;ai lancé ainsi : <code class="codecolorer text default"><span class="text">. ./jdk-6u11-linux-i586.bin</span></code></p>
<p>Évidemment, si j&rsquo;écris quelques lignes sur le sujet, c&rsquo;est que les choses ne ce sont pas déroulées comme prévu. Bref, j&rsquo;ai eu le droit d&rsquo;accepter les conditions de la licence d&rsquo;exploitation, et &#8230; c&rsquo;est tout! </p>
<p>L&rsquo;installation se plante lamentablement. J&rsquo;ai certainement dû rater une étape quelque part, quoi qu&rsquo;il en soit, je vais présenter ici une solution alternative qui semblera évidente aux aficionados d&rsquo;Ubuntu, mais en ce qui me concerne, je ne suis qu&rsquo;un utilisateur.<br />
<span id="more-8"></span></p>
<p>Il ne s&rsquo;agit pas là d&rsquo;une installation totalement manuelle, mais au contraire, manuelle au strict minimum (je sais, certains crient déjà au sacrilège).</p>
<p>Tout le monde s&rsquo;en sera rendu compte, j&rsquo;aime les choses simples.</p>
<p>Voici donc comment je m&rsquo;y suis pris :
<ol>
<li>Activation de repositories &laquo;&nbsp;universe&nbsp;&raquo; et &laquo;&nbsp;multiverse&nbsp;&raquo; dans le gestionnaire de paquets Synaptic.<br />
&laquo;&nbsp;System > Administration > Gestionnaire de paquets Synaptic&nbsp;&raquo;<br />
Choisir &laquo;&nbsp;Setting > Repositories&nbsp;&raquo;<br />
Cocher les options &laquo;&nbsp;<em>Community-maintained Open Source software (universe)</em>&nbsp;&raquo; et &laquo;&nbsp;<em>Software restricted by copyright or legal issues (multiverse)</em>&laquo;&nbsp;</li>
<li>Lancement de l&rsquo;installation : <code class="codecolorer text default"><span class="text">sudo apt-get install sun-java6-jdk</span></code><br />
A ce niveau, les paquets nécessaires vont être téléchargés automatiquement. Il suffit donc de tout accepter.<br />
L&rsquo;installation se réalise automatiquement dans le répertoire <code class="codecolorer text default"><span class="text">/usr/lib/jvm/java-6-sun-1.6.0.10</span></code></li>
<li>Alimentation des variables d&rsquo;environnement :<br />
A cette fin, le fichier <strong>~/.bashrc</strong> doit être complété ainsi :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># Environnement JAVA <br />
export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.10 <br />
export PATH=$PATH:$JAVA_HOME/bin</div></div>
</li>
</ol>
<p>Et c&rsquo;est tout. Je vous avais dis que j&rsquo;aimais les choses simples : trois étapes, c&rsquo;est raisonnable.</p>
<p>Un petit test pour rassurer tout le monde :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ubuntu@ubuntu:~$ java -version <br />
java version &quot;1.6.0_10&quot; <br />
Java(TM) SE Runtime Environment (build 1.6.0_10-b33) <br />
Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)</div></div>
<p>Nous sommes prêts à coder comme des fous !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ubuntu en USB Live (1/4)</title>
		<link>https://blog.developpez.com/chris/p7000/java/ubuntu_en_usb_live</link>
		<comments>https://blog.developpez.com/chris/p7000/java/ubuntu_en_usb_live#comments</comments>
		<pubDate>Sun, 28 Dec 2008 19:00:00 +0000</pubDate>
		<dc:creator><![CDATA[jproto]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cette année, le père Noël m&#8217;a offert une grosse clef USB. J&#8217;y vois là l&#8217;occasion de me créer un petit chez moi portable. Je suis prestataire, et je n&#8217;ai pas toujours l&#8217;occasion de pouvoir personnaliser mon environnement de travail tel que je le désire (d&#8217;ailleurs, je ne le souhaite pas). L&#8217;idée est donc de pouvoir me connecter via, à peu près, n&#8217;importe quel PC directement dans mon environnement. Ledit environnement doit comporter les éléments suivants [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Cette année, le père Noël m&rsquo;a offert une grosse clef USB.<br />
J&rsquo;y vois là l&rsquo;occasion de me créer un <em>petit chez moi portable</em>.<br />
Je suis prestataire, et je n&rsquo;ai pas toujours l&rsquo;occasion de pouvoir personnaliser mon environnement de travail tel que je le désire (d&rsquo;ailleurs, je ne le souhaite pas).<br />
L&rsquo;idée est donc de pouvoir me connecter via, à peu près, n&rsquo;importe quel PC directement dans <strong>mon</strong> environnement.<br />
<span id="more-7"></span></p>
<p>Ledit environnement doit comporter les éléments suivants :
<ol>
<li>un espace de stockage de données accessible depuis Windows</li>
<li>une suite bureautique (de préférence OpenOffice)</li>
<li>un environnement de développement Java (un JDK Sun récent et mon EDI de prédilection NetBeans)</li>
<li>un entrepôt de données (SubVersion évidemment)</li>
</ol>
<p>Pour le reste, je verrai à l&rsquo;utilisation. Je pense avoir fait là un tour déjà intéressant.</p>
<p>Dans ce billet, je vais donc brièvement aborder la création de l&rsquo;environnement général. En effet, à ce stade, Ubuntu fait tout pour nous.</p>
<p>La subtilité à garder en tête est que je souhaite un espace de stockage de données accessible depuis Windows, bref une partition dédiée.<br />
A ce stade, Windows n&rsquo;est plus notre ami. En effet, il ne gère pas les partitions multiples pour les clefs USB. Il n&rsquo;est capable de jouer qu&rsquo;avec la première partition d&rsquo;une clef (<em>en tout cas, sous XP, je ne sais pas ce qu&rsquo;il en est sous Vista</em>).<br />
Il faut donc prendre soin à créer une première partition (en FAT32) qui accueillera les données partagées, et une seconde partition qui accueillera Ubuntu.</p>
<p>Tout ceci se réalise à partir d&rsquo;une version CD Live d&rsquo;Ubuntu disponible <a href="http://www.ubuntu.com/getubuntu/download">ici</a>.<br />
Il suffit de graver l&rsquo;image obtenue et de booter sur le CD obtenu.</p>
<p>Les deux partitions peuvent alors être créées à l&rsquo;aide de l&rsquo;éditeur de partition (System > Administration > Partition Editor).</p>
<p>Pour ma part, j&rsquo;ai réparti mon espace ainsi :<br />
&#8211; partition 1 : 28 Go de données en FAT32<br />
&#8211; partition 2 : 2 Go de système (Ubuntu) en FAT32 avec les flags &laquo;&nbsp;lba&nbsp;&raquo; et &laquo;&nbsp;boot&nbsp;&raquo;</p>
<p>Ensuite, Ubuntu s&rsquo;occupe de tout via l&rsquo;option &laquo;&nbsp;Créer une clef USB bootable&nbsp;&raquo; (System > Administration > Create a USB startup disk).<br />
En ce qui me concerne, j&rsquo;avais conservé l&rsquo;image du disque Ubuntu sur mon disque dur. Je l&rsquo;ai donc prise comme référence pour créer mon nouveau système. Par défaut, il propose de prendre pour référence l&rsquo;installation courante (celle du CD Live), mais je n&rsquo;ai pas eu beaucoup de succès avec cette option.<br />
Il n&rsquo;y a plus qu&rsquo;à indiquer la bonne partition de destination, et attendre que cela se passe.</p>
<p>Voilà, vous y êtes.</p>
<p>Assurez-vous que votre séquence de boot prenne en compte les ports USB avant votre disque dur, et redémarrez en laissant la clef branchée : votre nouveau système est prêt et fonctionne sur presque tous les PC récents.</p>
<p>Vous remarquerez que cette mise en œuvre répond directement aux 2 premières attentes de mon environnement puisque OpenOffice est en place en standard avec Ubuntu.</p>
<p>Pour résumé si vous bootez sur :<br />
&#8211; la clef, vous démarrez Ubuntu (via la seconde partition) et vous accédez à vos données (via la première partition)<br />
&#8211; le disque dur, vous démarrez votre système d&rsquo;exploitation standard (XP dans mon cas), et lorsque vous branchez la clef USB, vous accédez à vos données (via la première partition)</p>
<p>A suivre pour la mise en place de mon environnement de dev.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android mis à disposition en Open Source</title>
		<link>https://blog.developpez.com/chris/p6617/java/android_en_open_source</link>
		<comments>https://blog.developpez.com/chris/p6617/java/android_en_open_source#comments</comments>
		<pubDate>Tue, 21 Oct 2008 20:55:03 +0000</pubDate>
		<dc:creator><![CDATA[jproto]]></dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour ceux qui ont manqués l&#8217;info du jour, Google a livré à la communauté Open Source sa machine virtuelle mobile : Android. On regrettera peut être que l&#8217;environnement ne soit pas encore disponible sous Windows, mais c&#8217;est l&#8217;occasion pour les fainéants (comme moi) de se mettre au développement sous Linux. Amusez-vous bien.]]></description>
				<content:encoded><![CDATA[<p>Pour ceux qui ont manqués l&rsquo;info du jour, Google a livré à la communauté Open Source sa machine virtuelle mobile : <a href="http://source.android.com/posts/opensource">Android</a>.<br />
On regrettera peut être que l&rsquo;environnement ne soit pas encore disponible sous Windows, mais c&rsquo;est l&rsquo;occasion pour les fainéants (comme moi) de se mettre au développement sous Linux.</p>
<p>Amusez-vous bien.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Cryptage PGP à l&#8217;aide des librairies Bouncy Castle</title>
		<link>https://blog.developpez.com/chris/p5807/java/cryptage_pgp_a_l_aide_des_librairies_bou</link>
		<comments>https://blog.developpez.com/chris/p5807/java/cryptage_pgp_a_l_aide_des_librairies_bou#comments</comments>
		<pubDate>Tue, 03 Jun 2008 20:05:42 +0000</pubDate>
		<dc:creator><![CDATA[jproto]]></dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je me suis frotté récemment au problème de cryptage sous java. Pour cela, j&#8217;avais quelques contraintes : je n&#8217;ai pas grand chose de connaissances en matière de cryptographie mon programme doit tourner sous une JDK 1.3 (oui &#8230; la honte) Pour ce qui est des concepts généraux, je ne peux que remercier Razgriz de la présentation qu&#8217;il m&#8217;en à fait. Pour ce qui est de la compatibilité avec un JDK 1.3, mes recherches m&#8217;ont fait [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Je me suis frotté récemment au problème de cryptage sous java.</p>
<p>Pour cela, j&rsquo;avais quelques contraintes :</p>
<ul>
<li>je n&rsquo;ai pas grand chose de connaissances en matière de cryptographie</li>
<li>mon programme doit tourner sous une JDK 1.3 (<em>oui &#8230; la honte</em>)</li>
</ul>
<p><span id="more-2"></span><br />
Pour ce qui est des concepts généraux, je ne peux que remercier <strong>Razgriz</strong> de la présentation qu&rsquo;il m&rsquo;en à fait.</p>
<p>Pour ce qui est de la compatibilité avec un JDK 1.3, mes recherches m&rsquo;ont fait aboutir sur les librairies <a href="http://www.bouncycastle.org/fr/index.html">Bouncy Castle</a> qui ont le bon gout d&rsquo;être compatible avec de vieilles versions java (<em>et d&rsquo;utilisation gratuite</em>).</p>
<p>Bref, les principes généraux acquis et la solution identifiée, je ne voyais plus ce qui pouvait me poser problème &#8230; et pourtant.</p>
<p>Bouncy Castle fourni tout ce qu&rsquo;il faut pour une mise en œuvre, mais pour que celle-ci se réalise sans problème, il doit falloir un peu plus de connaissances (du point de vue technique) que mon tour d&rsquo;horizon des principes généraux.<br />
Je dois admettre avoir eu beaucoup de mal à faire le lien entre les exemples fournis et l&rsquo;application pratique que je souhaitais en faire : Crypter <strong>et</strong> signer un fichier à l&rsquo;aide de PGP.</p>
<p>En s&rsquo;appuyant sur les exemples fournis, le premier est assez facile, le second aussi, mais le mix des deux est plus problématique.<br />
Bref, j&rsquo;ai tourné en rond pendant pas mal de temps, jusqu&rsquo;à ce qu&rsquo;une âme charitable m&rsquo;offre un bout de code dont la simplicité à pour vertu de lever le voile sur les subtilités d&rsquo;enchaînement de ces 2 étapes.</p>
<p>Avec son accord, je vous publie ici le code que <strong>Viet H. Phan</strong> (l&rsquo;âme charitable pré-citée) m&rsquo;a fourni :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">import java.io.ByteArrayOutputStream; <br />
import java.io.OutputStream; <br />
import java.util.Date; <br />
&nbsp;<br />
import org.bouncycastle.bcpg.ArmoredOutputStream; <br />
import org.bouncycastle.openpgp.PGPCompressedDataGenerator; <br />
import org.bouncycastle.openpgp.PGPEncryptedDataGenerator; <br />
import org.bouncycastle.openpgp.PGPLiteralData; <br />
import org.bouncycastle.openpgp.PGPLiteralDataGenerator; <br />
import org.bouncycastle.openpgp.PGPOnePassSignature; <br />
import org.bouncycastle.openpgp.PGPSignatureGenerator; <br />
import org.bouncycastle.openpgp.PGPV3SignatureGenerator; <br />
&nbsp;<br />
&nbsp;<br />
public class BCExample { <br />
&nbsp;<br />
&nbsp; &nbsp; private String option; <br />
&nbsp; &nbsp; private boolean isOldPGPFormat; <br />
&nbsp; &nbsp; private boolean mustArmor; <br />
&nbsp; &nbsp; private PGPCompressedDataGenerator compressor; <br />
&nbsp; &nbsp; private PGPSignatureGenerator v4signer; <br />
&nbsp; &nbsp; private PGPV3SignatureGenerator v3signer; <br />
&nbsp; &nbsp; private PGPOnePassSignature onePassSignature; <br />
&nbsp; &nbsp; private PGPEncryptedDataGenerator encryptor; <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; private byte[] armor(byte[] inputData) throws Exception { <br />
&nbsp; &nbsp; &nbsp; &nbsp; ByteArrayOutputStream out = new ByteArrayOutputStream(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; ArmoredOutputStream aOut = new ArmoredOutputStream(out); <br />
&nbsp; &nbsp; &nbsp; &nbsp; aOut.write(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; aOut.close(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; return out.toByteArray(); <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; private byte[] literalize(byte[] inputData) throws Exception { <br />
&nbsp; &nbsp; &nbsp; &nbsp; ByteArrayOutputStream out = new ByteArrayOutputStream(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; PGPLiteralDataGenerator dGen = new PGPLiteralDataGenerator(this.isOldPGPFormat); <br />
&nbsp; &nbsp; &nbsp; &nbsp; OutputStream dOut = dGen.open(out, PGPLiteralData.BINARY, &quot;&quot;, inputData.length, new Date()); <br />
&nbsp; &nbsp; &nbsp; &nbsp; dOut.write(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; dGen.close(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; return out.toByteArray(); <br />
&nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; private byte[] compress(byte[] inputData) throws Exception { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if(this.compressor != null) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ByteArrayOutputStream out = new ByteArrayOutputStream(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OutputStream cOut = this.compressor.open(out); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cOut.write(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.compressor.close(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return out.toByteArray(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; return inputData; <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; private byte[] sign(byte[] inputData) throws Exception { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if(this.v4signer != null) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ByteArrayOutputStream out = new ByteArrayOutputStream(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(this.onePassSignature != null) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.onePassSignature.encode(out); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out.write(literalize(inputData)); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.v4signer.update(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.v4signer.generate().encode(out); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.v4signer.update(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.v4signer.generate().encode(out); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out.write(literalize(inputData)); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return out.toByteArray(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } else if(this.v3signer != null) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ByteArrayOutputStream out = new ByteArrayOutputStream(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(this.onePassSignature != null) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.onePassSignature.encode(out); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out.write(literalize(inputData)); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.v3signer.update(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.v3signer.generate().encode(out); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.v3signer.update(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.v3signer.generate().encode(out); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; out.write(literalize(inputData)); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return out.toByteArray(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; return inputData; <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; private byte[] encrypt(byte[] inputData) throws Exception { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if(this.encryptor != null) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ByteArrayOutputStream out = new ByteArrayOutputStream(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OutputStream eOut = this.encryptor.open(out, inputData.length); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eOut.write(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.encryptor.close(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return out.toByteArray(); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; return inputData; <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; public byte[] process(byte[] inputData) throws Exception { <br />
&nbsp; &nbsp; &nbsp; &nbsp; if(this.option.equals(&quot;sign&quot;)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputData = sign(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputData = compress(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } else if(this.option.equals(&quot;encrypt&quot;)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputData = literalize(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputData = compress(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputData = encrypt(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } else if(this.option.equals(&quot;sign-then-encrypt&quot;)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputData = sign(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputData = compress(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputData = encrypt(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; if(this.mustArmor) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inputData = armor(inputData); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; return inputData; <br />
&nbsp; &nbsp; } <br />
}</div></div>
<p>L&rsquo;exemple est volontairement dépouillé des getter/setter permettant l&rsquo;initialisation du contexte afin de se focaliser sur l&rsquo;enchaînement nécessaire des éléments, mais il fonctionne parfaitement.</p>
<p>Si vous souhaitez vous plonger dans l&rsquo;utilisation de cette librairie, voici quelques liens vous seront bien utiles :</p>
<ul>
<li><a href="http://www.bouncycastle.org/fr/index.html">http://www.bouncycastle.org/fr/index.html</a> : Le site en lui-même.</li>
<li>dev-crypto-request@bouncycastle.org : la liste de diffusion à travers laquelle Viet H. Phan m&rsquo;est venu en aide. <em>Vis-à-vis des divers demandes publiées jusqu&rsquo;ici, j&rsquo;ai toujours eu des éléments de réponse dans des délais très raisonnables.</em> (Cf. <a href="http://www.bouncycastle.org/java.html">Le site</a> pour les instructions d&rsquo;abonnement)</li>
<li><a href="http://www.nabble.com/Bouncy-Castle-f943.html">http://www.nabble.com/Bouncy-Castle-f943.html</a> : un archivage de la liste de diffusion précédemment citée sur lequel on peut effectuer des recherches.</li>
</ul>
<p>Bonne chance !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
