C# Bruteforce algorithmus

Hi!

Ich suche einen brute force algorithmus für C#
er soll möglichst schnell sein und halt alle möglichkeiten durchlaufen in der form etwa:

a
b
c
...
y
z
aa
ab
ac
...
etc

Hat da wer einen parat?


mfg
Floppy

ps:
wär cool wenn man angeben könnte welche buchstaben / zahlen / sonderzeichen er durchlaufen soll. muss aber nicht unbedingt sein. nen einfacher reicht mir auch.
thx
 
Ich kann zwar kein C# drum kann ich dir nur ne Idee geben wie du es lösen könntest, Coden musste es aber selber. Ich würds warscheinlich mit 2 Arrays machen, einem mit Feldern in der Anzahl der maximalen Buchstabe des Passworts und eins mit den Zeichen die verwendet werden. Dann kannste per Schleife erst im 1.Array beim 1. Wert alle Werte aus dem 2. Array nacheinander durchgehen usw. Ob das allerdings der schnellste Algorithmus ist weiß ich nicht, so würde ich es aber angehen wenn ich mir nen Bruteforcer schreiben würde.
 
also ich möchte ja fast behaupten, dass es keinen schnellen oder langsamen bruteforce-algorithmus gibt ;-)

bruteforce heißt doch letztendlich, dass du jede möglichkeit probierst. wie du das machst sollte dabei wohl ziemlich unerheblich sein, da du ja dennoch jede möglichkeit erzeugen musst.
 
Du kannst aber Zeit "sparen" indem du moeglichst viel ausserhalb der Schleife(n) erledigst. Haengt auch stark davon ab, ob du etwas remote oder lokal "angreifen" willst.
 
nene lokal soll sich das ganze abspielen. ich will quasi nur eine vaiable (halt nen string) haben der alle möglichkeiten duchläuft.

ich hab das ganze schonmal für c++ entwickelt. da habe ich das halt mit nem char array gemacht, den ich um 1 immer erhöhe und wenn bei z angekommen habe ich das 2. feld und das 1. auf aa gestzt und dann wieder erhöht. nur war das halt schon nen bissel arbeit und ich hab den quelli nicht mehr. desshalb hab ich gehofft das einer grad sowas ma parat hat.

wenn nix hilft muss ich mich halt wieder dran setzten :(


achso und zum thema speed:
natürlich kann man zeit sparen. da man ja bei bruteforce sehr viele schleifendurchläufe hat, spielt in der schleife jede kleinste rechnung oder if-bedingung eine rolle. bei zb nur 7 zeichen (nur kleinbuchstaben) gibt es ja allein schon 8031810176 möglichkeiten. und jetzt überlegt mal ihr habt in diesen 8 millarden möglichkeiten sagen wir mal 2 if-bedingungen und ein rechenschritt mehr, macht das schon nen unterschied. bei 7 zeichen (klein-, großbuchstaben und zahlen) sind wir schon bei 3521614606208 möglichkeiten.

ps: naja und ich weis wenn ichs richtig schnell haben will, muss ich das in asm schreiben



mfg
Floppy
 
wenn nix hilft muss ich mich halt wieder dran setzten

Naja sicher hilft was, ich denke (vor allem) wenn du den Algo in C++ schon mal geschrieben hast duerfte es nicht so schwer sein ... Hast du viel Erfahrung in C#? Oder willst du einfach einen fertigen Algo vor die Nase bekommen?

Es geht doch nur um ein Bisschen herumhantieren mit char's, ist nicht soo schwer ;)

Mike
 
Code:
#include <iostream>

int main(void)
 {
  for (int a = 0;a <= 99;a++)
   for(int b = 0;b <= 99;b++)  
     std::cout << a << b << std::endl;

  return 0;    
 }
 
Hast du viel Erfahrung in C#?

ne eben noch nicht. bin seit vorgestern von meinen auch nicht überragenden c++ kenntnissen zu c# übergelaufen.

ich hatte bei meinem c++ code immer int werte (die den ascii zeichen entsprechen) dem char array zugewiesen. da ja die buchstaben alle nacheinander kommen, brauchte man ja nur um 1 erhöhen. dies geht aber bei c# nicht so.


#include <iostream>
int main(void)
{ for (int a = 0;a <= 99;a++)
for(int b = 0;b <= 99;b++)
std::cout << a << b << std::endl;
return 0; }

erstmal thx!
aber dies is c++ und es ist auch nicht für buchstaben. und es ist nur für 2 zeichen. ich müsste ja eine variable anzahl an zeichen bedienen können.
ich weis wenn man die ausgabezeile ändert wärs au c# aber naja wie gesagt bringt das nicht soo viel.
 
Code:
using System;
using System.Text;

namespace BruteForce
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			String loweralpha = "abcdefghijklmnopqrstuvwxyz";
			int wordLength = 2;
			for(int i=1; i<=wordLength;i++)
				BruteForce(loweralpha,i);
		}
		
		public static void BruteForce(String charset, int wordLength) { 
		    long startw = 0; 
		    long endw = (long)Math.Pow(charset.Length,wordLength); 
		    long[] d = new long[wordLength+1];
		    char[] charsetArray = charset.ToCharArray();
		    int charsetLength = charset.Length;
		    StringBuilder s = new StringBuilder("");
		    
		    for (int i=wordLength; i>=0; i--) 
		            d[i] = (long)Math.Pow(charsetLength, i); 
		    
		    while(startw < endw) { 
		    	s.Remove(0,s.Length);
		        long mw = startw;  
		        for (int i=wordLength; i>=0; i--) { 
		            int w = (int)(mw/d[i]); 
		            
		            if (i==wordLength) {
		            	if (w!=0) s.Append(charsetArray[w]);
		            }
		            else s.Append(charsetArray[w]);
		            
		            mw = mw-(w*d[i]); 
		        } 
		        
		        // Ausgabe verbraucht viel Rechenzeit 
		         Console.WriteLine(s);
		        
		        startw++; 
		    }   
		}
	}
}
 
Zu ivegotmail's Algorithmus:

Man koennte zwecks Performance noch einiges Ausserhalb der Schleife lassen, das waere konkret:

charset.Length und charset.ToCharArray() verbrauchen bei jedem Aufruf ziemlich viel Zeit (sogar bei Strings die 2 Zeichen lang sind), ich hab mal davon gelesen (sorry kann Quelle nicht Zitieren da nicht mehr parat), also die beiden "Werte" einfach in einer Variable intern lagern ...

Ansonsten hast du ja dank ivegotmail die beste Voraussetzung fuer dein Programm ;)

Viel spass noch...

Mike
 
@ivegotmail: sind Strings unter C# nicht immutable? Und wird das Ganze dann nicht gerade dadurch (unveränderbarkeitt) gebremst, so dass man mit Char-Arrays vielleicht sehr spürbare Perfomancesteigerung erziehlen würde? Gerade die String-Object Verwaltung und Ähnliches dürfte bei solchen Aufgaben der Flaschenhals sein (imho ist es nicht viel anders, wenn man cout nutzt - die ganzen Extraprüfungen usw müssten doch extremst bremsen ;) ) .
 
True That, ich habe jetzt kein C# bei der Hand, aber jetzt kommt mir gerade die Idee, gibts sowas wie in java StringBuffer vielleicht auch in C#?

Mike
 
man kann die geschwindigkeit noch ein bischen verbessern.
Die Hochzahl wird jedes mal neu berechnet auch wenn sie sich nach ner zeit wiederholen. Sprich am anfang einmal berechnen und in einem Array schreiben und diesen dann jedes mal auslesen wäre schneller. ;)

Zusätzlich könnte man noch ein bischen performance raus holen indem man den StringBuilder einfach nur immer wieder löscht anstatt ihn neu zu instanzieren.
 
@Floppy1009:
Hab' den Algorithmus mal kurz in C++ geschrieben. Nun musst Du nur noch die iterative Version in C# übersetzen.

Greetz
Hackse
 
Original von Greenberet
man kann die geschwindigkeit noch ein bischen verbessern.
Die Hochzahl wird jedes mal neu berechnet auch wenn sie sich nach ner zeit wiederholen. Sprich am anfang einmal berechnen und in einem Array schreiben und diesen dann jedes mal auslesen wäre schneller. ;)
done.

Original von Greenberet
Zusätzlich könnte man noch ein bischen performance raus holen indem man den StringBuilder einfach nur immer wieder löscht anstatt ihn neu zu instanzieren.
habe den code mal angepasst und stattdessen
Code:
s.Remove(0,s.Length);
verwendet. oder gibt es noch eine andere effektivere Methode StringBuilder zu löschen?
 
Zurück
Oben