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 :

question langage C


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut question langage C
    Bonjour,
    Je dois faire un programme de décodage de fichier crypté d'archives contenant les informations.
    les fichiers sont structurés de la manière suivante:
    - un fichier crypté des archives
    DISK$ASSISTANTS:[COMMON.2.TP1]archives_ctu.dat

    Ces informations ne sont pas directement lisibles et nécessitent un décryptage. Les lignes du fichier sont cryptées avec une clé et une opération XOR (détaillée plus loin). Cependant les retours à la ligne ont été préservés.
    Des clés différentes ont été utilisées pour crypter le fichier. Chaque clé permet de décrypter une zone du fichier indiquée par l'index.
    - un index du fichier d'archives, indiquant quelles lignes du fichier, donc
    quelles informations, peuvent être décryptées par chaque groupe.
    DISK$ASSISTANTS:[COMMON.2.TP1]index_archives_ctu.dat

    C'est un fichier texte, avec sur chaque ligne 3 colonnes, séparées par un
    espace, qui indiquent: la clé, puis la ligne de début et nombre de lignes à
    décrypter avec cette clé.

    2A101 1 8
    2A102 9 7
    ....
    Pour lire les informations du fichier d'archives, il est conseillé de définir
    un type structuré composé des 3 champs du fichier d'index précédemment décrits.
    L'algorithme de cryptage est le suivant : Après avoir parcouru la ligne de l'index correspondant à votre clé,
    il faut parcourir le fichier d'archives.
    Chaque ligne a été cryptée avec une opération XOR, de la manière suivante:
    Rappel sur l'operateur XOR:
    ---------------------------
    a ^ a =0
    (a ^ b ) ^ b = a
    Le XOR est un opérateur logique bit a bit qui provient de l'assembleur et qui
    permet un cryptage reversible. Si on effectue l'opération XOR entre chaque
    caractère du texte à crypter et un caractère de la clé, le texte devient
    illisble et la seule facon de le retrouver est de refaire le XOR avec la
    meme la clé. Il s'agit donc d'un algorithme de cryptage symétrique.

    Exemple :
    ---------
    contenu du fichier source : "Bonjour"
    cle de cryptage : "2B103"

    traitement a effectuer :
    -------------------------
    Hexa caractère
    B ^ 2 = 70 p
    o ^ B = 2d -
    n ^ 1 = 5f _
    j ^ 0 = 5a Z
    o ^ 3 = 5c \
    u ^ 2 = 47 G
    r ^ B = 30 0
    le symbole ^ represente le ou exclusif bit a bit, le 2d represente le resutat entier (en Hexadécimal) de o ^ B

    Remarques :
    ----------

    - Si on applique la MEME cle au fichier destination (issu du premier cryptage)
    on doit obtenir en resultat le fichier source decrypte :
    => "Bonjour!"

    - Pour chaque caractère, le résultat de l'opération de cryptage XOR peut donner
    potentiellement n'importe quel code binaire supérieur ou égal à 0, y compris
    des caractères NULL (0), des LF (10) ou CR (13) qui perturberaient la
    manipulation du fichier ligne par ligne.

    Voici mon programme, il y a des erreurs, et je n'arrive pas à les corriger..
    De plus j'ai quelques question : Le scan des lignes du fichier d index va-t-il bien se faire ou est-ce que la taille de la variable ligne peut poser problème?
    Si les lignes du fichier d index faisait moins de 15 caractères, ce programme marcherait-il? La convertion ASCII va t elle
    fonctionner? L instruction return est-elle bien employée?
    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
    // TP1: Decryptage
     
     
    //version sans sous-programme
     
     
     
     
    # include <stdlib.h>
    # include <stdio.h>
    # include <string.h>
     
    # define TAILLE_MESSAGE 2000
    # define TAILLE_CLEF 6
    # define NOM_FICHIER_IND DISK...
    # define NOM_FICHIER_ARCH DIS...
    # define TAILLE_LIGNE_MESSAGE 80
    # define TAILLE_LIGNE_INDEX 15
     
     
     
    main (int argv, char argch[])
    {    FILE     *fp;
         int      prem_ligne,
                  nb_ligne,
                  i, j, c;
         char     message[TAILLE_MESSAGE],
                  ligne_ind[TAILLE_LIGNE_INDEX],
                  ligne[TAILLE_LIGNE_MESSAGE],
                  clef[TAILLE_CLEF], clef_bis[TAILLE_CLEF],
                  ch;
     
    // Initialisation des variables
     
     
     
    // On commence par chercher les numéros des lignes à décrypter
     
         fp = fopen("NOM_FICHIER_IND", "r");  //On ouvre le fichier index_archives en mode lecture
         if (fp == NULL)         //Si on n a pas pu l ouvrir 
         {
                printf("Fichier d index des archives introuvable\n"); //alors on affiche le message d erreur
                //return();
         }
         else     
         {          //Sinon on debute la recherche des informations nous permettant de savoir quelles lignes decrypter
                while ((fread(&ligne_ind, sizeof ligne_ind, 1, fp), !feof(fp)) && (strcmp(clef_bis, clef) != 0))
                //Tant qu on ne lit pas la bonne information et qu on est pas en fin de fichier
                {
                         sscanf(ligne_ind, "%s %d %d", &clef_bis, &prem_ligne, &nb_ligne); //On passe à l information suivante
                }
                if (strcmp(clef_bis, clef) != 0)
                {
     
                         printf("Références des lignes à décrytpter introuvable introuvable\n");
                         return;
                }
                fclose(fp);           //Fermeture du fichier               
         } 
     
    // Puis on va récupérer le message crypté
     
         fp = fopen("NOM_FICHIER_ARCH", "r");
         for (i = prem_ligne; i <= (prem_ligne + nb_ligne - 1); i++)
         {
             fseek(fp, sizeof(ligne)*(i - 1), 0);
             fread(&ligne, sizeof ligne, 1, fp);
             strcat(message, ligne);
         }
         fclose(fp);
     
    // Il faut ensuite le décrypter puis l afficher
     
         for (i = 0; i < TAILLE_MESSAGE; i++)
         {
                if (message[i] != "\0" )
                {
                         ch = message[i] ^ clef[j];
                         c = ch; //En supposant que la convertion en ASCII marche ainsi...
                         if (c < 0)
                            c = c + 128;
                         message[i] = c;
                         if (j < (TAILLE_CLEF - 1))
                            j++;
                         else
                            j = 0;
                  } 
         }
         printf("%s\n", message);
     
    // Reste à gérer l enregistrement du message au besoin
     
    }
    Merci beaucoup d'avance pour votre aide, je debute en C et c'est mon tout premier programme. J'ai regarde un peu vos cours en ligne, parce que mon professeur m'a vraiment très peu montré les fonctions du langage C...

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Quand-même, pour un débutant tu t'attaques pas à un petit problème !!!

    J'ai pas tout lu le code en détail mais dans tes fread() tu appelles à chaque fois "&ligne_ind" (pour le 1er) et "&ligne" (pour le 2°) => c'est une erreur
    "ligne_ind" et "ligne" sont déjà des adresses => pas la peine de mettre "&".
    Soit tu mets "&ligne_ind[0]", soit tu mets "ligne_ind" mais surtout pas "&ligne_ind". Idem pour le 2° read...

    Sinon essaye de découper ton problème en opérations élémentaires telles que "cryptage()" et "décryptage()". Ensuite tu attribues une fonction à chaque opération => ça rendra ton code plus aéré et plus clair et tu t'en sortiras mieux pour le débug

    PS: Merci pour le cours XOR mais tous les programeurs C connaissent ses propriétés de cryptage symétrique
    • clair xor clef = crypté
    • crypté xor clef = clair
    • crypté xor clair = clef


    D'ailleurs, si ça t'intéresse, une fois que t'auras réussi ton truc tu pourras l'améliorer par un double cryptage
    Explications
    1) tu crypte ton message clair avec ta clef => cela te donne un message crypté selon l'opération clair xor clef = crypté
    2) tu recryptes ton message crypté avec un message bidon => cela te donne une clef bidon selon l'opération crypté xor bidon = clefBidon

    Si on te chope ton message crypté et qu'on te torture (gros film) pour te faire cracher ta clef, tu donnes la clef bidon. L'ennemi appliquera l'opération
    crypté xor clefBidon = bidon => il récupèrera le message bidon et ne pourra jamais savoir que le message décrypté est un message bidon. Ce principe est déjà appliqué pour le logiciel TrueCrypt qui te permet de créer sur ton ordi un espace disque virtuel crypté...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Bon j’ai corrigé quelques erreurs que vous aviez vu. Je ne peux pas encore utiliser les fonctions, on ne me les a pas encore apprises, sinon je dis pas, ce serait plus clair ! Je voulais juste rappeler quelques détails :
    Le fichier d index des archives est ainsi fait :
    1A101 1 12
    1A102 13 17
    .
    .
    2B308 1742 15
    ..
    .
    2P109 1567 12

    Chaque ligne comporte une clef (2B308), une première ligne a décrypter(1742) et un nombre de lignes a décrypter(15).
    Le code source arrive à ouvrir le fichier (jusque la tout va bien) mais lorsqu’ il s agit de ‘scanner’ les lignes pour en extraire les informations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # define TAILLE_CLEF 6
    # define TAILLE_LIGNE_INDEX 15char    ligne_ind[TAILLE_LIGNE_INDEX],
               clef[TAILLE_CLEF], clef_bis[TAILLE_CLEF] ;
    …
                while ((fread(ligne_ind, sizeof ligne_ind, 1, fp), !feof(fp)) && (strcmp(clef_bis, clef) != 0))
                //Tant qu on ne lit pas la bonne information et qu on est pas en fin de fichier
                {
                         sscanf(ligne_ind, "%s %d %d", &clef_bis, &prem_ligne, &nb_ligne); //On passe à l information suivante
                }
    L examen de la variable « clef_bis » au debugger montre que tantôt elle prend la valeur d une clef, tantôt d une première ligne et tantôt d un nombre de ligne à décrypter… La tête de lecture du fichier doit en fait se positionner au milieu des lignes et non à chaque fois au début… J ai essayé de modifié le chiffre TAILLE_LIGNE_INDEX : 10, 13, 20… Rien n’y fait (en plus notez que la taille des lignes n’est pas toujours la même…) . Existe-t-il une fonction permettant de lire dans mon fichier une et UNE SEULE ligne à la fois ? Ou devrais-je tenter une autre approche (avec des structures par exemple) ?
    Merci d avance pour l’aide que vous pourrez m’apporter.

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Existe-t-il une fonction permettant de lire dans mon fichier une et UNE SEULE ligne à la fois ?
    fgets (lire absolument la documentation de cette fonction pour tous les détails de son fonctionnement)

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par claire_cartier Voir le message
    Je ne peux pas encore utiliser les fonctions, on ne me les a pas encore apprises, sinon je dis pas, ce serait plus clair !
    Non, pas possible qu'on te fasse faire un truc pareil sans t'avoir enseigné le principe et la création de fonctions

    Citation Envoyé par claire_cartier Voir le message
    Ou devrais-je tenter une autre approche (avec des structures par exemple) ?
    On peut pas t'avoir en plus enseigné les structures sans être passé par les fonctions. C'est pas sérieux comme cours...

    Sinon Diogène t'a bien répondu. fgets(ligne, taille_ligne, ptr_fichier) va lire une ligne (tout ce qu'il y a jusqu'au '\n') et le stocker dans la variable "ligne". Sauf si la ligne à lire est plus grosse que "taille_ligne" la fonction s'arrête à "taille_ligne - 1" pour pouvoir stocker le '\0'...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    On m' a effectivement parlé des fonctions mais pas des fichiers, et j ai préféré aborder progressivement les "nouveautés" du C (je suis initié au FORTRAN). Pour les structures, l' idée était de moi mais la encore je préfère utiliser la solution la plus simple, qui, visiblement, est fgets. Merci beaucoup pour l aide apportée. Je vous tiendrai au courrant du dénouement de la situation!
    Bonne fin de week-end!

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par claire_cartier Voir le message
    Pour les structures, l' idée était de moi mais la encore je préfère utiliser la solution la plus simple, qui, visiblement, est fgets.
    Mais les structures n'ont rien à voir avec fgets. Les structures permettent de définir un nouveau type de données "taillé sur mesure" pour représenter les données du problème posé. fgets est une fonction qui lit des données texte.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par diogene Voir le message
    Mais les structures n'ont rien à voir avec fgets. Les structures permettent de définir un nouveau type de données "taillé sur mesure" pour représenter les données du problème posé. fgets est une fonction qui lit des données texte.
    Oui mais quand elle a parlé de structures (dans son 2° post), elle ne connaissait pas encore "fgets()" dont tu ne lui as parlé qu'après.
    Ensuite j'ai un peu discuté sur ses connaissances du C (structures, fonctions) et elle m'a répondu à ma question sur son état d'esprit qui était le sien avant que tu ne lui parles de fgets (enfin je présume). Je comprends que quand on ne connait pas fgets(), on cherche alors désespérément une autre solution et qu'on puisse alors envisager si les structures ne seraient pas une idée à creuser...

    Pas évident les discussions à plusieurs sur fofo n'est-ce pas ?

Discussions similaires

  1. questions langage C
    Par space_56 dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 20/12/2007, 00h12
  2. question langage C
    Par space_56 dans le forum C
    Réponses: 12
    Dernier message: 02/11/2007, 12h45
  3. questions langage C
    Par akrlot dans le forum Débuter
    Réponses: 31
    Dernier message: 25/08/2007, 17h24
  4. [QUESTION] Langages à éviter ?
    Par Shadowritter dans le forum Langages de programmation
    Réponses: 28
    Dernier message: 12/01/2005, 10h34
  5. [langage] pb de question reponse
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 29/11/2002, 11h59

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