Schleifen in Schleifen

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.
Antworten
Oxijohn
User
Beiträge: 12
Registriert: Dienstag 30. Mai 2017, 14:13

Hallo Leute
Wir haben im Informatikunterricht gerade das Thema Kryptographie und sollten dazu ein kleines eingenes Projekt zu Hause starten welche wir als Extraleistung einreichen können und ich dachte mir, weil es zum Thema kombinatorik befasst habe versuche ich ein Brute Force Programm für Hashfunktionen zu schreiben.
Mein Problem ist nun das sich die zweite Schleife (die for schleife) nicht wiederholt und ich weiß nicht warum ?
Kann mir jemand helfen?

Code: Alles auswählen

import os
import itertools
import hashlib

def abgleich():
    zkpwd = 'e22a63fb76874c99488435f26b117e37'
    pwdmin = 1
    pwdmmax = 6
    if os.path.exists('D:/Python36/own_stuff/symbole.txt'):
        fm = open('D:/Python36/own_stuff/symbole.txt')

    else:
        Sym = open(input ('Syboliste: '))

    while pwdmin < pwdmmax + 2:
        for liste in itertools.permutations(fm.readline(), pwdmin):
            string = ''
            for i in liste:
                string = string + str(i)
            hpwd = hashlib.md5(string.encode()).hexdigest()
            if hpwd == zkpwd:
                print ('passwort:' + i)
                break
        print (pwdmin)

abgleich()
Danke im Vorraus
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@Oxijohn: man sollte keine Strings wiederholen, wie z.B. in Zeile 9 und 10. Willst Du den Dateinamen ändern, mußt Du das an zwei Stellen tun. Dazu definiert man am Anfang eine Konstante, z.B. SYMBOL_FILENAME und nutzt diese. Existiert die Datei nicht, wird fm auch nicht definiert, was dann in Zeile 16 zu einem Fehler führt. Die while-Schleife ist eine Endlosschleife, da weder pwdmin noch pwdmax geändert wird. Warum wird bis `pwdmax +2` gegangen, also warum +2? Eine Zeile kann man nur einmal mit readline lesen, so dass beim ersten while-Schleifendurchlauf die erste Zeile aus symbole.txt genommen wird, beim zweiten Durchlauf die zweite, usw. Ist das gewollt? Zeile 17-19 kann man einfach als `string = ''.join(liste)` schreiben kann. Zeile 23: break beendet nur die for-Schleife, nicht die while-Schleife. Deine Variablennamen sind allesamt schlecht. Kryptische Abkürzungen wie hpwd, zkpwd, pwdmin oder pwdmax erfordern raten, was denn nun zk oder h sein soll, und ob pwd password oder powerdensity heißt? Schreib die Namen doch aus, dann ist es klar. string und liste sind viel zu generell. Versuche die Namen so zu wählen, dass sie aussagen, was sie enthalten.
BlackJack

@Oxijohn: Der Wert von `i` in Zeile 22 ist auch interessant: Das ist immer das Zeilenendendezeichen, ausser die Datei war komplett leer also wirklich 0 Bytes gross — in dem Fall wäre der Name `i` in Zeile 22 nicht definiert und würde zu einem `NameError` führen.

`os.path.exists()` würde man hier übrigens eher nicht einsetzen, sondern einfach die Datei öffnen und die Ausnahme behandeln die ausgelöst wird falls die Datei nicht existiert.
Oxijohn
User
Beiträge: 12
Registriert: Dienstag 30. Mai 2017, 14:13

Danke für eure Hilfe das mit der Unendlichkeitsschleife sollte nicht sein ich muss die Variablenveränderung ausversehen mit den test prints gelöscht haben an den rest deiner Vorschläge setzte ich mich gleich.

vielen Dank auf jeden Fall
`os.path.exists()` würde man hier übrigens eher nicht einsetzen, sondern einfach die Datei öffnen und die Ausnahme behandeln die ausgelöst wird falls die Datei nicht existiert.
Warum ist das keine gute Idee?
Eine Zeile kann man nur einmal mit readline lesen, so dass beim ersten while-Schleifendurchlauf die erste Zeile aus symbole.txt genommen wird, beim zweiten Durchlauf die zweite, usw. Ist das gewollt?
Nein ist es nicht :?
löse ich das problem wenn ich einfach nur read benutze? (die Symbole stehen nur in der ersten Zeile und das Dokument ist ansonsten leer)
Zuletzt geändert von Oxijohn am Dienstag 13. Juni 2017, 20:48, insgesamt 1-mal geändert.
BlackJack

@Oxijohn: Weil im öffnen der Datei der Test auf Existenz sowieso schon drin steckt, und zwischen dem eigenen Test und dem öffnen die Datei gelöscht werden könnte. Durch den Test vorher ist also nichts gewonnen. Zumal die Ausnahmebehandlung auch noch mehr abdeckt, denn es reicht ja nicht das der Pfad existiert, er muss auch noch eine Datei sein, und man muss sie auch zum lesen öffnen dürfen. Auch diese Tests werden beim öffnen gemacht.
Oxijohn
User
Beiträge: 12
Registriert: Dienstag 30. Mai 2017, 14:13

Okay verstehe Danke ich nehme es raus
Oxijohn
User
Beiträge: 12
Registriert: Dienstag 30. Mai 2017, 14:13

Ich habe jetzt readline durch read erstzt aber das problem ist immer noch nicht gelöst.
Welche Funktion sollte ich den verwenden?
BlackJack

@Oxijohn: Das kommt ganz darauf an was Du letztendlich machen möchtest. Bei mir hinterlässt der Code zu viele Fragezeichen als das ich da anfangen wollen würde zu raten wie die Eingabedaten aussehen und was Du da eigentlich machen möchtest.
Oxijohn
User
Beiträge: 12
Registriert: Dienstag 30. Mai 2017, 14:13

Okay also wenn nicht einmal das klar ist bin ich vielleicht ein bisschen zu schnell vor geschossen.
Ich werde noch einmal ein paar schritte zurückgehen und von vorne anfangen.
Auf jeden fall vielen Dank für eure Hilfe
Antworten