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

  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 !

  12. #12
    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
    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 !
    Ce n'est pas normal. Tu as bien ouvert tes fichiers en mode binaire ?
    Tu ne t'es pas trompé de noms ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Tu as bien ouvert tes fichiers en mode binaire ?
    Tu ne t'es pas trompé de noms ?
    Non, et je viens de revérifier. La manoeuvre réussit parfaitement avec des .txt, mais pas avec des .jpg

    Et pourtant, ça marche également avec des .c, et puis je peux passer d'un .txt à un .jpg, dans ce cas ça marche aussi...

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Ça ressemble à un problème de caractère nul...
    Tu es sûr que tu n'utilises nulle part le caractère nul comme délimiteur dans ton cryptage?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    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
    Non, et je viens de revérifier. La manoeuvre réussit parfaitement avec des .txt, mais pas avec des .jpg

    Et pourtant, ça marche également avec des .c, et puis je peux passer d'un .txt à un .jpg, dans ce cas ça marche aussi...
    Je viens de vérifier sur un gros .jpg avec mon code (celui que j'ai posté), Ca fonctionne parfaitement. Tu ne t'es pas trompé de clé de codage ? Ca doit être strictement la même...

    je ne peux pas les uploader, trop gros...

  16. #16
    Invité
    Invité(e)
    Par défaut
    Tiens oui avec ton code ça marche

    Bon ben le problème vient sûrement du mien (quelle déduction !). Je le poste à tout hasard (je l'avais un peu modifié en fonction de tes conseils mais j'ai gardé quelques choses de l'original quand même )...

    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
    #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, const char cle[])
    {
        size_t i=0;
        char caract;
        char newCaract;
     
        while( ( caract = fgetc(file1) ) != EOF )
        {
            newCaract = cle[i] ^ caract;
            fputc(newCaract, file2);
     
            i++;
            if ( i == strlen(cle) )
            {
                i=0;
            }
        }
     
        return 1;
    }
     
     
    int main(int argc, char *argv[])
    {
        char path1[TAILLE_MAX_PATH];
        int ret = EXIT_FAILURE;
     
     
        printf("Nom du fichier %c crypter ou %c d%ccrypter : ",
        '\x85','\x85','\x82');
        fflush(stdout);
        scanf("%s", path1);
     
        FILE *file1 = fopen(path1, "rb");
        if(file1 == NULL)
        {
            perror(path1);
        }
        else
        {
            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)
            {
                perror(path2);
            }
            else
            {
                char cleDeCryptage[TAILLE_MAX_CLE];
                printf("\nCl%c de cryptage : ",'\x82');
                fflush(stdout);
                scanf("%s", cleDeCryptage);
     
                if( xor(file1, file2, cleDeCryptage) )
                {
                    printf("Cryptage ou d%ccryptage r%cussi avec succ%cs",
                    '\x82', '\x82', '\x8a');
                    fflush(stdout);
                    ret = EXIT_SUCCESS;
                }
                else
                {
                    printf(
                    "Une erreur est survenue lors du cryptage ou d%ccryptage.",
                    '\x82');
                    fflush(stdout);
                }
                fclose(file2);
            }
            fclose(file1);
        }
     
     
        return ret;
    }

  17. #17
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    static int xor(FILE *file1, FILE *file2, const char cle[])
    {
        size_t i=0;
        char caract;
        char newCaract;
     
        while( ( caract = fgetc(file1) ) != EOF )
    Le type retourné par getchar() est int et non char. Ton programme s'arrête au premier 255 qu'il trouve...

  18. #18
    Invité
    Invité(e)
    Par défaut
    Aaaaaaah c'était donc ça

    Merci

+ 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