Yannikator
Messages postés23Date d'inscriptionmardi 23 octobre 2007StatutMembreDernière intervention10 novembre 2012 13 déc. 2011 à 23:30
En effet, autant pour moi, j'ai pris les valeurs en octal dsl, je me suis un peu précipité... Bon, ça ne change rien au raisonnement...
lajouad
Messages postés9Date d'inscriptionmardi 6 mars 2007StatutMembreDernière intervention 8 décembre 2011 13 déc. 2011 à 14:51
C'est vrai. tout a fait d'accord. Une grande différence entre cryptage et chiffrement.
Pour les autres remarques je vais en tenir compte dans mon prochain version ducode ....
merci
LeFauve42
Messages postés239Date d'inscriptionvendredi 20 octobre 2006StatutMembreDernière intervention20 avril 2009 12 déc. 2011 à 18:19
> i = 65 - 60 ( 65 et 60 étant respectivement les codes ascii de 5 et 0).
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.
LeFauve42
Messages postés239Date d'inscriptionvendredi 20 octobre 2006StatutMembreDernière intervention20 avril 2009 12 déc. 2011 à 18:16
Bonjour,
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
Yannikator
Messages postés23Date d'inscriptionmardi 23 octobre 2007StatutMembreDernière intervention10 novembre 2012 10 déc. 2011 à 13:28
Mais c'est un miracle!
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+
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 6 déc. 2011 à 19:46
En C, on soustrait par '0' pour convertir un char en nombre (à condition que le char soit bien entre 0 et 9).
Ex:
char c = '5';
int i = c - '0'; // i vaudra 5
13 déc. 2011 à 23:30
13 déc. 2011 à 14:51
Pour les autres remarques je vais en tenir compte dans mon prochain version ducode ....
merci
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.
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
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+
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
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+