Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème XOR

Ne crypte qu'une partie du fichier

Sujet résolu
Anonyme
    2 août 2007 à 13:17:55

    Bonjour,
    Je sauis en rtain de faire un petit programme pour crypter un fichier grâce au XOR (^). Le problème c''est que sur certains fichiers, le XOR ne se fait pas sur tout le fichier.

    Voici mon code :


    /*
    main.cpp
    --------

    Description : Fonction principale du programme.
    _______________________________________________
    */


    #include <iostream>
    #include <fstream>
    #include <string>

    using namespace std;

    int main()
    {
            string fichier1 = "", fichier2 = "";
           
            cout << endl << "\t\t\tProgramme de cryptage des fichiers." << endl << endl;

            ifstream fichierACrypter;
           
            do
            {
                    cout << " Chemin relatif ou absolu du fichier a crypter : ";
                    cin >> fichier1;

                    fichierACrypter.open(fichier1.c_str(), ios::in);
            } while(!fichierACrypter);

            ofstream fichierCrypte;
           
            do
            {
                    cout << endl << " Nom du fichier crypte (meme nom si remplacement) : ";
                    cin >> fichier2;

                    fichierCrypte.open(fichier2.c_str(), ios::out|ios::trunc);
            } while(!fichierCrypte);

            string motDePasse = "";
           
            cout << endl << " Entrez le mot de passe : ";
            cin >> motDePasse;
           
            char caractere;
            int i = 0;
            int longueurPasse = motDePasse.size();
            int xor;
           
            while(fichierACrypter.get(caractere))
            {
                    if(i > longueurPasse) // Si c'est la fin du mot de passe, on remet i à 0
                    {
                            i = 0;
                    }

                    xor = caractere ^ motDePasse[i];

                    fichierCrypte.put(xor);

                    i++;
            }

            fichierACrypter.close();
            fichierCrypte.close();

            cout << "Fichier crypte avec succes !" << endl;
           
            system("pause > nul");

            return EXIT_SUCCESS;
    }
     


    J'ai effectué quelqus tests sur des fichiers .txt assez petit puisque ne contenant que peu de mots et ensuite sur des fichiers plus gors, avec plusieurs lignes et des images. En comparant le résultat après le décrptage et le fichier d'origine, je m'aperçoit qu'il manque une partie du fichier et ce, quelquesoit la longueur du mot de passe.
    • Partager sur Facebook
    • Partager sur Twitter
      2 août 2007 à 15:51:01

      Bonjour à toi, je ne t'apporte aucune solution pour ton problème mais je vais qu'en mêm t'enseigner un petit truc ;)

      Je trouve une partie de ton code un peu lourde :
      if(i > longueurPasse) // Si c'est la fin du mot de passe, on remet i à 0
      {
          i = 0;
      }

      xor = caractere ^ motDePasse[i];
      //...
      i++;


      Connais tu l'opérateur modulo (%) ? Qui est le reste de la division entière. Sous cette explication un peu barbare reste un principe simple... prend cette suite de division simple

      1 / 3 = 0 ( 0.3333 )
      2 / 3 = 0 ( 0.6666 )
      3 / 3 = 1 ( 1 )
      4 / 3 = 1 ( 1.3333 )
      ...

      comme tu peux le constater C++ ne fait qu'oublier qu'il y a quelque chose après, Modulo à l'inverse va calculer combien de partie il reste à la division.

      1 / 3 = 0... ( en fait comme 1 ne se divise pas par trois il reste complet -> il reste 1 partie de 3 )
      1 % 3 = 1

      et la suite

      2 % 3 = 2 ( 2 / 3 donne 0 reste 2 )
      3 % 3 = 0 ( 3 / 3 donne 1 reste 0... c'est logique 3 se divise lui même )
      4 % 3 = 1 ( 4 / 3 donne 1 reste 1 )
      etc...

      Tu peux voir que les valeurs d'un modulo reste toujours entre 0 et r-val - 1 ( r-val pour "valeur de droite de l'opération" soit 3 )

      les valeurs possibles d'un modulo 10 : 0, 1, 2, 3, 4, 5, 6, 7, 8 et 9
      WOW! c'est comme les valeurs possible d'un tableau de 10 cases!


      et oui... alors lorsque ton but n'est pas de parcourir ton tableau une seule fois d'un bout à l'autre mais de recommencer à chaque fois que tu arrive à une limite tu peux facilement utiliser modulo!

      xor = caractere ^ motDePasse[ i % longueurPasse ];
      i++;

      // ou avec un effort énorme de compression :

      xor = caractere ^ motDePasse[ i++ % longueurPasse ];


      Ref :
      http://www.siteduzero.com/tuto-3-1612-1-une-bete-de-calcul.html
      http://docs.mandragor.org/files/Programming_languages/Cpp/Cours_de_c-cpp_par_Christian_Casteyde_%5Bfr%5D/x457.html
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        2 août 2007 à 16:35:29

        Ta première solution est exacte mais j'en doute pour la seconde.

        L'incrémentation se fait avant la sélection du caractère dans ton code or, avec cette méthode, tu ne sélectionneras jamais le premier caractère du mot de passe.

        Imaginons le mot de passe suivant : motdepasse soit 10 caractères.

        Lors de la première execution de la boucle, voici ce que va effectuer le CPU :

        Il va sélectionner (0 + 1) % 10 soit 1 % 10 = 1 et non 0 comme il faudrait.

        Il faut donc faire l'incrémentation après la sélection du caractère.
        • Partager sur Facebook
        • Partager sur Twitter
          2 août 2007 à 16:41:18

          Non car l'opérateur ++ est un peu spécial

          si i vaut 0

          i++ retourne la valeur de i (0) et l'incrémente ensuite (1)

          s'il est placé en avant c'est l'inverse :

          ++i incrémente la valeur de i (1) et la retourne ensuie (1)

          donc :
          int i = 0, j = 0;
          j = i++;
          cout << i << endl; // affiche "1";
          cout << j << endl; // affiche "0";

          j = ++i;
          cout << i << endl; // affiche "2";
          cout << j << endl; // affiche "2";
           
          • Partager sur Facebook
          • Partager sur Twitter
            2 août 2007 à 21:22:47

            N'ouvre pas tes fichiers en mode texte.
            • Partager sur Facebook
            • Partager sur Twitter
            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            Anonyme
              2 août 2007 à 22:50:50

              Effectivement, il fallait ouvrir le fichier en mode binaire.

              Merci à vous deux.
              • Partager sur Facebook
              • Partager sur Twitter

              Problème XOR

              × 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