Titre: [C] crypteur/décrypteur XOR
Posté par: Ge0 le 01 Juin 2006 à 15:08:46
Yop all. Je bosse actuellement, comme vous pouvez constater dans le titre, sur un crypteur/décrypteur XOR en langage C, le problème c'est que, à cause de mon noobisme dans ce langage, je n'arrive pas à faire suivre le cryptage quand je compare les bits du second caractère de la clé avec celle de la phrase (j'imagine pas la galère pour revenir au début de la clé...).
Quelqu'un pourrait-il m'aider ? :oops:
Titre: [C] crypteur/décrypteur XOR
Posté par: pepekiss le 01 Juin 2006 à 15:11:21
si tu mets les sources je peux t'aider
Titre: [C] crypteur/décrypteur XOR
Posté par: Ge0 le 02 Juin 2006 à 10:59:48
lol je la mettrai quand je serais sur ma bécane, merci :D
Titre: [C] crypteur/décrypteur XOR
Posté par: letsgo le 03 Juin 2006 à 18:39:04
Salut tout le monde, j ai repioche un vieux fichier a moi qui fait ca : main.c #include <stdio.h> #include <stdlib.h> #include <string.h>
void xor_file (FILE* source, FILE* destination, char* clef) { long taille, i; int h, c;
i = 0; taille = strlen (clef); h = fgetc (source);
while (!feof (source)) { c = h ^ clef [i]; fputc (c, destination); i++; if (i == taille) { i = 0; } h = fgetc (source); } } void error (FILE* file, char* filename) { if (!file) { fprintf (stderr, "Impossible d'ouvrir le fichier %s\n", filename); } }
int xor (char* src, char* dest, char* clef) { FILE * source, *destination;
if ( ( (source = fopen (src, "rb")) != NULL) && ( (destination = fopen (dest, "wb")) != NULL)) { xor_file (source, destination, clef); fclose (source); fclose (destination); return 1; }
error (source, src); error (destination, dest); return 0; } void usage (char* cmd) { fprintf (stderr, "Usage : %s src dest clef\n", cmd); exit (EXIT_FAILURE); }
int main (int argc, char* argv[]) { long e = LONG_MAX;
if (argc < 4) { usage (argv[0]); } xor (argv[1], argv[2], argv[3]); return EXIT_SUCCESS; } Utilisation : tu compiles comme tu le sens, gcc main.c au plus simple : on aura un a.out (a.exe pour sous win) et la, sous console : on crypte fichier1 en fichier 2 avec la clef "letsgo" a.out fichier1.txt fichier2.txt letsgo on decrytpe le fichier2.txt dans fichierDecrypte.txt avec la meme clef par la commande : a.out fichier2.txt fichierDecrypte.txt letsgo Et si tout va bien (et y a de raisons qu il y en aille autrment), fichier1.txt et fichierDecrypte.txt sont identiques ^^ Voilou ;)
Titre: [C] crypteur/décrypteur XOR
Posté par: Ge0 le 03 Juin 2006 à 20:54:31
/me se gratte la tête
bon... Vais me remettre au PHP moi hein... lol Merci beaucoup letsgo, infiniment... :oops:
Titre: [C] crypteur/décrypteur XOR
Posté par: letsgo le 03 Juin 2006 à 22:12:36
N hesite pas a demander des precisions si ca ne te semble pas clair ...
le "cryptage" se fait a la ligne -> c = h ^ clef ; A noter que si ton fichier à crypter a des caracteres '\0' consecutifs, la clef est ecrite en clair, en effet, si h = '\0', alors '\0' ^ clef = clef ! Amusant de voir la clef ecrite en clair =)
Titre: [C] crypteur/décrypteur XOR
Posté par: Ge0 le 09 Juin 2006 à 10:49:33
Ingénieux :)
Titre: [C] crypteur/décrypteur XOR
Posté par: Ge0 le 09 Juin 2006 à 11:09:57
re j'ai essayé de faire àa par moi-même et j'obtiens au final un fichier qui contient pleins de gros carrés et qui fait 5 mégas octets environ. Voici mon code : #include <stdio.h> #include <stdlib.h>
enum{SUCCESS,FAIL};
void XorAndWrite(FILE *fin,FILE *fout);
FILE *fptr1,*fptr2;
char filename1[20]; // Fichier de lecture char filename2[20]; // Fichier d'écriture char key[20]; // La clé à rentrer par l'utilisateur int reval = SUCCESS;
int main() { printf("Entrez le nom du fichier a ouvrir en lecture :\n"); gets(filename1); printf("Entrez le nom du fichier a ouvrir en ecriture :\n"); gets(filename2); printf("Entrez votre clé de cryptage :\n"); gets(key);
fptr1 = fopen(filename1,"r"); fptr2 = fopen(filename2,"w"); if(fptr1 == NULL) { printf("Impossible d'ouvrir %s !\n",filename1); reval = FAIL; } else if(fptr2 == NULL) { printf("Impossible d'ouvrir %s !\n",filename2); reval = FAIL; } else { // Tout est bon, on lance la fonction et on ferme les fichiers XorAndWrite(fptr1,fptr2); fclose(fptr1); fclose(fptr2); } return 0; }
/* Définition de fonction */ void XorAndWrite(FILE *fin, FILE *fout) { char ch; int i; ch = fgetc(fin); while(ch != EOF) { for(i=0; i<=key[20]; i++) { fprintf(fout,"%c",ch^key[i]); if(key[i] == '\0') { i = 0; // Retour de la boucle :p } } } } Toujours prêt à m'aider ?
Titre: [C] crypteur/décrypteur XOR
Posté par: Ge0 le 13 Juin 2006 à 09:58:28
non finalement tout va bien : regardez : #include <stdio.h> #include <stdlib.h>
void XorAndWrite(FILE *fout);
FILE *fptr1;
char phrase[255]; char filename1[20]; char key[20];
int main() { printf("Entrez votre phrase (255 caractères maximum !)\n"); gets(phrase); printf("Entrez votre cle de cryptage (20 caracteres max)\n"); gets(key); int longueur_phrase = sizeof(puts(phrase)); int longueur_key = sizeof(puts(key)); printf("Nom du fichier à créer :\n"); gets(filename1); fptr1 = fopen(filename1,"w"); if(fptr1 == NULL) puts("Erreur lors de l'ouverture du fichier..."); else{ XorAndWrite(fptr1); fclose(fptr1); } return 0; }
void XorAndWrite(FILE *fout) { int i = 0; int j = 0; while(1) { if(phrase[i] == '\0') break; fprintf(fout,"%d ",phrase[i] ^ key[j]); if(key[j] == '\0') j = 0; j++; i++; } printf("Encryptage termine !!\n"); system("pause"); }
|