Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un cryptage, et Vigenere apparait....

J'ai un petit soucy avec un cryptage de vigenère

Sujet résolu
    24 octobre 2006 à 1:12:11

    Salut, alors autant prévenir, le code suivant est en C++ (Le forum traite aussi le C++ d'après son nom). J'ai dit que c'était du C++ ? Ben ça l'ait qu'en apparence ! Il vous suffit d'imaginer que les cout deviennent des printf et les cin deviennent des scanf.

    Cette transition faite, j'ai un petit soucy dans un cryptage pour vigenère.
    Pour ceux qui ne connaisse pas le principe :

    http://mhubiche.developpez.com/Access/cryptage/vigenere/

    A la difference qu'ici la clé n'est pas un mot (ca m'aurait bien aider d'ailleur) mais une série de chiffre comprise entre 1 et 26. (réference à l'alphabet) ^^


    //Prototypes et definition de constante dans le header.

    #define N_PHRASE 256
    void saisieClair2(char chaine_clair2[], int tailleElem);
    void affichage(char chaine[], int tailleElem);
    void chiffrage2(char chaine_chiffre2[], int cle2[], int *compt);
    void dechiffrage2(char chaine_dechiffre2[], int cle2[], int *compt);


    Je ne traiterai ici que la définition du chiffrage2, car c'est celui où j'ai un problème, vous imaginerez donc comment faire une saise de chaine caractère, et un affichage de tableau. :p


    //Chiffrage de la chaine

    void chiffrage2(char chiffre_ch2[], int cle2[], int *compt)
    {
            int i = 0, j = 0 ;
            while (chiffre_ch2[i] != '\0')
            {
                    if (j >= *compt)
                            j = 0;

                    chiffre_ch2[i] = tolower(chiffre_ch2[i]);
                    chiffre_ch2[i] = chiffre_ch2[i] + cle2[j];     

                    if (chiffre_ch2[i] > 122)
                            chiffre_ch2[i] = chiffre_ch2[i] - 26;

                    i++; j++;
            }
            chiffre_ch2[i] = '\0';
    }


    Et voici enfin le programme principal.


    //PROGRAMME PRINCIPAL

    #include <iostream>
    using namespace std;
    #include "Vigenere.h"


    int main()
    {
            char clair2[N_PHRASE], chiffre2[N_PHRASE], dechiffre2[N_PHRASE];
            int clef2[N_PHRASE];
            int compteur = 0;

            //Appel de fonction pour la saisie de la chaine de caractère
            //On peut utiliser un while dans la fonction
            //Moi j'ai simplement utilisé un cin.getline
            cout << "Entrer la chaine en clair : ";
            saisieClair2(clair2, N_PHRASE);
            strcpy(chiffre2, clair2);

            //J'aurai pu en faire une fonction mais bon...
            //Saisie de la chaine d'entier pour la clé
            cout << "Entrer la clef : ";
            int i=0;
            while (i != '*')
            {
                    cin >> clef2[i];
                    i++;
            }
            compteur = i-1;

            //Appel des fonctions de chiffrage et d'affichage
            cout << "Le code est : ";
            chiffrage2(chiffre2,clef2,&compteur);
            affichage(chiffre2, N_PHRASE);

            //Appel des fonctions de dechiffrage et d'affichage
            strcpy(dechiffre2, chiffre2);
            cout << "Le dechiffrage de ce code est : ";
            chiffrage2(dechiffre2,clef2,&compteur);
            affichage(dechiffre2, N_PHRASE);

            return 0;
    }


    Alors bonne compilation. Aucun soucy.
    Mais finalement si !
    En effet dans ma fonction de chiffrage, j'ai l'impression que ma condition

                    if (j >= *compt)
                            j = 0;

    n'est pas prise en compte...

    Enfin je suis pas sur que ça vient de là.
    Par exemple pour le mot "attaquez" je donne une clé 314 et je devrais normalement avoir duxdryha.
    Ben moi je trouve les trois première lettre, mais le reste ne va pas. Ca ne fonctionne donc pour moi que si ma clé est de la taille du mot à crypter...

    Autre soucy, mais là c'est plus du fignolement. Vous avez remarqué dans le main que j'ai utilisé un caractère d'échappement pour sortir de ma boucle. Je suis donc à chaque fois obligé de taper le caractère '*' dans la saisie de ma clé.
    Je voulais savoir si c'était possible de se passer de cela et de faire par exemple un simple "entrer" et sans passer par un caractère d'echappement (un peu comme le cin.getline pour les chaines caractères). Si oui, ca serait cool de m'expliquer comment. ^^
    • Partager sur Facebook
    • Partager sur Twitter
      24 octobre 2006 à 16:45:44

      Pas de réponse... Donc personne ne voit ? S'il vous plaît aidez-moi :'(
      Je commence à désesperer !
      • Partager sur Facebook
      • Partager sur Twitter
        24 octobre 2006 à 17:31:22

        Citation : MrCode

        Pas de réponse... Donc personne ne voit ? S'il vous plaît aidez-moi :'(
        Je commence à désesperer !


        Ton code est bizarre ... (et pas portable !)
        Déjà je vois pas comment tu arrives à saisir une clé vu que tu boucles tant que i différent de '*'
        Sinon rajoute des cout un peu partout pour voir ^^
        • Partager sur Facebook
        • Partager sur Twitter
          24 octobre 2006 à 17:51:58

          Citation : asmanur

          Ton code est bizarre ... (et pas portable !)


          Le but n'est pas qu'il soit portable. Je fais ceci simplement à titre pédagogique.

          Citation : asmanur

          Déjà je vois pas comment tu arrives à saisir une clé vu que tu boucles tant que i différent de '*'


          Ben justement je fini ma clé par le caractère *, donc je ne prend pas le dernier élement dans mon tableau...
          Si tu as une autre solution, je suis prenant :p Oublions pas que pour Vigenere, à l'instar de Cesar, une clé n'est pas un seul chiffre, mais plusieur. Ainsi je ne saisie par exemple pas 123 (cent vingt-trois) mais 1 2 3 (un, deux, trois).

          Sinon ben ma clé est bien prise en compte que pour les nombres que j'utilise. En gros, j'ai l'impression que ma condition

          if (j >= *compt)
              j = 0;

          n'est pas prise en compte...

          Je m'explique, j'ai crée une variabme compteur pour calculer la longueur de la clé (dans le main), elle envoie son adresse au pointeur *compt.
          Donc si la variable j est supèrieur à *compt, j'aimerai que j revienne à 0, et ainsi je reprendrai les premiers élements de ma clé.

          En gros si mon mot à crypter est "attaquez" et si je saisie une clé 3 4 1, j'ajouterai :

          -3 au code ascci de 'a'
          -4 au code ascii de 't'
          -1 au code ascii de 't' (jusqu'ici ça marche chez moi) ensuite normalement je devrais ajouter :
          -3 au code ascii de 'a'
          -4 au code ascii de 'q'
          -1 au code ascii de 'u'
          -3 au code ascii de 'e' et
          -4 au code ascii de 'z'

          Ce qui devrait me donner au final : dxuduvhd

          Or moi je n'arrive à avoir que les 3 premiers bons caractère du cryptage si ma clé a une longueur de 3, 4 si elle à une longueur de 4 ect... j'arrive pas a faire répeter ma clé en gros, une fois qu'elle est finie.

          Lorqu'on arrive en fin d'alphabet, on revient au début de l'alphabet d'ou le :

          if (chiffre_ch2[i] > 122)
              chiffre_ch2[i] = chiffre_ch2[i] - 26;


          J'ai essayé pas mal de chose mais ca veut pas prendre la condition... veuillez m'aider s'il vous plait T_T

          Edit : j'ai trouvé mon erreur, merci à tout ceux qui m'ont aidé, même si y'en a pas eu des masses. :p
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            25 octobre 2006 à 12:56:02

            Et on dit pas 'soucy' mais soucis :)
            • Partager sur Facebook
            • Partager sur Twitter
              2 novembre 2006 à 12:46:29

              Au lieu d'utiliser le code ASCII, avec lequel tu n'est pas sûr que tous les ordinateurs l'aient, ruse ;) . Tous les codes ont un même point commun, c'est que le B est après le A ^^ En clair, ça suit l'ordre alphabétique. Déjà, le principe mathématique de Vigenère, c'est:
              clair + clef % 26 = chiffré
              Où clair, clef, et chiffré sont la position de la lettre de l'alphabet (où a =0). Par exemple, si le lettre est D et la clef (courante) est Y, on a:
              3 + 24 % 26 = 27 % 26 = 1 = B
              Pour connaître la position de chaque lettre sans te casser la tête, tu crée une constante "ABCDEFGHIJKLMNOPQRSTUVWXYZ" et tu utilise la fonction pour rechercher la position d'un caractère dans une chaîne ;)
              Voilou, j'espère que ça t'aura aidé :)
              • Partager sur Facebook
              • Partager sur Twitter

              Un cryptage, et Vigenere apparait....

              × 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