CyberShadow Posté(e) le 25 décembre 2005 Partager Posté(e) le 25 décembre 2005 Hello à tous Je voudrais réaliser un petit prog en C qui prend une chaine de 8 caracteres et qui l'incremente sequentiellement, comme un compteur kilometrique de voiture... Donc la premiere chaine est aaaaaaaa et la derniere zzzzzzzz. Mon Pb est que mon prg fait bien l'incrementation de a à z sur chaque caracteres de la chaine mais ne respecte pas tout a fait le protocole... en effet lorsque j'arrive à: aaaaaaaz, il passe à: aaaaaba puis aaaaaaca, etc mais ne fait pas normalement: aaaaaaba > aaaaaabb > ... > aaaaaabz > aaaaaaca >... > zzzzzzzz. Voici le début de code: #include <stdio.h> #include <unistd.h> #include <string.h> int main() { char str[9]="aaaaaaaa"; int i; for(i=7; i>=0; i--) { while(str!='z') { printf("%s\n",str); str++; } if(str=='z') { printf("%s\n",str); str='a'; } } return 0; } Quelqu'un pourrait m'aider a faire le code de la seconde boucle qui incrémante correctement, a la maniére d'un compteur kilométrique ma chaine... Merci pour vos explications... Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 25 décembre 2005 Partager Posté(e) le 25 décembre 2005 fait un fonction qui prend en argument un pointeur vers char et qui fontcionne récursivement : int increm(char * p, int prof) { si *p == 'z' alors *p = 'a'; increm(p-1, prof+1); sinon *p = *p +1; } le p-1 est parce que tu pars de l'adresse la plus grande dans la chaine (tu pars de la droite pour aller vers la gauche, donc il faut décrémenter les adresses). il te reste à implémenter le cas où prof = taille de la chaîne, et donc où il ne faut pas appeler icrm(p-1, prof+1) Lien vers le commentaire Partager sur d’autres sites More sharing options...
copper Posté(e) le 25 décembre 2005 Partager Posté(e) le 25 décembre 2005 Quelque chose dans ce style : char str[9]="aaaaaaaa"; do { for(i=7;i>=0;i--) { if (str != 'z') { str++; break; } else { str='a'; } } printf("%s\n",str); } while (i != -1); Lien vers le commentaire Partager sur d’autres sites More sharing options...
CyberShadow Posté(e) le 25 décembre 2005 Auteur Partager Posté(e) le 25 décembre 2005 wouah quel rapidité... Merci pour vos suggestions, je vais les essayé. il te reste à implémenter le cas où prof = taille de la chaîne, et donc où il ne faut pas appeler icrm(p-1, prof+1 ok je vois, il suffit de faire un strcmp de la chaine en cours avec une autre chaine constante de type zzzzzzzz et si la val renvoyée est 0 (chaines identiques) alors fair un break ou un return. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 25 décembre 2005 Partager Posté(e) le 25 décembre 2005 bon, allez, d'habitude je le fais jamais, mais voilà le code, testé, et qui marche : #include <stdio.h> int increm(char *, int); int main() { char chaine[7] = "aaaaaa\0"; int i; printf("%s\n", chaine); for(i = 0; i < 100; i++) { increm(chaine +5, 5); printf("%s\n", chaine); } return 0; } int increm(char * c, int p) { if(*c == 'z') { *c = 'a'; if(p != 0) increm(c-1, p-1); } else *c = *c + 1; return 0; } Lien vers le commentaire Partager sur d’autres sites More sharing options...
CyberShadow Posté(e) le 25 décembre 2005 Auteur Partager Posté(e) le 25 décembre 2005 merci. En fait ceci est une toute petite partie d'un projet plus vaste... En fait je veux vérifier sous unix la crédibilité de mot de passe de 8 caractéres... Linux posséde un algo de cryptage des mots de passe qui est un algo impraticable (on ne peut pas le retourné pour décrypter le cryptage) et le truc consiste ne fait a entre cette liste séquentielle de mots de passe possible et de comparer le resulat de la nouvelle chaine cryptée avec la valeur original du cryptage de linux... C'est un prog en force brut. Si ca colle alors je connais le mot de passe. C'est un excellent moyen pour controler la sécurité des postes des utilisateurs dans une boite. Encore merci pour ce ptit coup de pouce... Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 25 décembre 2005 Partager Posté(e) le 25 décembre 2005 il y a quand même beaucoup plus fin comme attaque par brute force... le fait que la fonction de cryptage soit injective ne veut pas dire que l'on a pas d'indice pour ordonner les essais. en fait, on peut même montrer que présenter les exemples dans l'ordre alphabetique est une des méthodes les plus lente. on peut imaginer par exemple de présenter d'abord tous les mots de 8 lettre d'un dictionnaire international, puis les mots de 5+3 lettres, etc, avant de passer au combinaisons sans sens... enfin, connaissant l'algo de cryptage, on peut en déduire certaine propriétés (si tel mot n'est pas bon, alors telle famille de mot ne sera pas bon non plus), etc... il existe un logiciel de brute force sous unix : johntheripper. c'est un logiciel libre qui présente pas mal de fonction de cryptage : http://www.openwall.com/john/ par contre, si tu veux l'utiliser pour réellement hacker un vrai server sécurisé comme il faut en brut force, je te souhaite bien du courrage, et surtout d'avoir un bi-xeon hyperthreadé à 3GHz en plus de la petite semaine d'attente Lien vers le commentaire Partager sur d’autres sites More sharing options...
Krapace Posté(e) le 26 décembre 2005 Partager Posté(e) le 26 décembre 2005 Et puis un bon mot de passe ne contient pas que des lettres Lien vers le commentaire Partager sur d’autres sites More sharing options...
copper Posté(e) le 26 décembre 2005 Partager Posté(e) le 26 décembre 2005 Et puis un mot de passe ne fait pas exactement 8 caractères non plus Lien vers le commentaire Partager sur d’autres sites More sharing options...
RaphAstronome Posté(e) le 26 décembre 2005 Partager Posté(e) le 26 décembre 2005 Combinaisons possibles de 8 lettres : 208 827 064 576 possibilités. Sachant qu'il tu faudra environ 1000 cycles CPU (très optimiste) pour la fonction de cryptage : 208 827 064 576 000 cycles. Avec un CPU qui fait 10 milliards d'instructions par seconde (énorme) ça fait : 20883 secondes soit près de 6 heures ! Et avec les majuscules, minuscules et chiffres : 12 heures. A la limite si on le veut vraiment .... Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 26 décembre 2005 Partager Posté(e) le 26 décembre 2005 un cpu à l'heure actuelle fait plutôt 3GHz donc si ton premier calcul est bon ça tend plus vers 20h avec les majuscules : 53 459 728 531 456 possibilités soit 250 fois plus (à peu près) que seulement les minuscules. donc 250 fois plus de temps ? genre 200 jours, à peu près... faut rajouter les chiffres et les caractères autres que les lettres, où on va s'en tenir à ça ? donc non, les logiciel de décryptage ne font pas bêtement un test de toutes les combinaisons dans l'ordre alphabetique Lien vers le commentaire Partager sur d’autres sites More sharing options...
CyberShadow Posté(e) le 26 décembre 2005 Auteur Partager Posté(e) le 26 décembre 2005 justement, pour reduire le champ d'action, l'espace de travail est limité seulement a une suite alphabetique de 8 caracteres. de a à z en minuscules et c tout, rien d'autre... C juste un petit prog, pas un truc serieux de hackeur pro... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Captain Hadock Posté(e) le 26 décembre 2005 Partager Posté(e) le 26 décembre 2005 Je sais pas si tu as déja fait ce genre de truc, mais parfois on utilise une variable numérique par digit pour afficher un nombre. (Comme pour les bases) Donc par exemple 123, on l'écrit avec une variable unité qui vaut 3, une variable dizaine qui vaut 2 et une variable centaine qui vaut 1. Lorsque l'on veut incrémenter ce genre de structure, il faut incrémenter les unités, puis si les unités sortent de la base, les remettre à 0 et incrémenter les dizaines.... Si l'on considère chaque lettre de ton pass comme un char, tu peux très bien utiliser le même system. Cela donnerai quelque chose du genre : (On note les char de droite à gauche donc si C1=A et C2=B, ta chaine vaut BA) C1++; if(C1>'z') { C1='a'; C2++; } if(C2>'z') { C2='a'; C3++; } Et ainsi de suite en créan autant de char que tu le veux. Ensuite en utilisant les pointeurs sur une chaine de charactères, tu peux la reconstituer : char *pass; /*Déclaration*/ pass = new char[9]; /*Ton pass semble être sur 8 chars*/ *(pass+8) = '\0'; /*On n'oublie pas de fermer la chaîne*/ *(pass+7) = C1; /*Dernier charactère de la chaîne*/ *(pass+6) = C2; /*Avant dernier charactère de la chaîne*/ *(pass+5) = C3; /*avant avant dernier charactère de la chaîne ... *pass = C8; /*Permier charactère de la chaîne*/ Tout cela peut être bien entendu optimisé en utilisant déja la chaîne avec un pointeur au lieu d'utiliser des variables préalables, mais comme je ne sais pas si tu utilise les pointeurs et cela permettai de mieux expliquer l'exemple. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 27 décembre 2005 Partager Posté(e) le 27 décembre 2005 Avec les lettres (capitales ou non) et les chiffres (il ne faut pas les oublier non plus), ça fait 252 ans et huit mois pour un mot de passe. On ne parle pas des caractères bizarroides Non franchement ne pas utiliser johntheripper, comme l'a suggéré loinc, c'est du masochisme... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Captain Hadock Posté(e) le 28 décembre 2005 Partager Posté(e) le 28 décembre 2005 Oui mais il veux pas avoir un algo performant, il veut un algo qu'il à fait lui même pour s'amuser. Lien vers le commentaire Partager sur d’autres sites More sharing options...
CyberShadow Posté(e) le 28 décembre 2005 Auteur Partager Posté(e) le 28 décembre 2005 Merci pour vos contributions, je ne cherche pas la performance a tout prix, bien que cela serait utile... Je voulais juste faire un prog par moi-même pour mesurer les enjeux de la sécurité, en essayant de casser 20 MdP données au hasard. C'est moins marrant si c deja fait... Je connais John The Ripper et je vais ptet l'essayer a la fin paske ca fait deja 3 jours non stop que mon prog tourne et je n'est toujours pas trouver un MdP récalcitrant... Allé, sans tricher (JohnTheRipper) trouvez-moi qqs MdP suivant, ils sont encrypté avec la fonction crypt de linux qui prends donc en arguments cette fameuse chaine de car de 8 letres minuscules et un "salt". C'est une perturbation en plus. Pour compiler en C ne pas oublier de faire "gcc -Wall -lcrypt -o prg source.c". qfMN5x.TIOU/6 lk7OwxL1scKQ2 lgm6WXaZ0PWOM fsVOleq0NIj.k POur les plus forts, faire la même chose mais avec l'algo de cryptage en MD5 La ya du boulo... Ca rigolera moins hein? Lien vers le commentaire Partager sur d’autres sites More sharing options...
RaphAstronome Posté(e) le 1 janvier 2006 Partager Posté(e) le 1 janvier 2006 N'oublie pas de faire 2 thread pour prendre avantage du dual-core. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.