IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Algorithme XOR - Bogue


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Algorithme XOR - Bogue
    Hello World !

    J'espère que je poste dans le bon forum (car je pense que la source de mon problème vient du C...)

    Voici mon problème : j'ai fait connaissance avec l'algorithme de cryptage XOR, et j'ai tenté de coder un tel algorithme en C. Résultat : ça marche ! Mais lorsque je décrypte, il s'ajoute à la fin du fichier 3 petits caractères qui viennent de je ne sais où

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    #define TAILLE_MAX_PATH 50
    #define TAILLE_MAX_CLE 20
     
     
    int xor(FILE *file1, FILE *file2, char cle[]);
     
     
    int main(int argc, char *argv[])
    {
        FILE *file1 = NULL;
        FILE *file2 = NULL;
        char path1[TAILLE_MAX_PATH];
        char path2[TAILLE_MAX_PATH];
        char cleDeCryptage[TAILLE_MAX_CLE];
     
     
        printf("Nom du fichier %c crypter ou %c d%ccrypter : ",
        '\x85','\x85','\x82');
        scanf("%s", path1);
     
        file1 = fopen(path1, "rb");
        if(file1 == NULL)
        {
            printf("\nErreur : impossible d'ouvrir le fichier %s.\n", path1);
            exit(EXIT_FAILURE);
        }
     
     
        printf("\nNom du fichier de destination : ");
        scanf("%s", path2);
     
        file2 = fopen(path2, "wb"); // mode binaire
        if(file2 == NULL)
        {
            printf("\nErreur : impossible d'ouvrir ou de cr%cer le fichier %s.\n",
            '\x82', path2);
            exit(EXIT_FAILURE);
        }
     
     
        printf("\nCl%c de cryptage : ",'\x82');
        scanf("%s", cleDeCryptage);
     
     
        if( xor(file1, file2, cleDeCryptage) )
        {
            printf("Cryptage ou d%ccryptage r%cussi avec succ%cs",
            '\x82', '\x82', '\x8a');
        }
        else
        {
            printf("Une erreur est survenue lors du cryptage ou d%ccryptage.",
            '\x82');
        }
     
     
        if ( file1 != NULL )
            fclose(file1);
     
        if ( file2 != NULL )
            fclose(file2);
     
     
        return EXIT_SUCCESS;
    }
     
     
    int xor(FILE *file1, FILE *file2, char cle[])
    {
        int i=0;
        char caract;
        char newCaract;
     
        fseek(file1, 0, SEEK_SET);
     
        do{
     
            caract = fgetc(file1);
            newCaract = cle[i] ^ caract;
            fputc(newCaract, file2);
     
            i++;
            if ( i == strlen(cle) )
                i=0;
     
        } while (caract != EOF);
     
        return 1;
    }
    Pour expérimenter le bogue : créer un fichier, le crypter dans un nouveau fichier, et le décrypter dans un troisième fichier, puis comparer le premier et le dernier. Normalement, vous devriez voir la même chose excepté à la fin, où quelques bizarreries apparaissent...

    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    tu as cb de lignes dans ton fichier ?
    est ce que ca ne serait pas les caractères de fin de ligne qui ont été cryptés ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ben je suppose que les caractères de fin de ligne (et sauts de ligne) ont été cryptés aussi, puisque quand je décrypte ceux-ci sont respectés.

  4. #4
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    c'est quand tu décryptes que les caractères bizarres apparaissent ?

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jo_le_coco
    algorithme de cryptage XOR, et j'ai tenté de coder un tel algorithme en C. Résultat : ça marche ! Mais lorsque je décrypte, il s'ajoute à la fin du fichier 3 petits caractères qui viennent de je ne sais où

    Voici le code :
    La fonction de lecture doit s'arrêter dès qu'elle détecte EOF et ne pas traiter cette valeur qui n'est pas une caractère valide.

    Corrections et améliorations. Pose des questions si tu ne comprends pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define TAILLE_MAX_PATH 50
    #define TAILLE_MAX_CLE 20
     
    static int xor (FILE * file1, FILE * file2, char const cle[])
    {
       size_t i = 0;
       int caract;
       size_t const lencle = strlen (cle);
     
       while ((caract = fgetc (file1)) != EOF)
       {
          int const newCaract = cle[i] ^ caract;
          fputc (newCaract, file2);
     
          i++;
          if (i == lencle)
          {
             i = 0;
          }
       }
     
       return 1;
    }
     
    int main (void)
    {
       int ret = EXIT_FAILURE;
       char path1[TAILLE_MAX_PATH];
     
       printf ("Nom du fichier a crypter ou a decrypter : ");
       fflush (stdout);
       scanf ("%s", path1);
       {
          FILE *file1 = fopen (path1, "rb");
          if (file1 != NULL)
          {
             char path2[TAILLE_MAX_PATH];
     
             printf ("\nNom du fichier de destination : ");
             fflush (stdout);
             scanf ("%s", path2);
             {
                FILE *file2 = fopen (path2, "wb"); // mode binaire
                if (file2 != NULL)
                {
                   char cleDeCryptage[TAILLE_MAX_CLE];
                   printf ("\nCle de cryptage : ");
                   fflush (stdout);
                   scanf ("%s", cleDeCryptage);
     
                   if (xor (file1, file2, cleDeCryptage))
                   {
                      printf ("Cryptage ou decryptage reussi avec succes");
                      ret = EXIT_SUCCESS;
                   }
                   else
                   {
                      printf
                         ("Une erreur est survenue lors du cryptage ou decryptage.");
                   }
     
                   fclose (file2);
                }
                else
                {
                   perror (path2);
                }
             }
             fclose (file1);
          }
          else
          {
             perror (path1);
          }
       }
       return ret;
    }
    Reste le problème de la saisie qui est très fragile. Utiliser fgets().

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  6. #6
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par jo_le_coco
    Voici mon problème : j'ai fait connaissance avec l'algorithme de cryptage XOR, et j'ai tenté de coder un tel algorithme en C. Résultat : ça marche ! Mais lorsque je décrypte, il s'ajoute à la fin du fichier 3 petits caractères qui viennent de je ne sais où
    Je n'ai pas regardé ton code mais lorsque je m'amusais à réaliser des algos de chiffrement, j'ai été confronté à ce soucis et cela provient surement du fait que ton texte à crypter(chiffrer est le terme correct) doit être un multiple de la taille de ta clef!
    A toi donc de vérifier la taille de ton texte au préalable et de gérer cela en fonction.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par homeostasie
    cela provient surement du fait que ton texte à crypter(chiffrer est le terme correct) doit être un multiple de la taille de ta clef!
    Rien à voir.

    Une fois que le codage est correct, le code fonctionne parfaitement sur n'importe quel fichier avec n'importe quelle clé (dans le limites imposées par le programme).

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup, ça marche maintenant

    Citation Envoyé par Emmanuel Delahaye
    Pose des questions si tu ne comprends pas.
    Bon ben puisque cela m'est proposé avec tant de générosité, je ne comprends pas :
    • A quoi sert le static de la fonction xor, alors qu'il n'y a qu'un fichier
    • A quoi servent les fflush(stdout)
    • Pourquoi éviter d'utiliser la fonction exit() (je suppose que ça sert à fermer les fichiers avant de quitter le programme ?)
    • Et enfin à quoi sert perror()


    Merci encore

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jo_le_coco
    1. A quoi sert le static de la fonction xor, alors qu'il n'y a qu'un fichier
    2. A quoi servent les fflush(stdout)
    3. Pourquoi éviter d'utiliser la fonction exit() (je suppose que ça sert à fermer les fichiers avant de quitter le programme ?)
    4. Et enfin à quoi sert perror()
    1. La fonction n'étant pas exportée, il est inutile de la rendre publique. Elle est donc privée (statique).
    2. http://emmanuel-delahaye.developpez....#fflush_stdout
    3. Parce qu'il est déjà prévu une 'voie naturelle', c'est à dire le return de main(). Les sorties sauvages ne sont pas recommandées.
    4. A afficher l'erreur en clair.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Merci bien pour toutes ces réponses, c'est plus clair maintenant (et je pense que je vais de ce pas lire tes notes, ça commence à s'imposer )

  11. #11
    Invité
    Invité(e)
    Par défaut
    Euh... une dernière question à propos de cet algorithme

    Comment se fait-il qu'il soit impossible de crypter un JPG ? En effet quand j'essaie de crypter image.jpg dans crypt.jpg, ce dernier ne contient aucun caractère !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. implémentation algorithme XOR
    Par darkwall_37 dans le forum Débuter
    Réponses: 36
    Dernier message: 29/03/2013, 21h05
  2. Cryptographie algorithme XOR
    Par KaNDeL dans le forum Débuter
    Réponses: 5
    Dernier message: 29/09/2009, 17h56
  3. [Algorithme]XOR
    Par zitoun dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 29/11/2005, 09h11
  4. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo