logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» [C] crypteur/décrypteur XOR
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [C] crypteur/décrypteur XOR  (Lu 4142 fois)
Ge0

Profil challenge

Classement : 16/54325

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« 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 ?
Journalisée
pepekiss

Profil challenge

non classé(e).

Membre Junior
**
Hors ligne Hors ligne
Messages: 67


Voir le profil
« #1 le: 01 Juin 2006 à 15:11:21 »

si tu mets les sources je peux t'aider
Journalisée
Ge0

Profil challenge

Classement : 16/54325

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« #2 le: 02 Juin 2006 à 10:59:48 »

lol je la mettrai quand je serais sur ma bécane, merci
Journalisée
letsgo
Profil challenge

Classement : 35447/54325

Néophyte
*
Hors ligne Hors ligne
Messages: 2


Voir le profil
« #3 le: 03 Juin 2006 à 18:39:04 »

Salut tout le monde,
 j ai repioche un vieux fichier a moi qui fait ca :

main.c
Code:
#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);
    }
}
Code:
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;
}
Code:
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
Journalisée
Ge0

Profil challenge

Classement : 16/54325

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« #4 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...
Journalisée
letsgo
Profil challenge

Classement : 35447/54325

Néophyte
*
Hors ligne Hors ligne
Messages: 2


Voir le profil
« #5 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
Journalisée
Ge0

Profil challenge

Classement : 16/54325

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« #6 le: 09 Juin 2006 à 10:49:33 »

Ingénieux
Journalisée
Ge0

Profil challenge

Classement : 16/54325

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« #7 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 :

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 ?
Journalisée
Ge0

Profil challenge

Classement : 16/54325

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« #8 le: 13 Juin 2006 à 09:58:28 »

non finalement tout va bien : regardez :
Code:
#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");
}
Journalisée
Pages: [1]
  Imprimer  
 
Aller à: