Guest User

Enigma en php

a guest
Jun 29th, 2010
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.00 KB | None | 0 0
  1. <?php
  2. //on definis dans un array le mot que l'on choisis
  3. //@TODO : mode verbose : pour que la fonction enigma parle, et donne les étapes
  4. //@TODO : plus d'interactivité avec l'utilisateur : il rentre un mot, explode(), puis on travaille sur l'array.
  5. //@TODO : effectuer le tout sur les 26 lettres de l'alphabet : donc plus grand tableau de connexion, plus grand rotor, plus grand reflecteur
  6. //@TODO : la cryptanalyse de tout ça !
  7. //@TODO : gerer la position initiale des rotors
  8. $lettres = array( 'F', 'A', 'D', 'E', 'F', 'A', 'C');
  9. //On commence par toutes les definitions
  10. // Tableau de connexion
  11. $connexion = array( 'A' => 'C',
  12.                     'B' => 'B',
  13.                     'C' => 'A',
  14.                     'D' => 'F',
  15.                     'E' => 'E',
  16.                     'F' => 'D');
  17. //Le premier rotor, dans son état initial
  18. $rotor1 = array( 'A' => 'E',
  19.                  'B' => 'A',
  20.                  'C' => 'F',
  21.                  'D' => 'B',
  22.                  'E' => 'D',
  23.                  'F' => 'C');
  24. //le deuxieme
  25. $rotor2 = array( 'A' => 'F',
  26.                  'B' => 'D',
  27.                  'C' => 'B',
  28.                  'D' => 'E',
  29.                  'E' => 'C',
  30.                  'F' => 'A');
  31. // et le troisième
  32. $rotor3 = array( 'A' => 'D',
  33.                  'B' => 'C',
  34.                  'C' => 'E',
  35.                  'D' => 'A',
  36.                  'E' => 'F',
  37.                  'F' => 'B');
  38. //le reflecteur : on le definit comme un rotor
  39. $reflecteur = array( 'A' => 'D',
  40.                      'B' => 'C',
  41.                      'C' => 'B',
  42.                      'D' => 'A',
  43.                      'E' => 'F',
  44.                      'F' => 'E');
  45.  $i = 0; // i=0 : c'est "l'aller" i=1 : c'est "le retour"
  46.  $j = 0; // quand j=6, rotor2 tourne
  47.  $k = 0; // quand k=6 rotor3 tourne
  48. function connexion($connexion, $lettre) { // fonction qui passe dans le tableau de connexion
  49.     $lettre_connexion = $connexion[$lettre];
  50.     return $lettre_connexion; // ne retourne qu'une lettre
  51. }
  52. function rotor1($rotor, $lettre, $j, $i) { // fonction pour le rotor1
  53.  
  54.     if($i == 0) { // ca veut dire que c'est le premier passage
  55.         $lettre_rotor1 = $rotor[$lettre];
  56.         $j++;
  57.     }
  58.     else {
  59.         foreach($rotor as $key => $values) { // au retour, on passe les rotor dans l'autre sens
  60.             $rotor_e[$values] = $key;        // donc il faut echanger les clef et les valeurs des array
  61.         }
  62.         $lettre_rotor1 = $rotor_e[$lettre];
  63.         $rotor = tourner_rotor($rotor); // au retour, après avoir remodifié la lettre, on tourne le rotor1
  64.     }
  65.     return array($rotor, $lettre_rotor1, $j); // on retourne un tableau : [0] = rotor [1] = lettre [2] = j
  66. }
  67. function rotor2($rotor, $lettre, $j, $k, $i) { // le rotor2
  68.  
  69.    
  70.     if($i == 0) {
  71.         $lettre_rotor2 = $rotor[$lettre];
  72.         if($j == 6) {
  73.             $k++; // k ne s'incremente qu'une fois que j=6
  74.         }
  75.     }
  76.     else {
  77.         foreach($rotor as $key => $values) {
  78.             $rotor_e[$values] = $key;
  79.         }
  80.         $lettre_rotor2 = $rotor_e[$lettre];
  81.         if($j == 6) {
  82.             $rotor = tourner_rotor($rotor);
  83.             $j=0;
  84.         }
  85.     }
  86.     return array($rotor, $lettre_rotor2, $j, $k);
  87. }
  88. function rotor3($rotor, $lettre, $k, $i) { // le rotor3
  89.  
  90.     if($i == 0) {
  91.         $lettre_rotor3 = $rotor[$lettre];
  92.     }
  93.     else {
  94.         foreach($rotor as $key => $values) {
  95.             $rotor_e[$values] = $key;
  96.         }
  97.         $lettre_rotor3 = $rotor_e[$lettre];
  98.         if($k == 6) {
  99.             $rotor = tourner_rotor($rotor);
  100.             $k=0;
  101.         }
  102.     }
  103.     return array($rotor, $lettre_rotor3, $k);
  104. }
  105. function reflecteur($reflecteur, $lettre) { // le reflecteur
  106.     $lettre_reflecteur = $reflecteur[$lettre];
  107.     $i=1; // on vient de finir "l'aller", on passe donc au "retour"
  108.     return array($lettre_reflecteur, $i); // retourne un tableau : [0] = lettre [1] = i
  109. }
  110. function tourner_rotor($rotor) { // quand les rotors tourne
  111. $tamp = array( 'A' => $rotor['B'],
  112.                'B' => $rotor['C'],
  113.                'C' => $rotor['D'],
  114.                'D' => $rotor['E'],
  115.                'E' => $rotor['F'],
  116.                'F' => $rotor['A'] ); // on fait tout monter d'un cran
  117.                
  118.     foreach($tamp as $key => $value) { // sauf que en plus de tout monter d'un cran, il faut "baisser" d'un la valeur de chaque lettre
  119.         switch ($value) {              // ainsi, si $tamp[A] vaut C, il faut le transformer en C-1 = "B"
  120.             case "A" :
  121.                 $tamp[$key] = "F";
  122.                 break;
  123.             case "B" :
  124.                 $tamp[$key] = "A";
  125.                 break;
  126.             case "C" :
  127.                 $tamp[$key] = "B";
  128.                 break;
  129.             case "D" :
  130.                 $tamp[$key] = "C";
  131.                 break;
  132.             case "E" :
  133.                 $tamp[$key] = "D";
  134.                 break;
  135.             case "F" :
  136.                 $tamp[$key] = "E";
  137.                 break;
  138.             default :
  139.                 echo "ERROR";
  140.                 break;
  141.         }
  142.     }
  143.     return $tamp; // on retourne le tableau
  144. }
  145. function enigma($connexion, $rotor1, $rotor2, $rotor3, $reflecteur, $lettres, $j, $k, $i) { // fonctions principale : appelle les autres fonctions
  146. $lettres_return = array(); // on initialise le "return" en un array des nouvelles lettres
  147.     $l=0; // on initialise l, qui sera incrémenter pour chaque lettre passer dans la machine
  148.     foreach($lettres as $lettre) { // on parcourt l'array $lettres
  149.         //echo $lettre . "=>";
  150.         $lettre_connexion1 = connexion($connexion, $lettre); // on appelle la fonction qui fait le tableau de connexion
  151.         //echo $lettre_connexion1 . "=>" ;
  152.        
  153.         $result_rotor1a = rotor1($rotor1, $lettre_connexion1, $j, $i); // on passe par le rotor1
  154.         $rotor1 = $result_rotor1a[0];
  155.         $lettre_rotor1a = $result_rotor1a[1];
  156.         $j = $result_rotor1a[2];
  157.         //echo $lettre_rotor1a . "=>";
  158.  
  159.         $result_rotor2a = rotor2($rotor2, $lettre_rotor1a, $j, $k, $i); // le rotor2
  160.         $rotor2 = $result_rotor2a[0];
  161.         $lettre_rotor2a = $result_rotor2a[1];
  162.         $j = $result_rotor2a[2];
  163.         $k = $result_rotor2a[3];
  164.         //echo $lettre_rotor2a . "=>";
  165.  
  166.         $result_rotor3a = rotor3($rotor3, $lettre_rotor2a, $k, $i); // le rotor3
  167.         $rotor3 = $result_rotor3a[0];
  168.         $lettre_rotor3a = $result_rotor3a[1];
  169.         $k = $result_rotor3a[2];
  170.         //echo $lettre_rotor3a . "=><b>";
  171.  
  172.         $result_reflecteur = reflecteur($reflecteur, $lettre_rotor3a);// le reflecteur
  173.         $lettre_reflecteur = $result_reflecteur[0];
  174.         $i = $result_reflecteur[1]; // i=1, donc on passe tout dans le sens inverse
  175.         //echo $lettre_reflecteur . "</b>=>";
  176.  
  177.         $result_rotor3b = rotor3($rotor3, $lettre_reflecteur, $k, $i); // rotor3, avec i=1
  178.         $rotor3 = $result_rotor3b[0];
  179.         $lettre_rotor3b = $result_rotor3b[1];
  180.         $k = $result_rotor3b[2];
  181.         //echo $lettre_rotor3b . "=>";
  182.  
  183.         $result_rotor2b = rotor2($rotor2, $lettre_rotor3b, $j, $k, $i); // rotor2, avec i=1
  184.         $rotor2 = $result_rotor2b[0];
  185.         $lettre_rotor2b = $result_rotor2b[1];
  186.         $j = $result_rotor2b[2];
  187.         $k = $result_rotor2b[3];
  188.         //echo $lettre_rotor2b . "=>";
  189.  
  190.         $result_rotor1b = rotor1($rotor1, $lettre_rotor2b, $j, $i); // rotor1 avec i=1
  191.         $rotor1 = $result_rotor1b[0];
  192.         $lettre_rotor1b = $result_rotor1b[1];
  193.         $j = $result_rotor1b[2];
  194.         //echo $lettre_rotor1b . "=>";
  195.        
  196.         $lettre_connexion2 = connexion($connexion, $lettre_rotor1b); // on repasse dans le tableau de connexions
  197.         //echo $lettre_connexion2 . "<br>" ;
  198.        
  199.         $i=0;
  200.         $lettres_return[$l] = $lettre_connexion2; // on forme un array avec les nouvelles lettres
  201.         $l++;
  202.         }
  203.         return $lettres_return;
  204. }
  205. foreach($lettres as $value) {
  206.     echo $value; // on affiche les lettre de depart
  207. }
  208. $lettres = enigma($connexion, $rotor1, $rotor2, $rotor3, $reflecteur, $lettres, $j, $k, $i); // on applique la fonction enigma
  209. echo 'a été transformé en : <b>';
  210. foreach($lettres as $value) {
  211.     echo $value; // on affiche les lettre à l'arrivé
  212. }
  213. echo '</b>';
Advertisement
Add Comment
Please, Sign In to add comment