Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Denkblockade (rekursive funktion) (https://www.delphipraxis.net/40572-denkblockade-rekursive-funktion.html)

Meflin 17. Feb 2005 19:17


Denkblockade (rekursive funktion)
 
Hi,

vielleicht kennt ja jemand mein brute force tut (hier in der tutorials sparte). das dort beschriebene verfahren ist zwar schön simpel und auch ganz gut was die geschwindigkeit angeht, nur verbruacht es halt wirklich extrem viel arbeitsspeicher. deswegen bin ich momentan dabei mir ein besseres verfahren auszudenken (das natürlich immernoch distributed brute forcing fähig sein soll ;) )

das geht dann wie gefolgt:
gegeben sind ein string mit den zeichen, aus denen das passwort gebildetwerden soll, sowie ein substring, der die teilaufgabe des programms darstellt
Delphi-Quellcode:
string: abcdefghijklmnopqrstuvwxyz
substring: ab
mit diesen daten bilde ich nun zunächst die kombinationen der länge 2 (wie im alten verfahren auch schon)
Delphi-Quellcode:
aa ab ac ad ae af...
ba bb bc bd be bf...
diese kombinationen werden dann im ram behalten. aus ihnen sollen alle anderen passwörter erstellt werden, sodass immer nur diese (wenigen) kombinationen im arbeitsspeicher benötigt werden. das geht auch.

dazu muss man ja für passwörter der länge 4 einfach nur an jeden eintrag dieses buffers jeden anderen eintrag hinhängen. für die der länge 6 (im moment interessieren nur die geraden längen ;) ) muss man für jedes der aus 4 gebildeten nochmal alle aus der liste anhängen.
Delphi-Quellcode:
aa | aa | aa
          ab
          ac
          ...
     ab | aa
          ab
          ac
          ...
     ac | aa
          ab
          ac
          ...
ich hoffe ihr versteht wie ich das meine. nun aber zu meinem problem: die vorher gebildeten längen sollen ja nicht im speicher behalten werden, d.h. ich muss jedes passwort neu berechnen.
da ich ja also sozusagen für jede länge eine größere anzahl von schleifen benötige, ist mir heute in der englisch stunde so gedämmert, dass sich das wohl mit rekursiven funktionen lösen lassen müsste. nur in mathe, erdkunde, deutsch, französisch, latein, geschichte, chemie und musik ist mir kein bisschen ein lichtlein aufgegangen, was diese funktion machen müsste.
kurz gesagt ich habe zwar ein verfahren, bin aber etwas unfähig das nach pascal zu übersetztn :(

ich hoffe auf eure hilfe :!:


atreju2oo0 17. Feb 2005 19:31

Re: Denkblockade (rekursive funktion)
 
Delphi-Quellcode:


procedure reku(a:string);
begin
dowith(a) // Hier kannste auf den String zugreifen und halt was mit machen
For i:=0 to count(Zeichen) do // count Zeichen soll mal die Menge der gesamten Zeichen sein
reku(a+Zeichen[i]); // Hier wird der nächste Schritt gestartet und dazu dein Char angehängt

end;
Aufrufen kannste das ganze mit
reku('');

[edit] Erst beim zweiten Mal lesen richtig verstanden... hoffe ich [/edit]

Dust Signs 17. Feb 2005 19:33

Re: Denkblockade (rekursive funktion)
 
Wie wärs mit sowas (ungetestet)?

Delphi-Quellcode:
function CheckPassword(APassword: String; Depth: Integer): Boolean;
var
  i, j: Byte;
begin
  if Depth <= 0 then
    exit;
  for i := #97 to #122 do begin
    for j := #97 to #122 do begin
      CheckPassword(APassword + Chr(i) + Chr(j));
      //evtl. Result von CheckPassword bearbeiten...
      end;
    end;

  //Hier der Check...

  Dec(Depth, 2);
end;
Aufruf:

Delphi-Quellcode:
ABoolean := CheckPassword('', 6);
Nur so eine Idee...

Dust Signs

//EDIT: Mist, zu langsam ^^

jfheins 17. Feb 2005 19:52

Re: Denkblockade (rekursive funktion)
 
Ist jetzt nur so ausm Kopf, aber trotzdem:

Wir machen eine rekursive Prozedur, Parameter:
:arrow: bisheriges Passwort
:arrow: Zeichen für das Pwd
:arrow: Wieviele Zeichen sollen noch angehängt werden ?
:arrow: TStrigList für die Ergebnisse

Delphi-Quellcode:
procedure BruteForce (const Pass, Zeichen: String; Length: Byte; Ergebnisse: TStringList);
  If Length = 0 then Exit;

  If Length = 1 then
    for i := 1 to length (Zeichen) do
      Ergebnisse.Add (Pass + Zeichen[i]);
  else
    for i := 1 to length (Zeichen) do
      BruteForce (Pass + Zeichen[i], Zeichen, Length - 1, Ergebnisse);
end;

Meflin 18. Feb 2005 21:48

Re: Denkblockade (rekursive funktion)
 
thx euch allen, keiner eurer vorschläge löst das problem ganz ;) aber imerhin hats gereicht, um meine denkblockade aufzuheben :) ich habs jetzt... BIG THX!



Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz