Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Questions] programme de cryptage

simulation d'Enigma

    30 novembre 2006 à 16:55:56

    Bonjour!

    Dans le cadre des TPE, nous avons décidé d'étudier la machine Enigma (pour ceux qui ne connaissent pas)
    Dans cet optique, nous souhaitions développer un programme, en php (seul langage utilisable que nous connaissons), simulant la machine.
    Nous vous serions donc reconnaissant si vous pouviez repondre à certaines questions qui nous bloquent :-° :

    1/ Comment selectionner un par un les caractères d'un texte (dans le but de les chiffrer séparemment)?

    2/Comment ajouter un caractère (un espace) tous les 5 caractères?

    3/Comment créer le systeme de rotors (afin que le 1er tourne d'un cran après avoir crypté un lettre, le 2eme après avoir crypté 26 lettres)?

    Je pense que les réponses de ces 3 questions reposent sur la 1ere: selectionner une lettre et lui associer un nombre.

    merci d'avance!
    • Partager sur Facebook
    • Partager sur Twitter
      30 novembre 2006 à 17:07:41

      Plop,

      Il suffit de considcerer la chaine de caractère comme un tableau :p (ou alors méthode brutale : explode('');. Mais je dis peut-être des conneries)

      Après tu fais une boulce while / for sur le tableau, et lorsque le modulo de la varibale d'incrementaion et 0 est egal à 0 (multiple de 5), alors on ajoute la caractère ou tu veux.

      Ensuite te suffit de fair eun array contenant en clés les rotors, et pour chaque valeur, le nombre delettres necessaires pour changer de cran.

      Enfin bon, après faut voir =D
      • Partager sur Facebook
      • Partager sur Twitter
      Mon profil Github - Zeste de Savoir, pour la beauté du zeste
        2 décembre 2006 à 0:43:44

        Merci pour ta réponse, je vais essayer.

        J'avais trouvé un site qui avait déja créer un simulateur d'Enigma, et dont les créateurs partageait les codes. J'esperais m'inspirer de leur travail mais malheureusement pour moi, je ne comprend pas la moitié de ce qu'ils ont tapé...
        Par exemple, pour le probleme de faire tourner les rotors, ils ont codé ainsi:

        class cEnigmaRotor
         {
         var $alphabetCodant;
         var $alphabetCodé;
         var $version;
         var $cran;
         var $origineDeLaBague;

           function cEnigmaRotor()
           {
           $alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
           $this->alphabetCodant = array();
           $this->alphabetCodé = array();
           for ($i=0; $i<strlen($alphabet); $i++) {
             $this->alphabetCodant[] = $alphabet{$i};
           }
           $this->cran = array(0);
           }

           function definirAlphabet($alphabet)
           {
           $this->origineDeLaBague = $alphabet{0};
           for ($i=0; $i<strlen($alphabet); $i++) {
             $this->alphabetCodé[] = $alphabet{$i};
           }
           }

           function tourner()
           //La manière avec la quelle le rotor tourne est sujet à caution. Il se peut que
           //la rotation se fasse dans le sens inverse
           {
           $lettre0 = array_shift($this->alphabetCodant);
           $this->alphabetCodant[] = $lettre0;
           /* ou:
           $lettre = array_pop($this->alphabetCodant);
           array_unshift($this->alphabetCodant,$lettre);
           */

           }

        >comme vous pouvez le voir, ils utlisient beaucoup les classes... utilisation de PHP que je ne cerne pas vraiment... Pourriez-vous, svp, me décrire ce qu'ils ont tapé?
        • Partager sur Facebook
        • Partager sur Twitter
          2 décembre 2006 à 11:19:14

          Salut,

          En fait, d'après ce que je peux comprendre, c'est que dans la première fonction (qui ets aussi constructeur de la class), ils definissent le premier cran, et transforme dans un array toutes les lettre de l'alphabet. Même si je trouve qu'il y a un meilleur moyen, m'enfin.

          La seconde fonction permet de dfinir un alaphabet, soit.... la même operation que dans la première fonction, en ne définissant pas de cran.

          La dernière consiste à récuperer la première lettre de l'alphabet codant (soit le premier element de l'array), puis de le remettre dans l'array, en fin d'element.

          Comme je ne connais aps très bien enigma, je peux pas plus t'aider =D

          Mais il m'est avis qu'il y a autre chose derrière ca qui fasse tourner le nombre de cran, etc.
          • Partager sur Facebook
          • Partager sur Twitter
          Mon profil Github - Zeste de Savoir, pour la beauté du zeste
            3 décembre 2006 à 14:41:31

            Après plusieurs essai, je me retrouve à nouveau bloqué.
            Il faudrait que j'arrive à créer une fonction pouvant effectuer cette opération:

            (basons nous sur un alphabet n'utilisant que 5 lettres: abcde)
            -prenons un message (que le visiteur entrera). ex: "abdbca"
            Nous possédons un alphabet "crypté" remplacant chaque lettre de l'alphabet normal par une autre.
            ex: alphabet normal => alphabet codé:
            a=>c
            b=>a
            c=>e
            d=>b
            e=>d

            Mais cet alphabet tourne d'un cran à chaque lettre codé: voila un autre exemple pour mieux comprendre:
            ex:
            Avant de coder la premiere lettre:
            a=>c
            b=>a
            c=>e
            d=>b
            e=>d

            Après avoir codé une lettre:
            a=>a
            b=>e
            c=>b
            d=>d
            e=>c
            (l'alphabet codé à touner d'un cran par rapport à l'alphabet normal)

            Bref, si nous effectuons correctement les opérations, nous obtiendrons à partir de notre message initial "abdbca" le message codé "cecdac".
            __________________________________________

            J'espere que vous avez compris le principe (j'ai du mal à m'expliquer... :( )

            Revenons maintenant au PHP:
            -J'ai un array numéroté $tableau_message dont chaque valeurs correspond à une lettre du message (obtenu grace à str_split)
            -J'ai un array numéroté définissant l'alphabet codé
            ex:
            $rotor1 = array("a","z","e","r","t","y","u","i","o","p","q","s","d","f","g","h","j","k","l","m","w","x","c","v","b","n");


            Grace à cela, comment pourrais-je faire effectuer l'opération que je vous ai présenté precedemment?
            (je ne souhaite bien entendu pas la solution toute pondue, mais au moins une piste svp)

            Merci d'avance!
            • Partager sur Facebook
            • Partager sur Twitter
              3 décembre 2006 à 15:16:54

              Hum. D'abord tu fais un array associatif pour chaque lettres. Ensuite, tu peux parcourir la tableau à l'aide de foreach,, stocker ce que contient la première valeur, puis prendre les valeur de la prochaine clé, et le mettre dans la clé actuelle.
              • Partager sur Facebook
              • Partager sur Twitter
              Mon profil Github - Zeste de Savoir, pour la beauté du zeste
                3 décembre 2006 à 15:42:25

                j'ai essayé une méthode assez similaire:
                <?php

                //on genere les differents rotors. parmi ces 8, le visiteur pourra en choisir 4 qu'il placera dans l'ordre souhaité
                $rotor1 = array("a","z","e","r","t","y","u","i","o","p","q","s","d","f","g","h","j","k","l","m","w","x","c","v","b","n");
                $rotor2 = array("a","q","w","x","s","z","e","d","c","v","f","r","t","g","b","n","h","y","u","j","k","i","o","l","m","p");
                $rotor3 = array("b","e","n","j","a","m","i","p","l","c","h","o","k","u","h","y","v","d","x","f","r","z","q","s","w","g");
                $rotor4 = array("m","a","t","i","z","o","u","n","e","r","q","s","d","w","x","c","f","v","b","h","u","p","l","k","j","k");
                $rotor5 = array("z","a","y","b","x","c","w","d","v","e","u","f","t","g","s","h","r","i","q","j","p","k","o","l","n","m");
                $rotor6 = array("e","n","i","g","m","a","t","p","s","r","y","q","d","f","w","x","c","v","b","h","u","o","l","k","j","n");
                $rotor7 = array("k","i","e","d","c","g","b","u","v","f","a","x","s","z","q","w","l","n","h","r","t","j","o","y","m","p");
                $rotor8 = array("u","a","x","s","k","i","z","p","w","b","l","q","j","y","m","n","o","h","v","e","d","c","g","f","r","t");


                $message = 'bonjourleboulot'; //un formulaire remplacera cette partie (qui ne sert que pour les essais)
                $message_decoupe = str_split($message); //on decoupe le message en tableau  !!ERREUR AVEC EasyPHP!!
                $nombre_lettres = count($message_decoupe); //on compte le nb de lettres du message

                function CryptagePremierRotor($message_decoupe,$nombre_lettres,$premier_rotor,$message_code)
                {
                for ($numero_lettre_dans_message = 0; $numero_lettre_dans_message<= $nombre_lettres; $numero_lettre_dans_message++)
                        {
                                $lettre= $message_decoupe[$numero_lettre_dans_message]; //on selectionne la lettre à codée du message
                               
                                //le cryptage de la lettre grace au rotor dépend de la lettre en elle-meme et de sa place dans le message. On associe donc la lettre à un nombre (a=0, b=1,...), auquel on ajoute la place de la lettre dans le message:
                                $alphabet= array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
                                $numero_lettre_dans_alphabet = array_search($lettre, $alphabet);
                                $numero_lettre = $numero_lettre_dans_alphabet + $numero_lettre_dans_message;
                                //le rotor n'a que 26 crans (soit 25 en commencant de 0), mais il tourne: si le nombre obtenu pour la lettre dépasse donc 25, il faut soustraire k tours, soit 25k:
                                while ($numero_lettre > 25)
                                        {
                                                $numero_lettre = $numero_lettre-25;
                                        }
                                $lettre_codee = $premier_rotor[$numero_lettre]; //on code la lettre en fonction du rotor choisis
                                $message_code = ''.$message_code.''.$lettre_codee.''; //on reconstitue le message codé constitué de chaque lettre cryptée
                        }
                        return $message_code;
                }

                $premier_rotor = $rotor1; //un formulaire remplacera cette partie (qui ne sert que pour les essais)
                CryptagePremierRotor($message_decoupe,$nombre_lettres,$premier_rotor,'');
                echo $message_code;
                ?>


                Mais EasyPHP m'affiche:
                Fatal error: Call to undefined function: str_split() in c:\documents and settings\benjamin\mes documents\site web\enigma\enigma.php on line 3


                Serait-ce parce que str_split() n'est utilisé que dans PHP5 et que Easyphp ne la reconnait pas, ou bien l'ai-je mal utilisé?
                outre ce probleme: mon code vous semble-t-il correct?
                • Partager sur Facebook
                • Partager sur Twitter
                  3 décembre 2006 à 16:00:56

                  Regarde dans les fonctions et astuces, Bison a posté un truc pas mal dessus.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Mon profil Github - Zeste de Savoir, pour la beauté du zeste
                    3 décembre 2006 à 16:04:57

                    http://fr.php.net/str_split << Php 5 et easyphp c'est du Php 4 ^^

                    Pour ton information tu peux utiliser ta chaine comme un tableau de caractères à l'origine ;)
                    $str = 'Salut';
                    echo $str[0]; // << S


                    $nombre_lettres = count($message_decoupe); //on compte le nb de lettres du message

                    Serait pas plus simple de faire un strlen($message);
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 décembre 2006 à 16:26:29

                      Premierement: merci pour vos réponses
                      Malheureusement, vous n'en avez pas encore finis avec mes pauvres questions! :p

                      A Talus:
                      J'ai du mal à comprendre la fonction que tu m'a montré... Comment pourrais-je m'en servir?

                      A RedoX:
                      Merci pour le strlen: j'avais oublié son existence... :-°
                      Par contre, en suivant ton 1er conseil (me servir de ma chaine comme d'un tableau), j'obtiens cette erreur:
                      Notice: Uninitialized string offset: 15 in c:\documents and settings\benjamin\mes documents\site web\enigma\enigma.php on line 22

                      avec ce code:
                      $message = 'bonjourleboulot'; //un formulaire remplacera cette partie (qui ne sert que pour les essais)
                      $str = $message;
                      //...
                      $lettre= $str[$numero_lettre_dans_message]; //on selectionne la lettre à codée du message //ligne 22

                      Je pense que j'ai pas du comprendre correctement ton idée... :D
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 décembre 2006 à 16:33:17

                        à mon humble avis t'essaye d'accéder à un index de lettre qu'est plus dans le Mot..
                        Exemple :
                        Index 6 sur 'Salut'

                        Edit: Oublie pas que ca commence à 0 !! ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 décembre 2006 à 16:38:54

                          Voila ma fonction:

                          $message = 'bonjourleboulot'; //un formulaire remplacera cette partie (qui ne sert que pour les essais)
                          $str = $message;
                          $nombre_lettres = strlen($message); //on compte le nb de lettres du message

                          function CryptagePremierRotor($str,$nombre_lettres,$premier_rotor,$message_code)
                          {
                          for ($numero_lettre_dans_message = 0; $numero_lettre_dans_message<= $nombre_lettres; $numero_lettre_dans_message++)
                                  {
                                          $lettre= $str[$numero_lettre_dans_message]; //on selectionne la lettre à codée du message
                                         
                                          //le cryptage de la lettre grace au rotor dépend de la lettre en elle-meme et de sa place dans le message. On associe donc la lettre à un nombre (a=0, b=1,...), auquel on ajoute la place de la lettre dans le message:
                                          $alphabet= array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
                                          $numero_lettre_dans_alphabet = array_search($lettre, $alphabet);
                                          $numero_lettre = $numero_lettre_dans_alphabet + $numero_lettre_dans_message;
                                          //le rotor n'a que 26 crans (soit 25 en commencant de 0), mais il tourne: si le nombre obtenu pour la lettre dépasse donc 25, il faut soustraire k tours, soit 25k:
                                          while ($numero_lettre > 25)
                                                  {
                                                          $numero_lettre = $numero_lettre-25;
                                                  }
                                          $lettre_codee = $premier_rotor[$numero_lettre]; //on code la lettre en fonction du rotor choisis
                                          $message_code = ''.$message_code.''.$lettre_codee.''; //on reconstitue le message codé constitué de chaque lettre cryptée
                                  }
                                  return $message_code;
                          }


                          En toute logique, vu les conditions pour que la boucle for s'arrete, l'erreur que tu as mentionné ne devrait pas avoir lieu... je crois... :euh:
                          • Partager sur Facebook
                          • Partager sur Twitter

                          [Questions] programme de cryptage

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown