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?
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...
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 }
Partager