ce code permet un cryptage et decryptage de vigenere.
pour executer le programme :
compiler
en ligne de commande taper : vigenere.exe -c -pwd nomfichier
pwd : le mot de passe pour le cryptage.
nomfichier : le nom de fichier à crypter
pour le decryptage : mm syntaxe en replacant c par d.
Source / Exemple :
/*
Name: vigenere
Copyright: Mars 2011
Author: Lajouad Rachid
Date: 06/03/11 22:00
Description: cryptage et décryptage par la méthode de viginère
avec une ligne de commande
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
char Crypt(char,char*);
char Decrypt(char,char*);
int main(int argc,char *argv[]) {
if(argc < 4) {
printf("syntax error : \n"
"Syntaxe de la commande : \n\n\t"
"%s -{c|d} -pwd NomFichier\n",argv[0]);
getchar();
exit(1);
}
if(strcmp(argv[1],"-c") == 0) {
FILE *fs, *fd;
char fname[200],pwd[10];
char c;
fs = fopen(argv[3],"rb+");
if(fs == NULL) {
printf("syntax error : \n"
"Syntaxe de la commande : \n\n\t"
"%s -{c|d} -pwd NomFichier\n",argv[0]);
printf("\n\n fichier inexistant ... Retype command ... ");
getchar();
exit(1);
}
strcpy(fname,argv[3]);
fname[strlen(argv[3])-3] = 'v';
fname[strlen(argv[3])-2] = 'i';
fname[strlen(argv[3])-1] = 'g';
fd = fopen(fname,"wb+");
// sauvegarder l'extension à l'interieur du fichier crypté
fprintf(fd,"%c",argv[3][strlen(argv[3])-3]);
fprintf(fd,"%c",argv[3][strlen(argv[3])-2]);
fprintf(fd,"%c",argv[3][strlen(argv[3])-1]);
while( !feof( fs ) ) {
fscanf(fs,"%c",&c);
fprintf(fd,"%c",Crypt(c,argv[2]));
}
fclose(fs); fclose(fd);
}
else if(strcmp(argv[1],"-d") == 0) {
FILE *fs, *fd;
char fname[200],pwd[10];
char c;
int j = 0;
fs = fopen(argv[3],"rb+");
if(fs == NULL) {
printf("\n\n fichier inexistant ... Retype command ... ");
exit(1);
}
strcpy(fname,argv[3]);
//rerstauration de l'extension du fichier
while( !feof( fs ) ) {
if( j < 3) {
j++;
fscanf(fs,"%c",&c);
fname[strlen(argv[3])-4+j] = c;
}
else {
if(j == 3) fd = fopen(fname,"wb+");
j++;
fscanf(fs,"%c",&c);
fprintf(fd,"%c",Decrypt(c,argv[2]));
}
}
fclose(fs); fclose(fd);
}
else {
printf("commutateur inconnu ...\n\n");
printf("syntax error : \n"
"Syntaxe de la commande : \n\n\t"
"%s -{c|d} -pwd NomFichier\n",argv[0]);
exit(1);
}
printf("\n\n\t\t\tsuccess ... cryptage terminé");getchar();
}
char Crypt(char c,char *pwd){
static int i;
if(++i >= strlen(pwd)) i = 0;
return (c + (pwd[i] - '0'));
}
char Decrypt(char c,char *pwd){
static int i;
if(++i >= strlen(pwd)) i = 0;
return (c - (pwd[i] - '0'));
}
Conclusion :
j'attend vos commentaires ..
6 déc. 2011 à 09:07
Une chose que je comprends pas... Pourquoi la soustraction par le char '0'?
Normalement le cryptage de Vigénère consiste à faire seulemet : c - pwd[i] non?
A+
6 déc. 2011 à 19:46
Ex:
char c = '5';
int i = c - '0'; // i vaudra 5
Attention, on a ici affaire à un chiffrement et non à un "cryptage". Voir la différence: http://www.cppfrance.com/forum/sujet-CS-CORRECTION-TITRE-THEME-FORUM_1387875.aspx
10 déc. 2011 à 13:28
C'est de la magie...
Non enfaite, j'avais pas réfléchit... -_-
Le fait de soustraire par le caractère '0' comme il est fait pour calculer l'entier i, reviens à faire le calcule suivant:
i = 65 - 60 ( 65 et 60 étant respectivement les codes ascii de 5 et 0).
Sinon c'est intéressant de référencer la différence entre crypter et chiffrer. Il est vrai que je fais moi même l'erreur.
A+
12 déc. 2011 à 18:16
Quelques commentaires :
- Il y a des moyens plus simples en C pour gérer les noms de fichier, et en particulier récupérer leur extension sans utiliser plusieurs strlen, qui est une operation couteuse).
- Tes fonctions Crypt et Decrypt gardent une variable static pour l'avancement dans le mot de passe, mais pourquoi leur passer à chaque appel le pwd (qui ne change pas) et surtout recalculer le strlen() du pwd ?
Dans l'ideal tu pourrais utiliser une class pour garder le pwd, la position et la longuer du mot de passe. En C "ansi" comme c'est le cas ici tu devrais pouvoir "feinter" en appelant ta fonction une première fois avec le pwd, et les fois suivantes avec NULL. Ca donnerait :
char Crypt(char c,char *passwd){
static int i, len;
static char* pwd;
if(passwd){
pwd = passwd;
len = strlen(pwd);
i=0;
return 0;
}
else
{
if(++i >len) i 0;
return (c + (pwd[i] - '0'));
}
}
C'est une implementation tres moche (l'alternative etant d'utiliser des variables globales et deux fonctions differentes pour initialiser l'operation et pour (de)crypter, mais sans te lancer dans du C++ je ne vois pas mieux (quelqu'un a une idee ?)
En tous cas ca devrait bien accelerer ton programme.
Note que ta fonction n'a pas l'air de fonctionner pour toutes les valeurs de caractère. Par exemple si la cle contient £ (code ASCII 156) et le texte aussi, le cryptage va donner 156+156-'0' 312-48 264, ce qui ne rentre pas dans un char.
Eric
12 déc. 2011 à 18:19
Euh, en quelle base ? :o)
En décimal, 65 "A" et 60 "<". En Hexa, 65 = "e" et 60 = "`"...
'0' = 30 en hexa ou 48 en décimal.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.