Description du programme "Passerelle chiffree" que l'on se propose de faire. 1°) La passerelle va permettre de faire l'intermédiare entre deux points du réseau. ================================= -> chiffré avec C1 -> A <- chiffré avec C2 <- B ================================= 2°) Elle va chiffrer tous les échanges : - chiffrement avec la cle C1 a l'entree A, - dechiffrement avec la cle C1 a la sortie B, - chiffrement avec la cle C2 a l'entree B, - dechiffrement avec la cle C2 a la sortie A, Pour simplifier C1 peut etre identique a C2 Un exemple de passerelle : - la commande ssh avec l'option -L ou -R. supposons que nous ayons notre serveur a l'adresse 192.168.56.102. Quand on execute la commande suivante : $ ssh -f -N -L 2000:localhost:9999 invite@192.168.56.102 on cree un tunnel entre localhost de notre machine sur le port 2000 et le localhost de la machine a l'adresse 192.168.56.102 sur le port 9999. pass port_local nom_ou_IP_destination port_destination exemple dans le cas present $ pass 2000 192.168.56.102 9999 3°) Dans le code de la version 1 (attente de 5 sec et coupure) on a montre que la tache liaison est connectée au serveur distant et au client local. Elle sert donc de passerelle entre les deux !! Pour que notre passerelle soit universelle il ne faut pas a avoir d'à priori ! Les donnees peuvent venir des deux cotes a n'importe quel moment ! Chaque client local va provoquer la creation d'un processus fils de la passerelle qui lui est dedié. Et ce processus va créer deux threads : - un qui va faire suivre les donnees du CL vers SD, - l'autre qui va faire la meme chose dans l'autre sens (SD -> CL). S'appuyer sur les exemples de code de multithreading ecrits en fevrier 2019. 4°) Notre passerelle va s'installer en 2 etapes. Supposons que nous voulions acceder au serveur qui tourne sur la machine d'IP 192.168.56.102 MAIS qui attend sur le port 9999 de l'interface localhost interne. Il va donc falloir, un supposant que mon client est sur la machine d'IP 192.168.56.1 : a) établir une passerelle comme vu ci-dessus entre le port 2000 sur l'interface localhost de la machine 192.168.56.1 : Sur cette machine on fait : $ pass 2000 192.168.56.102 3000 b) Sur la machine d'IP 192.168.56.102 on fait : $ pass 3000 localhost 9999 c) Et evidemment le serveur est lance dans la machine 192.168.56.102 sur le port 9999 de l'interface localhost. d) et le client echange sur son interface localhost (port 2000). 5°) Comment va se faire le chiffrement ? Si on represente le montage que l'on a effectue avec ces 2 etapes : Sur 192.168.56.1 Sur 192.168.56.102 ========================= ========================== 0.0.0.0 192.168.56.102 0.0.0.0 localhost Client <-> port=2000 port=3000 <-> port 3000 port 9999 <-> Serveur ========================= ========================== Le Client se connecte Le serveur n'echange sur son localhost QUE sur son localhost La partie gauche de la passerelle (sur la machine 56.1) va chiffrer ce qui sort sur l'interface distante et dechiffrer de qui rentre par cette insterface. Alors que la partie droite (sur la machine 56.102) le fait sur l'interface locale (c'est a dire le port 3000 !!). Il va donc falloir specifier dans commande si le chiffrement se fait sur l'interface locale ou distante !!! Donc la commande pass va s'enrichir d'un nouveau parametre : -l pour local ou -d pour distant. On aura donc dans notre exemple : a) établir une passerelle comme vu ci-dessus entre le port 2000 sur l'interface localhost de la machine 192.168.56.1 avec chiffrement distant : $ pass -d 2000 192.168.56.102 3000 b) Sur la machine d'IP 192.168.56.102 avec chiffrement local : $ pass -l 3000 localhost 9999 On pourra même avoir l'option -s : sans chiffrement ! 6°) Exemple pratique : On veut accéder à la fois au serveur qui est sur le port 9999 et au serveur ssh qui est sur le port 22. a) du cote du client : $ pass -d 2000 192.168.56.102 3000 $ pass -d 2001 192.168.56.102 3001 b) du cote du serveur : $ pass -l 3000 localhost 9999 $ pass -l 3001 localhost 22 Pour se connecter au serveur 9999 : $ ./client localhost 2000 $ ssh -p 2001 invite@localhost 7°) Methodes pour le chiffrement a) simple avec cle symetrique a.1) avec la fonction XOR Table de verite A B A xor B Axor0=A Axor1=Comp(A) A xor A 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 0 A xor K = DC DC xor K = A xor K xor K = A xor 0 = A D'ou l'interet d'utiliser xor car c'est une fonction involutive. 8°) Principe détaillé avec une cle de longueur fixe : Cle : abcd Buf : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Xor : abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd Ce qui veut dire que le chiffrement dépend de la manière dont sont découpées les données !! Exemple : Data: azertyuiopqsdfghjklm 1er cas : on les envoie en 1 seul morceau : Data: azertyuiopqsdfghjklm Xor : abcdabcdabcdabcdabcd 2em cas : on les envoie en 2 morceaux : Data: azerty uiopqsdfghjklm Xor : abcdabcd abcdabcdabcdabcd