IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Force brute teste de strings


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Par défaut Force brute teste de strings
    Bonjour,

    Je suis actuellement sur un projet qui consiste a forcer un md5. Cela étant je ne connais pas le nombre de caractère. Je dois donc retrouvé la chaine initial qui a permis de créer le md5. Je teste donc toutes les chaines de caractères de 1 a N. Cependant mon code n'est vraiment pas optimisé puisque je fais N boucle for qui me permettent donc de tester pour toutes les chaines de caractères de N boucle de longueur. Mais le projet spécifie que nous devons pouvoir choisir la longueur max que l'on va chercher.
    Je vous demande donc comment je peux faire pour changé mon code et avoir une longueur variable. Voici un bout de code qui vous permettra de mieux comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    for(unsigned int j=0;j<tabLettre.size();j++)
    			{
     
    				Mot2=Mot1+tabLettre[j];
    				if (h1(Mot2)==h1(CODE))
    				{
    					cout<<"hashage: "<<h1(Mot2)<<endl;
    					return(0);
    				}
    				for(unsigned int k=0;k<tabLettre.size();k++)
    				{
    					Mot3=Mot2+tabLettre[k];
     
    					if (h1(Mot3)==h1(CODE))
    					{
    						cout<<"hashage: "<<h1(Mot3)<<endl;
    						return(0);
    					}
     
    					for(unsigned int l=0;l<tabLettre.size();l++)
    					{
    						Mot4=Mot3+tabLettre[l];
    						if (h1(Mot4)==h1(CODE))
    						{
    							cout<<"hashage: "<<h1(Mot4)<<endl;
    							return(0);
     
    						}
    						for(unsigned int m=0;m<tabLettre.size();m++)
    						{
    							Mot5=Mot4+tabLettre[m];
    							if (h1(Mot5)==h1(CODE))
    							{
    								cout<<"hashage: "<<h1(Mot5)<<endl;
    								return(0);
    							}
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par cimestro Voir le message
    Bonjour,

    Je suis actuellement sur un projet qui consiste a forcer un md5.
    Attention!!! Ce projet pourrait te placer très en porte à faux avec les lois sur le piratage informatique
    Cela étant je ne connais pas le nombre de caractère.
    Tu n'en a -- a priori -- pas besoin, parce que MD5 agit comme une "somme de contrôle" : la même chaine de caractères fournira toujours la même somme, et deux chaines de caractères dans lesquelles un seul caractère est différents fourniront des sommes suffisamment différentes pour que l'on ne puisse pas douter du fait qu'elles sont différentes.

    Par contre, "en cherchant bien", on peut "assez facilement" trouver plusieurs chaines (chacune étant composées d'un nombre de caractères potentiellement différents) qui produiront la même somme (c'est ce que l'on appelle les "collisions"). Si tu trouvent deux chaines de caractères produisant la même somme de contrôle, elles seront considérées comme identiques, et ce, même si l'une des chaines de caractères n'est composée que de 10 caractères alors que l'autre en contient 1000.

    Je dois donc retrouvé la chaine initial qui a permis de créer le md5.
    C'est malheureusement impossible, car, MD5 est un algorithme que l'on pourrait qualifier de "destructif": il n'y a aucun moyen de retrouver le contenu qui a permis de générer la somme de contrôle.

    Cependant mon code n'est vraiment pas optimisé
    Ce qui est normal pour de la "force brute"... à défaut de connaitre la chaine de caractères d'origines

    Mais le projet spécifie que nous devons pouvoir choisir la longueur max que l'on va chercher.
    Ben, précises la, et arrête toi quand tu atteint la taille indiquée

    Ceci dit, plus tu acceptera que la chaine de caractères soit longue, plus tu auras de chance de tomber sur une chaine créant une collision : avec une chaine de maximum 10 caractères, les chances restent particulièrement minces (à moins, bien sur, que la chaine d'origine n'ait contenu elle-même moins de dix caractères )
    Je vous demande donc comment je peux faire pour changé mon code et avoir une longueur variable.
    Ben, a priori, tu devrais commencer par une boucle qui s'occupe de traiter les mots de 1 à maxLettres (cette deuxième valeur étant introduite par l'utilisateur, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(size_t tailleMot = 1; tailleMot < maxLettre; ++i){
        /* ici dedans, il faut tester toutes les permutations possibles pour les mots de tailleMot lettres */
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre actif
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Par défaut
    La taille de la chaîne initial me permettra de pouvoir tester la rapidité entre mon programme et un autre programme. la est l’intérêt de mon projet. Une programme séquentiel contre un programme avec des threads.

    les taille de ma chaîne ne sera pas grande ( -10 caractères) lorsque je trouverais une chaîne qui correspond a mon md5 se sera forcement la chaîne initial non?

    Je comprends bien ce que tu veux faire dans la boucle mais je ne vois pas comment faire. C'est d'ailleurs a ce niveau la que je bloque. Je n'arrive pas a reproduire ce que j'ai fais avec des boucle for imbriqué en une seul boucle for.

    Merci

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par cimestro Voir le message
    La taille de la chaîne initial me permettra de pouvoir tester la rapidité entre mon programme et un autre programme. la est l’intérêt de mon projet.
    Oh, à ce moment là, on entre en phase de démonstration, et les dés sont "pipés" : tu introduit une chaine de caractères quelconque, mais tu sais exactement ce que tu as introduit

    Partant de là, tu connais forcément la taille de la chaine de caractères d'origine, et tu peux donc travailler sur des chaines de caractères de la taille en question

    les taille de ma chaîne ne sera pas grande ( -10 caractères) lorsque je trouverais une chaîne qui correspond a mon md5 se sera forcement la chaîne initial non?
    En toute honnêteté, je ne pourrais même pas forcément te le garantir, ayant quelque peu oublié le mode de fonctionnement de l'algorithme md5.

    Mais, il faut te dire que, même si tu limites tes chaines de caractères aux 26 lettres (majuscules et minuscules mélangées) de l'alphabet, chaque caractère de la chaine de caractères peut prendre 52 valeurs différentes, et que, pour une taille donnée, tu te trouve donc confronté à 52nombre de caractères chaines de caractères différentes.

    Valeur à partir de laquelle il faut encore compter avec le paradoxe des anniversaires
    Je comprends bien ce que tu veux faire dans la boucle mais je ne vois pas comment faire. C'est d'ailleurs a ce niveau la que je bloque. Je n'arrive pas a reproduire ce que j'ai fais avec des boucle for imbriqué en une seul boucle for.
    Ben, en fait, c'est "relativement simple" : tu utilises cette boucle pour créer une chaine de caractères avec tous des 'a', ce qui te donne:
    • au premier passage, la chaine "a"
    • au deuxième passage, la chaine "aa"
    • ...
    • au dixième passage, la chaine "aaaaaaaaaa"


    A partir de là, tu utilise ta chaine de caractères un peu comme un compteur kilométrique de voiture : tu fais systématiquement varier le dernier caractère de la chaine, le faisant passer à b, puis à c, ... puis à zQuand le dernier caractère vaut z tu le fait passer à A, et tu continue à le faire passer par les autres lettres de l'alphabet (en majuscules, cette fois)
    Lorsqu'il atteint la dernière valeur possible (Z si tu as bien suivi), tu travaille exactement de la même manière que lorsque tu passe de 9 à 10 : je passe à 0, je retiens 1, sauf que, en l'occurrence, tu repasse à a et que tu ajoute 1 à l'avant dernier, qui suivra exactement le même raisonnement avec l'anté-penultième caractère, qui suivra le même raisonnement avec celui qui le précède, et ce, jusqu'à ce que ta chaine de caractères ne soit composée que de Z .

    Si tu obtiens la même somme de contrôle à un moment donné, c'est que tu as gagné : tu as au minimum trouvé une collision possible qui fera l'affaire. Si tu en arrives à un point où la chaine de caractères n'est composée que de Z sans avoir retrouvé la bonne somme de contrôle, tu a perdu

    Je vais te laisser réfléchir à la logique à mettre en oeuvre pour utiliser ta chaine de caractères comme un compteur, mais le raisonnement est là
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre actif
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Par défaut
    Merci de ta réponse encore une fois .

    J'ai finalement fais une séance intensive sur mon code. Je suis parti sur ce que tu m'a dis et j'ai finalement réussi. J'ai donc fais une boucle for qui correspond a la taille de ma chaine. Dans celle-ci j'y est mis un while qui parcours tous mes char de teste et qui grâce a de nombreux compteur ( for(int i=0; i<TailleMot; i++)) qui me permette de faire une sorte de compteur kilométrique comme tu m'a dis.

    Merci beaucoup. Plus qu'a threader tous ça et le tour et joué.

    Sujet résolu

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Si tu me montre ton code, je te montre le mien, car je me suis amusé, juste après mon intervention précédente, à voir comment je mettrais cette logique en place (sans toutefois calculer la somme md5 des différentes chaines de caractères)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/06/2008, 12h12
  2. Test Egalite string (super basique)
    Par ced600 dans le forum VBScript
    Réponses: 1
    Dernier message: 07/12/2007, 15h59
  3. Réponses: 2
    Dernier message: 14/06/2007, 11h59
  4. tests sur String
    Par frouge dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 07/06/2006, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo