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?
einfaches Brut-Force Programm Memory Error
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.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?
Das Leben ist wie ein Tennisball.
Ich habe es jetzt ein Mal so gut wie möglich programmiert.
Aber das mit dem und dem zeichenAnzahl sieht aus wie Java bin ich nicht drausgekommen.
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.")
Code: Alles auswählen
ord
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
- 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 (print, input)
- Du solltest den Rest-Code nicht auf Modulebene stehen lassen, sondern so verpacken:
- 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 (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
assert encoding_kapiert
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:
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.
- 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)
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.
@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.