okey und gibt es ein brute force bei dem man eine eigene wortlist erstellen kann und das schneller arbeitet als das wir bekannte Brutus A2.
oder kann man sich ein eigenes brute force zusammen stellen wortlist,tastenkombi etc.?
dir scheint so ziemlich jegwedes hintergrundwissen zu fehlen...
brute force ist kein programm ... es ist viel mehr ein allgemeiner ansatz der besagt: "probiere jeden möglichen schlüssel aus, bis du den richtigen gefunden hast". auch bekannt als "erschöpfende schlüssel(raum) suche"
definitions bedingt gilt dieser ansastz für jede art von schlüssel: egal ob passwort oder binär-wert, oder sonstiges...
betrachten wir mal nur den passwort fall ...
sagen wir mal du hast ein passwort "dollespasswort"
sagen wir ferner, dieses passwort liegt lokal als hash ("17a40463f74aea1a8e97330152705c2d") vor, und die hashfunktion (md5) sei bekannt
nun soll dieser hash "gebrochen" werden...
wir wissen: den hash eines passworts zu erzeugen ist leicht ... md5("dollespasswort")=17a40463f74aea1a8e97330152705c2d
aber die umkehrung ist nicht bekannt ... reverseMd5("17a40463f74aea1a8e97330152705c2d")="dollespasswort"
würde es die funktion reverseMd5(...) geben, hätte man kein problem das passwort zu berechnen ... grundlegende eigenschaft von hash funktionen ist es allerdings das sie mathematisch gesehen einbahnstraßen sind ... die reverse (oder auch inverse) funktion gibt es nicht... das liegt unteranderem daran, dass die meisten hashfunktionen eine feste länge des hashwertes haben ... egal wie viel text du auf der einen seite rein stopfst, das ergebnis hat immer die gleiche länge ... im fall von md5 32 byte ... denken wir den gedanken mal weiter ... wenn es nur endlich viele 32 byte werte gibt, aber es möglich ist dinge zu hashen die länger sind als 32 byte, dann muss md5 mehr als einen eingabe wert auf den gleichen hashwert abbilden ... da es unendlich viele mögliche eingabewerte gibt, aber nur endlich viele ausgabe werte, muss md5 sogar unendlich viele eingaben auf die gleiche ausgabe abbilden ... wenn man also 2 eingaben kennt, die zum gleichen hashwert führen, nennt man dies kollision
sagen wir mal das passwort gehört zu irgend einer applikation bei der du dich anmelden musst, und die ggf nicht mal auf deinem rechner, sondern irgendwo läuft ...
kann man sich ohne das passwort wirklich nicht anmelden?
der server prüft bei der anmeldung ob das was du eingegeben hast, beim hashen den gespeicherten wert ergibt.
da wir aber wissen, dass undendlich viele eingaben auf den gespeicherten hashwert führen, reicht es, wenn wir irgend einen dieser werte kennen ...
wir suchen also gar nicht das ursprüngliche passwort, sondern nur eine beliebige kollision mit dem bekannten hashwert ... das kann das passwort sein, oder aber auch etwas völlig anderes ... präziser ausgedrückt, wird folgendes gesucht:
eine beliebige kollision, die von der verfügbaren eingabemöglichkeit abgedeckt wird (beliebige kollisionen aleine könnten dinge beinhalten die dem system nicht möglich sind ... die eingabe muss evtl alphanumerisch sein, so dass binärdaten, die zwar eine kollision darstellen, aber leider nicht durch die eingabeprüfung kämen, nutzlos wären... wir suchen aber eine nutzbare kollision)
hat man diese überlegungen dann abgeschlossen, geht es daran eine entsprechende suche durchzuführen ...
als nächstes sollte man sich den zu durchsuchenden schlüsselraum (gesammtheit aller möglichen eingaben) definieren ...
wenn man eine vorstellung von besagtem schlüsselraum hat, gilt es danach aus performance gründen die verfügbaren ausführungseinheiten zu benennen ... das können kerne einer CPU sein ... GPUs ... oder eine annsammlung von diesen, evtl verteilt über ein rechnernetz, etc ...
jede einzelne einheit kann einen teil des schlüsselraums durchsuchen ... es gilt nun eine partitionierung des schlüsselraums zu finden (den schlüsselraum entsprechend der leistungsfähigkeit der einzelnen einheiten so aufzuteilen, dass alle einheiten optimal eingesetzt werden)
dann brauchst du eine implementierung der besagten hashfunktion in einer form, die jeweils auf die zugrundeliegende ausführungseinheit zugeschnitten ist (eine GPU hat einen anderen befehlssatz als eine CPU, dementsprechend kann man die funktion anders optimieren)
um die eigentliche funktion herum fehlt dann noch ein konstrukt dass den jeweiligen teil des schlüsselraums, schlüsselkandidat für schlüsselkandidat an die funktion übergibt und das ergebnis mit der vorgabe vergleicht. im falle einer übereinstimmung kann die weitere verarbeitung abgebrochen werden und der aktuelle schlüsselkandidat der einheit sollte als gefundene kollision gemeldet werden ...
das wäre der eigentliche funktionelle teil ... die infrastrukturmaßnahmen, um das ganze zu organisieren würden an dieser stelle den rahmen sprengen ...
das wäre so in etwa der grobe abriss ...