Thema: Delphi Zahlencode bruten

Einzelnen Beitrag anzeigen

Benutzerbild von everdream
everdream

Registriert seit: 22. Feb 2007
Ort: Hiddenhausen
192 Beiträge
 
Delphi 2005 Personal
 
#15

Re: Zahlencode bruten

  Alt 15. Apr 2008, 23:52
Wenn du nur eine mögliche Lösung brauchst, dann würde ich dir vielleicht (rekursives) Backtracking ans Herz legen. Das ganze kombiniert mit der Ganzzahldivision div (weil du mehr ja hier nicht benötigst) sollte dir in akzeptabler Zeit eine Lösung liefern.

edit: Habe zu viel Zeit und dir darum mal den Code dafür geschrieben:

Delphi-Quellcode:
function rekBacktracking(Hash: Int64; Laenge{in Zeichen}: byte): shortstring;
var
  i: byte;
begin
  if (Laenge = 1) then
  begin // Beim letzten Zeichen der Reihe
    for i:=97 to 122 do
      if i=Hash then
        Result:= Char(i);
  end else
  begin // Bei den Zeichen 1 bis Laenge-1
    for i:=97 to 122 do
    begin
      if (Hash mod i = 0) then
        Result:=Char(i) + rekBacktracking(Hash div i, Laenge-1);
    end;
  end;
end;
Beachte, dass nur die erste erfolgreiche Zeichenkette ausgegeben wird und dass die Zeichen mit dem größten ASCII-Wert dabei immer vorne stehen.

Wenn du die Abbruchbedingung etwas änderst, kannst du auch z.B. alle Lösungen nacheinander in ein Textfile oder Memo schreiben lassen, dann hast du nach ein bischen Rechenzeit vielleicht alle. Das ganze sollte jedenfalls schneller sein als deine For-to-Schleifen, weil nicht alle Kombinationen zuende gerechnet werden.

edit2: 9 Zeichen sind innerhalb eines Augenschlages berechnet. Auch 10 Zeichen sind in relativ kurzer Zeit entschlüsselt, allerdings reicht in diesem Bereich der Typ Int64 auch schon nicht mehr aus.

edit3: Habe das ganze aus Spaß auch nochmal für alle möglichen Lösungen geschrieben:
Delphi-Quellcode:
procedure TForm2.rekBacktracking(Text: string; Hash: extended; Laenge: byte);
var
  i: byte;
begin
  if (Laenge = 1) then
  begin
    for i:=97 to 122 do
    begin
      if i=Hash then
      begin
        Memo.Lines.Add(Text + Char(i));
        Inc(Counter);
      end;
    end
  end else
  begin
    for i:=97 to 122 do
    begin
      Application.ProcessMessages;
      if ((round(Hash) mod i = 0) and (Run)) then
        rekBacktracking(Text + Char(i), round(Hash) div i, Laenge-1);
    end;
  end;
end;
Für den Hash habe ich extended genommen, weil da 2 Bytes mehr drin sind als im Int64. Dafür muss ich ab und an mit round() rumkaspern.

Beispiel:
Der Hash 2001968049246036480 mit einer Wortlänge von 9 Zeichen (maximum, da bei 10 zeichen auch extended eventuell nicht mehr reicht):
181440 Möglichkeiten [abffpqrsz..zsrqpffba] wurden in 16,69 Sekunden berechnet und in das Memo eingetragen.

Ich hänge dir das Proggi inkl. Source mal an. Copyright kannste haben...

Hoffe, dass ich dir damit helfen konnte.

Mein Tipp: Vom ASCII-Code der Zeichen erst 96 abziehen (nicht 97!), damit du Zahlen von 1 bis 26 inklusive multiplizierst. Dann reichen auch "normale" Datentypen aus, um den Hash zu speichern.
Angehängte Dateien
Dateityp: exe hasher_815.exe (410,5 KB, 9x aufgerufen)
Dateityp: zip hashersource_851.zip (8,8 KB, 10x aufgerufen)
Max
"Das Ziel ist im Weg!"
  Mit Zitat antworten Zitat