J'ai corrigé l'erreur s’étais assez simple... vue que la version1 + .net étais correct a cause de la function InStrRegex() qui renvoi la valeur -1 si variable a pas donné. Donc, j’ai ajouté "If separ(verif% + 1) "" Then separ(verif% + 1) -1" pouvais pas mettre la valeur a 0 vu que la function suivante fait + 1... j’aurais sauté le 0 dans la liste de caractère. J’espère que tu m’en voudrai pas trop que ajouté ta source dans le zip avec ton nom.
Oulà, l'heure tardive peut-être (enfin, quoique je ne sache pas quelle heure qu'il est au Canada), mais ton français en a pris un coup... Enfin, dans les grandes lignes on comprend encore... Pour l'aide concernant ton programme, désolé, mais je n'ai pas trop de temps pour me pencher dessus, je prépare une petite source également pour CS qui n'était pas tout à fait prévue, enfin bref, c'est une autre histoire... Alors peut-être plus tard. Mais pour l'instant, je pense que tu devrais toi-même chercher la solution. IL y a le forum d'aide aussi, et si tu isoles bien ton problème, et l'expliques correctement (expliquer correctement les choses permet aussi de s'éclaircir les idées et souvent les résoudre) il y a de bonnes chances de trouver l'aide qu'il te faut...
merci pour l'explication... j'ai bien vue que c'est moi qui a faite une erreur et j'aimerais que tu m'aide a réparé l'erreur de ma version 1 en vb6. Un peu de difficulté a repèrer l'erreur vue sa fait un petit boute que j'ai faite sette source. Apres pence bien passé a un autre projet :P... peu pas laissé sa dememe avec des erreurs plus fort que moi XD. Ça ma apris beaucoup de chose avoir partagé mes sources, ma continue dans voie la.
For t = 1 To CInt(TextBox1.Text)
AllKey("", t) 'toutes les combinaisons avec 3 lettres
Next t
Donc si tu choisis 3 caractères, on passe en revue toutes les combinaisons avec 1 caractère, puis 2 caractères, puis 3 caractères...
soit : 62 + 62*62 + 62*62*62 62 + 3844 + 238328 242234 combinaisons au total...
Si tu veux seulement 3 caractères, modifies les lignes ci-dessus en :
AllKey("",CInt(TextBox1.Text) )
Idem avec 2... 3844 + 62 = 3906...
Ne t'inquiètes pas l'algorithme est parfaitement juste !
salut us_30
J'ai bien aimez tes sources plus simples que les miennes... faite une petite analyze et ya une petite erreur a changer! Si on calcul 62 caractère a la puissance 2 sa donne 3844 et puissance 3 sa donne 238328. Mettre une variable de calcul dans ta boucle qui nous donne 3906 a puissance 2 et 242234 a puissance 3... sa veux dire que la boucle fait quelque tour de trop. Pour sa que j'ai ajoutez la function If separ(Verif + 1) "" Then separ(Verif + 1) 0 dans mon autre version pour corrigé cette erreur.
au plaisir tu repondre... et encore merci pour tes source XD
Bou... Ben, tu fais en sorte que cela ne bug pas, mais tu réinventes les fonctions VB6... En réalité le plus grave selon moi, c'est le mélange des Strings avec les valeurs... (et pis un peu les fausses fonctions VB6)
Les déclarations donnent en bon uniforme :
Charr = CInt(TextBox1.Text)
Dim separ(Charr) As String
Ensuite, les codes comme ça :If separ(Verif + 1) "" Then separ(Verif + 1) 0
c'est vraiment à ne pas faire... Separ est un texte... Donc ="0"
En générant les résultats, on observe aussi que certaines combinaisons se répète... Dû à cette ligne :
If separ(Verif) = "[" Then separ(Verif) 0
Ensuite en terme l'algorithmique, ben, je renonce à tout démêler... C'est pas un code enchevêtré et en utilisant des comparaisons avec des strings qu'on obtient quelque chose de performant...
De plus, ne rêve pas, l'algo de force brute n'a jamais efficace au-delà de 3 ou 4 caractères. Cela tient au nombre de combinaison exponentielle...
=
Si tu veux un bon algo de force brute je te conseil de voir mon modeste site : http://fordom.free.fr Tu pourras adapter quelque chose qui tient la route et en seulement qlq lignes...
Amicalement,
Us.
PS : Bon, aller, une fois n'est pas coutume : Voici le code VBA (donc VB6 comme tu aimes tant) :
Sub AllKey(Pass As String, ByVal Lg As Long)
Dim i As Integer
If Len(Pass) < Lg Then
For i = 1 To Len(dico): AllKey Pass & Mid$(dico, i, 1), Lg: Next i
Else
TextBox = chaine
End If
End Sub
=> Avec un bon algo, pas bien difficile de faire la traduction en VB.NET, hein ?... voici en VB.NET :
Const dico As String = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
Private Sub AllKey(ByVal Pass As String, ByVal Lg As Integer)
Dim i As Integer
If Pass.Length < Lg Then
For i = 0 To dico.Length - 1
AllKey(Pass & dico.Substring(i, 1), Lg)
Next i
Else
'TextBox2.Text = Pass
'Application.DoEvents()
End If
End Sub
=
Maintenant pour mesurer le temps, voici le code (voir snippet) :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Parametres
Dim Stopwatch As System.Diagnostics.Stopwatch
Stopwatch = New Stopwatch
' Initialisation : debut de la mesure
Stopwatch.Start()
'Algo recherche
Dim t As Integer
For t = 1 To CInt(TextBox1.Text)
AllKey("", t) 'toutes les combinaisons avec 3 lettres
Next t
' fin de la mesure
Stopwatch.Stop()
' Affichage de la mesure
MessageBox.Show(Stopwatch.Elapsed().TotalSeconds & " secondes")
'MessageBox.Show(Stopwatch.Elapsed().TotalMilliseconds & " millisecondes")
End Sub
=========
En désactivant dans ton algo l'affichage et DoEvent... on obtient (en mode DEBUG) :
Pour 2 Caractères : 0,03 s
Pour 3 Caractères : 1,94 s
Avec ma proposition :
Pour 2 Caractères : 0,006 s
Pour 3 Caractères : 0,029 s
==> Faites vos jeux !
Mais n'espère jamais réussir à casser quoique ce soit avec... La parade est simple, il suffit de mettre un temps d'attente d'une demi-seconde pour la vérification d'un code dans un prog pour te revoir dans 90 ans...
bonjour us_30
J'ai faite la première parti de changer les fonctions pour qui functionne sans Microsoft.VisualBasic et j'aimerais que tu regarde la v1+ .net pour me dire ce qui serai amilioré. Me reste encore a mieu déclarées mes variables :P.
Combien la vitesse peu changer avec toute les amiliorations?
merci tes conseils.
- MPi, je pense que eckostreet a parfaitement raison de recentrer la discussion sur sa source. J'ai vu bien des posts sur le forum de VBF qui étaient tellement incompréhensibles... Si bien qu'à côté, eckostreet passe pour un vrai professeur de lettre... et pis, son français n'est pas si mal... et c'est pas moi qui va dire le contraire, puisse que j'en fais plein... On tape souvent moins vite qu'on pense, et on reprend des tournures en oubliant d'un supprimer une partie, etc... c'est parfois pire après qu'avant... -:);
- eckostreet, sur ta source en VB.NET. Le code a surtout une structure de VB6. Tu utilises à l'option de compatibilité de VB.NET à VB6. Et en termes de performance, si tu emplois que les fonctions natives du VB.NET, tu obtiendras une rapidité sans comparaison. Vas dans "My Project">Références et décoche "Microsoft.VisualBasic"... Retournes ensuite sur le code, et tu verras quelques instructions surlignées qui sont à reprendre avec leurs équivalents en pure .NET. (Notamment : Mid, Len, Insrt, ...) et les variables non déclarées (Strings)...
- Autres améliorations ensuite, c'est de mettre dans My Project>Compiler> les 3 options (Explicit, Strict, Infer) à ON...
Corriges le tout, et ton code gagnera en rapidité comme jamais... C'est un très bon apprentissage sur ce code court, je pense... D'autant qu'il regroupe un concentré de tout ce que l'on fait quand on passe de VB6 en VB.NET :);
Voilà déjà du pain sur la planche...
Ensuite, si on raisonne en terme de performance, l'algo de Force Brute n'est ni plus ni moins que la même chose que compter... Par exemple, si tu n'avais que 10 caractères dans ta liste "BFCaractere" (par exemple : 0,1,2,3,.etc.,9) avec une combinaison de 3... Pour réaliser l'algo tu coderais comment ? En cherchant dans une String comme tu proposes... Perso, je compterais de 1000 à 1999 ! auquel je garderais que les 3 derniers chiffres. A cause de la représentation du zéro, je prend 4 chiffres. En effet, obtenir "000" est simplifier à "0" avec des nombres ce qui est gênant dans notre cas. Ensuite pour une liste "BFCaractere" plus grande, il suffit de généraliser en compter dans une base plus grande (au lieu de la base 10)... Cette remarque mène normalement sur un algo plus "mathématique", or un PC calcul plus vite qu'il ne traite des chaines de caractère... donc gain de temps assuré.
Allez, bon prog... au plaisir de te revoir sur VBF,
Salut
C'est vrai... j'ai beaucoup de dificulté avec mon français pas juste parce que chu un québécois. On partira pas un débat sur mon français plûtot sur mes sources dépossé. merci :P
Être Québécois n'est aucunement une raison...
J'en suis un et je peux écrire correctement.
Si tu es anglophone ou autre allophone, alors là je pense que ça peut être différent.
"qui pourrai m'aidez a l'amilioré ou faire moin loure. Merci d'avence" --> euh vous pourriez commencer par "amilioré" votre français non ? Sinon comme Renfield, je ne vois pas l'intérêt de cette version simplifiée, la version de base marchant très bien.
Bravo quand même pour le travail.
19 févr. 2011 à 15:29
Une ptit question utilisé plusieurs thread est utile pour ce genre de brute force ou pas ?
19 juil. 2010 à 19:29
Mon nom cela me flatte, mais surtout mon site... -:);
Amicalement,
Us.
19 juil. 2010 à 00:50
J'ai corrigé l'erreur s’étais assez simple... vue que la version1 + .net étais correct a cause de la function InStrRegex() qui renvoi la valeur -1 si variable a pas donné. Donc, j’ai ajouté "If separ(verif% + 1) "" Then separ(verif% + 1) -1" pouvais pas mettre la valeur a 0 vu que la function suivante fait + 1... j’aurais sauté le 0 dans la liste de caractère. J’espère que tu m’en voudrai pas trop que ajouté ta source dans le zip avec ton nom.
Au plaisir tu suive pour mes prochains projets.
16 juil. 2010 à 01:43
Amicalement,
Us.
16 juil. 2010 à 01:14
merci pour l'explication... j'ai bien vue que c'est moi qui a faite une erreur et j'aimerais que tu m'aide a réparé l'erreur de ma version 1 en vb6. Un peu de difficulté a repèrer l'erreur vue sa fait un petit boute que j'ai faite sette source. Apres pence bien passé a un autre projet :P... peu pas laissé sa dememe avec des erreurs plus fort que moi XD. Ça ma apris beaucoup de chose avoir partagé mes sources, ma continue dans voie la.