Seite 2 von 2

Verfasst: 04.06.2006 19:43
von sen-me
Jo, der benutzt kein Wörterbuch, der baut auch seine Wörter so...
Allerdings war das Prog auch ein MD5 Hash Cracker ^^

Das heist das Programm (man gibt ein MD5 Hash an) durchgeht jeden Buchstaben für Buchstaben bis der Hash übereinstimmt und gibt den String zurück...

Und das macht er ziemlich schnell, keine Ahnung wie das Prog das macht

Aba egal, ich will ja kein MD5 Hash Cracker baun sondern sowas wien Wörterbuch, also muss ich wohl die Geschwindichkeit hinnehmen ^^

Verfasst: 04.06.2006 19:47
von ullmann
Vielleicht werden in solchen Programmen fertige Silben in Tabellen eingelesen und wenn Wörter zu erzeugen sind, werden dann ganz fix einige Silben kombiniert, z.B. für Länge=4: Silbe "a" (Länge 1) mit Silbe "lex" (Länge 3).

Rainer

Verfasst: 04.06.2006 19:47
von Kiffi
> sondern sowas wien Wörterbuch, also muss ich wohl die Geschwindichkeit
> hinnehmen ^^

und wer legt fest, welches Wort in dieser generierten Buchstabensuppe
sinnvoll ist und welches nicht? Ein Wörterbuch sollte ja nur Einträge enthalten,
die es im 'normalen' Leben wirklich gibt.

Grüße ... Kiffi

Verfasst: 04.06.2006 19:53
von ullmann
Sorry, Problemstellung "sinnvoll" hatte ich überlesen, dann gehts natürlich nicht mit Silbenkombination.
Rainer

Verfasst: 04.06.2006 19:55
von Ja!
Hmm, das hat mich jetzt interessiert.
Bei mir braucht folgendes Programm genau 313ms bis es "alex" hat!

Code: Alles auswählen

DisableDebugger
string.s
size=4  

Dim z.l(size)

;ASCII 97 bis 122 ist "a" bis "z"
For i = 1 To size : z(i)=97 : Next ;Alle mit "a" initialisieren
startzeit=ElapsedMilliseconds()
For i = 1 To Int(Pow(26, size));So Viele Kombinat. insges. möglich
  For a = 1 To size
    If z(a) = 123 : z(a) = 97 : z(a+1)+1 : EndIf
  Next

string="": For b = 1 To size : string+Chr(z(b)): Next

If string = "alex" 

 stopzeit=ElapsedMilliseconds()
 MessageRequester("",string+Chr(13)+"Zeit: "+Str(stopzeit-startzeit)+"ms")
 End
EndIf

z(1)+1
Next




Verfasst: 04.06.2006 19:58
von Kaeru Gaman
also, ich hab mal was ausprobiert:

Code: Alles auswählen

Dim a(50)

For n=0 To 50 : a(n) = 97 : Next

in$ = InputRequester("Worder", "Länge eingeben", "3")
Len = Val(in$)


def$ = Space(Len)

Len -1

CreateFile(0, "output.txt")
timer1 = ElapsedMilliseconds()
Repeat
    w$ = def$
    For z=0 To Len : PokeB(@w$+z, a(z)):Next
    WriteStringN(w$)
    dig = 0
    go = 1
    Repeat
        a(dig)+1
        If a(dig) > 122
          a(dig) = 97
          dig +1
        Else
          go = 0
        EndIf
    Until go = 0
Until dig > Len

timer = ElapsedMilliseconds() -timer1

MessageRequester("Worder", "Laufzeit:"+Chr(13)+Chr(10)+"Zeichen:"+Str(Len+1)+Chr(13)+Chr(10)+"Dauer:"+Str(timer) )

CloseFile(0)
also, der braucht für 5 zeichen 33.5 sekunden, weil er ne datei schreibt und keinen debugger nimmt.

für 4 zeichen braucht er 1.2 sec, also weniger als die 5.5 für "alex", wie auch immer du das meintest...

funktionieren tut das folgendermaßen:
die buchstaben werden wie stellen einer zahl zur basis 26 behandelt
wenn die niedrigste stelle übers z geht, wird sie wieder auf a gesetzt und die nächste ein höher, usw.

das könnte man in ASM noch dahingehend optimieren, dass man direkt im stringspeicher zählt.
(das was ich hier jetzt im array mache)

aber hunderttausende von permutationen brauchen nun mal ihre zeit.
also, damit alle 13stelligen wörten hinschreiben, dann koch dir ma nen kaffe....

Verfasst: 04.06.2006 20:24
von Ja!
Jetzt ist es noch etwas schneller (und schöner),

203-219ms bis "alex" gefunden.
(Geht bestimmt noch schneller...)

Code: Alles auswählen

DisableDebugger

string.s
size  = 4
kombi = Int(Pow(26, size))

Dim z.l(size)
For i = 1 To size : z(i)=97 : Next


startzeit=ElapsedMilliseconds()
For i = 1 To kombi

  string=""
  
  For a = 1 To size
    If z(a) = 123 : z(a) = 97 : z(a+1)+1 : EndIf
    string+Chr(z(a))
  Next
 
  z(1)+1

  If string = "alex" 
    stopzeit=ElapsedMilliseconds()
    MessageRequester("",string+Chr(13)+"Zeit: "+Str(stopzeit-startzeit)+"ms")
    End
   EndIf

Next


Verfasst: 04.06.2006 21:06
von HeX0R
Ja! hat geschrieben:Jetzt ist es noch etwas schneller (und schöner),

203-219ms bis "alex" gefunden.
(Geht bestimmt noch schneller...)
Jo, 16ms und flexibler:

Code: Alles auswählen

#Size        = 4
#SearchFor   = "alex"
#StartSearch = 'a'
#EndSearch   = 'z'

Dim L.b(#Size)
For i = 0 To #Size
	L(i) = #StartSearch
Next i
S = #Size - 1

Startzeit = ElapsedMilliseconds()
Found     = #True

Repeat
	If PeekS(@L(0), #Size) = #SearchFor
		Break
	EndIf
	For j = 0 To S
		L(j) + 1
		If L(j) <> #EndSearch
			Break
		Else
			L(j) = #StartSearch
			If j = S
				Found = #False
				Break 2
			EndIf
		EndIf
	Next j
ForEver

Stopzeit = ElapsedMilliseconds()
If Found
	MessageRequester("", #SearchFor + #LF$ + "Zeit: " + Str(stopzeit - startzeit) + "ms")
Else
	MessageRequester("Error", #SearchFor + " not found!")
EndIf

Verfasst: 04.06.2006 21:39
von sen-me
Lol langsam blick ich nimmer durch, sagt bescheid wenn ihr bei asemmbler angekommen seit ^^

Achja, bei mir dauerts 31ms ^^

ihr müsst aba bedneken das das crack tool auch noch den md5 gesucht hat, das wird wohl etwas bremsen, deswegen kann ich mir nich vorstellen, das dies die shcnellste lösung war ^^

Verfasst: 04.06.2006 21:52
von Ja!
@HeXOR

Vorhin wollte ich extra noch dazuschreiben, daß da so ein PEEK-Freak
ran muss, um das richtig schnell zu machen :D