Aller au contenu

Petit défit en C ;)


CyberShadow

Messages recommandés

Hello à tous :pleure:

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... :francais:

Merci pour vos explications... :keskidit:

Lien vers le commentaire
Partager sur d’autres sites

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) :keskidit:

Lien vers le commentaire
Partager sur d’autres sites

wouah :keskidit: 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

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;
}

:keskidit:

Lien vers le commentaire
Partager sur d’autres sites

:keskidit: 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... :pleure:

Lien vers le commentaire
Partager sur d’autres sites

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 :keskidit:

en plus de la petite semaine d'attente :pleure:

:francais:

Lien vers le commentaire
Partager sur d’autres sites

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

un cpu à l'heure actuelle fait plutôt 3GHz donc si ton premier calcul est bon ça tend plus vers 20h :roll:

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 :smack:

Lien vers le commentaire
Partager sur d’autres sites

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

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... :byebye:

:chinois: 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 :D La ya du boulo...

Ca rigolera moins hein? :chinois:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...