Generieren jede Zeichenkombination bis zu einer bestimmten Wortlänge
Ich mache eine Sicherheits-Präsentation für meine Computer-und Informationssicherheit Kurs in ein paar Wochen Zeit, und in dieser Präsentation werde ich zeigen, die vor-und Nachteile der verschiedenen Angriffe (dictionary, Regenbogen-und bruteforce). Ich bin tun, die Wörterbuch-und rainbow-Attacken gut, aber ich brauche zu generieren, die bruteforce-Attacke auf das Fliegen. Ich muss ein Algorithmus gefunden werden, lassen Sie mich-Zyklus, obwohl jede Kombination von Buchstaben, symbol und Zahl bis zu einer gewissen Zeichenlänge.
So als Beispiel für eine Zeichen-Länge von 12, die ersten und letzten paar Generationen werden:
a
ab
abc
abcd
...
...
zzzzzzzzzzzx
zzzzzzzzzzzy
zzzzzzzzzzzz
Aber es wird auch die Verwendung von zahlen und Symbolen, so ist es ziemlich schwer für mich zu erklären... aber ich denke, Sie bekommen die Idee. Verwenden Sie nur Zeichen aus der ASCII-Tabelle ist in Ordnung.
Ich kann die Art des Bildes mithilfe eines ASCII-Funktion zu tun, diese mit einem Zähler, aber ich kann es einfach nicht in meinen Kopf. Wenn jemand könnte einige source-code (ich werde wohl mit C#) oder auch einige pseudo-code, kann ich das Programm eine Funktion aus, die groß sein würde.
Vielen Dank im Voraus. 🙂
InformationsquelleAutor Will | 2010-09-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer rekursiven Funktion, lassen wir Sie laufen durch alle Kombinationen von ValidChars:
Weisen Sie den Satz der gültigen Zeichen ValidChars, die maximale Länge der Zeichenfolge, die Sie wollen, maxlength, dann rufen Sie
Dive("", 0);
und gehen Sie Weg.Die Routinen sind identisch in Bezug auf Leistung langen Stangen. Die string-concat mehr Zeit in Anspruch als die Frage, ob die rekursive Funktion geht ein oder zwei parms.
Der wesentliche Unterschied zwischen unseren Antworten ist, dass ich fertige mir 10 Minuten, bevor Sie. ;>
Ich wollte nicht, um wettbewerbsfähig zu sein, nur versuchen, zu untersuchen, die beste Lösung: ich fand, dass 1) ich habe nicht die Stoppuhr zurückzusetzen zwischen den anrufen zu beginnen, und 2) dein code return string 1 Zeichen größer als angegeben: wo man schreiben: if (level <= maxlength) sollte if (level < maxlength). Grüße
deins ist weniger flexibel, aber richtig. Ich habe die <= in eine < Danny ' s richtig.
InformationsquelleAutor dthorpe
Müssen Sie generieren alle Kombinationen von Zeichen aus einem Satz von gültigen Zeichen ; nennen wir dieses set
validChars
. Im Grunde genommen, jeder Satz der Kombinationen der Länge N ist ein Kartesisches Produkt vonvalidChars
mit sich selbst N-mal. Das ist ziemlich einfach zu tun, ist die Verwendung von Linq:Offensichtlich, Sie nicht wollen, um manuell den code schreiben, der für jede Länge, vor allem, wenn Sie nicht im Voraus wissen, die maximale Länge...
Eric Lippert hat einen Artikel zu erzeugen das kartesische Produkt von einer beliebigen Anzahl von Sequenzen. Mit der
CartesianProduct
Erweiterung Methode von dem Artikel, den Sie erzeugen kann, die alle Kombinationen der Länge N wie folgt:Da Sie möchten, dass alle Kombinationen von Länge 1 zu MAX, Sie können etwas tun:
allCombinations
ist einIEnumerable<IEnumerable<char>>
, wenn Sie wollen, um die Ergebnisse zu erhalten wie eine Sequenz von Zeichenfolgen, die Sie gerade brauchen, um hinzuzufügen, eine Projektion:Beachten Sie, dass es sicherlich nicht die effizienteste Lösung, aber es ist wenigstens kurz und lesbar...
new string(combination.ToArray())
das gleiche wieString.Join("", combination)
.Net 4?Es ist nicht das gleiche, aber es hat das gleiche Ergebnis. Als ich mit String.Beitreten, aber mit einem leeren Trenner es schien seltsam, und ich denke, die performance ist besser mit den String-Konstruktor, da haben wir schon eine Folge von Zeichen
InformationsquelleAutor Thomas Levesque
Können Sie versuchen, diesen code, die Rekursion zu drucken, alle möglichen Zeichenfolgen von 0 bis stringsLenght chars Länge, die sich durch alle Kombination von chars aus firstRangeChar zu lastRangeChar.
Dieser Blick, schneller zu sein als die Lösung von @dthorpe.Ich habe im Vergleich die algorthms mit diesem code:
ist, und auf meinen pc, bekomme ich diese Ergebnisse:
Doh! was für ein missverstehen
InformationsquelleAutor Andrea Parodi
Cast<char>()
funktionieren wird, wie bereits erläutert, hereNicht getestet. Wenn Sie Cast() funktioniert nicht, das byte kann umgewandelt werden in die Aggregate-Funktion, oder in einer Select(b=>(char)b) da der andere thread schon sagt.
InformationsquelleAutor KeithS
Andere alternative, die ich habe, die einen string zurückgeben.
Ich kümmerte sich nicht um die Leistung von dem Ding, denn es war nicht für eine Reale Welt Szenario.
InformationsquelleAutor Guish