Il est 4h et j'attends la fin de l'exécution d'un programme que j'aimerai bien pouvoir fermer et relancer là où il en est quand je rallumerai ma machine. Le programme tourne depuis déjà 3h32, je pense qu'il va continuer pendant mon sommeil.
Comme cette situation a commencé à m'ennuyer rapidement j'ai décidé en parralèle d'installer PB et de coder quelque chose qui pourrait être interrompu puis repris plus tard. Et j'ai choisi pour ça le thème de la force brutte, qui implique souvent des temps d'exécution énormes (par exemple de l'ordre de la semaine).
J'ai donc fait une fonction qui cherche toutes les combinaisons possibles selon quelques règles. Il faut spécifier la taille de la clé et les caractères susceptibles d'appartenir à la clé. Enfin on peut partir d'une clé (complète ou partielle) sans que ça ne pose de problème à la fonction (justement c'est le but). Même s'il faut spécifier une taille, la fonction est tout à fait adaptée à la recherche de clé de taille variable.
La fonction n'est pas optimisée et ne vérifie pas les erreurs possibles. D'ailleurs il vaut mieux vérifier les éventuelles erreurs avant de lancer le traitement qui lui n'est pas censé mener à une erreur.
Code : Tout sélectionner
Procedure.s BruteForceNext(Key.s, Size.l, Charset.s)
Protected Partial.l, Pos.l
If Len(Key) < Size
Partial = #True
ElseIf Len(Key) > Size Or Len(Charset) <= 1
Key = #NULL$
EndIf
; If Key And Not Partial
; While Right(Key, 1) = Right(Charset, 1)
; Key = Left(Key, Len(Key)-1)
; Wend
; EndIf
If Key And Not Partial
rKey.s = Right(Key, 1)
rSet.s = Right(Charset, 1)
While rKey = rSet
Key = Left(Key, Len(Key)-1)
rKey.s = Right(Key, 1)
Wend
EndIf
If Key And Not Partial
Pos = FindString(Charset, Right(Key, 1), 1) + 1
Key = Left(Key, Len(Key)-1) + Mid(Charset, Pos, 1)
EndIf
If Key Or Partial
While Len(Key) < Size
Key + Left(Charset, 1)
Wend
EndIf
ProcedureReturn Key
EndProcedure
Un premier exemple d'utilisation :
Une recherche pure et simple de toutes les combinaisons
Code : Tout sélectionner
Key.s = ""
Repeat
Key = BruteForceNext(Key, 3, "abc")
Debug Key
Until Not Key
Une recherche qui se stoppe après les dix premiers et qui reprend ensuite
Code : Tout sélectionner
Key.s = ""
Cpt.l = 0
Repeat
Key = BruteForceNext(Key, 3, "abc")
Cpt + 1
Debug Key
Until Cpt = 10
Debug "---"
Repeat
Key = BruteForceNext(Key, 3, "abc")
Debug Key
Until Not Key
Code : Tout sélectionner
;amusez vous à changer les constantes pour trouver les deux clés
#min = 2
#max = 5
#charset$ = "abc"
;Une clé entre #min et #max caractères
MD5.s = "406DDA4551329127687A3534E3DE7882" ;clé trouvable
;MD5.s = "7A2CCCE9642FE8539673002DD6660BA2" ;clé introuvable
;MD5.s = "3F469E9EED880B7436CFF29A3C11325B" ;clé introuvable
;Algo de recherche
For i = #min To #max
Key.s = ""
Repeat
Key = BruteForceNext(Key, i, #charset$)
If UCase( MD5Fingerprint(@Key, i) ) = MD5
Break 2
EndIf
Until Not Key
Next i
If Key
Debug "La clé été trouvée : " + Key
Else
Debug "La clé n'a pas été trouvée"
EndIf
le md5 est en majuscule sous linux et en minuscule sous windows, j'ai modifié la source pour le prendre en compte.
le bloc commenté ne bug pas sous windows, quelqu'un a la dernière beta sous linux pour vérifier si ca fonctionne ?
Dri
