einfaches Brut-Force Programm Memory Error

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Donnerstag 15. März 2012, 18:18

Ich habe noch Mals eine Frage:)
Wenn ich das Knacken in eine Funktion packe, werden dann die Import Anweisungen ebenfalls in die Funktion geschrieben, oder geschieht dies im Hauptprogramm?
EyDu
User
Beiträge: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 15. März 2012, 18:21

nooby hat geschrieben:Ich habe noch Mals eine Frage:)
Wenn ich das Knacken in eine Funktion packe, werden dann die Import Anweisungen ebenfalls in die Funktion geschrieben, oder geschieht dies im Hauptprogramm?
Nein, die import-Anweisungen sollten immer ganz oben im Modul stehen. Es gibt auch Situationen, in denen ein Import in einer Funktion sinnvoll ist, das kommt aber eher selten vor.
Das Leben ist wie ein Tennisball.
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Donnerstag 15. März 2012, 18:41

Ich habe es jetzt ein Mal so gut wie möglich programmiert.

Code: Alles auswählen

import itertools
import time

def passwortKnacken(möglicheZeichen, passwort, zeichenAnzahl):
    while True:
        versuche = 0
        passw = itertools.product(möglicheZeichen, repeat=zeichenAnzahl)
        print(zeichenAnzahl)
        for kombination in passw:
            komb = "".join(kombination)
            versuche+=1   
            #print(komb)
            if komb == passwort:
                return komb, versuche
        zeichenAnzahl+=1


möglicheZeichen = input("Bitte gieb alle Zeichen ein, die im Passwort enthalten sind:")
passwort = input("Bitte gieb das Passwort zum testen ein:")
zeichenAnzahl = int(input("Bitte gieb die mindest Anzahl Zeichen ein:"))
startZeit = time.time()
geknackt = passwortKnacken(möglicheZeichen, passwort, zeichenAnzahl)
endZeit = time.time()
print("Das Passwort lautet", geknackt[0], "und wurde in", str(endZeit-startZeit), "Sekunden und", geknackt[1], "Versuchen geknackt.")
Aber das mit dem und dem zeichenAnzahl sieht aus wie Java bin ich nicht drausgekommen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7477
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 15. März 2012, 18:53

- Statt der ``while``-Schleife und dem manuellen Counter wurde Dir doch iirc schon ``itertools.count`` empfohlen. Das kannst Du darüber hinaus auch bei der Erhöhung der Zeichenanzahl nutzen.

- Ich würde den ``itertools.product``-Aufurf nicht an einen separaten Namen binden, der eigentlich nie gebraucht wird; stattdessen schreib den Ausdruck doch direkt in den Kopf der ``for``-Schleife.

- PEP8 bei den Namen sehe ich auch noch nicht.

- Ich finde deutsche Namen idR. etwas "sperrig". Englisch ist da oftmals viel kürzer :-)

- Benutzt Du Python3? Ich hoffe ja, wenn nicht, gäbs noch einiges zu meckern :mrgreen: (print, input)

- Du solltest den Rest-Code nicht auf Modulebene stehen lassen, sondern so verpacken:

Code: Alles auswählen

#!/usr/bin/env python

# imports
import ...
...

# Funktionen / Klassen
def foo():
    ...

# ganz unten dann
def main():
    # ab hier alle Aufrufe, die Du noch außerhalb der Funktion
    # stehen hast; also den Code auf Modul-Ebene!

if __name__ == "__main__":
    main()
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
EyDu
User
Beiträge: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 15. März 2012, 18:56

Einige Dinge, die aufgefallen sind:
- Umlaute in Namen sind sehr unüblich
- du setzt "versuche" bei jedem Durchlauf wieder auf 0
- Es heißt "gib" und nicht "gieb"
- "zum Testen"
- "Mindestanzahl"
- Zum Zusammensetzen von Strings solltest du die Suchmaschine deiner Wahl mal nach "String Formatting" befragen.
- "geknackt" ist ein unpassender Name. Schöner wäre zum Beispiel:

Code: Alles auswählen

passwort, versuche = passwortKnacken(möglicheZeichen, passwort, zeichenAnzahl)
Dann ist die Zeile mit der Ausgabe auch gleich übersichtlicher.

Zum "zeichenAnzahl" und Java: Schau dir mal PEP8 an, in Python ist der Style etwas anders.
Zum "ord": Schreibe "password" statt "passw". Die drei Zeichen sind an der falschen Stelle gespart.
Das Leben ist wie ein Tennisball.
BlackJack

Donnerstag 15. März 2012, 19:08

@nooby: Die Rückgabe vom Passwort ist irgendwie total überflüssig weil man das der Funktion ja schon übergeben hat. Den Wert kennt man ja schon vor dem Aufruf.
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Donnerstag 15. März 2012, 20:07

@EyDu
Zum "ord": Schreibe "password" statt "passw". Die drei Zeichen sind an der falschen Stelle gespart.
:mrgreen:
Ich dachte ich muss die Funktion ord irgendwie anwenden.

ps: Nicht lachen bin erst 14.
Antworten