Inputbox; Passwort überprüfen

  • Hallo,

    ich komme alleine nicht wirklich weiter.

    Ich habe 2 Funktionen in meinem Programm eingefügt, die fehlerfrei funktionieren. Die eine Funktion verschlüsslt mir einen .ini Eintrag innerhalb einer bestimmten Section und die andere Funktion entschlüsselt mir das Passwort wieder.

    1. Funktion zum Verschlüsseln:

    2. Funktion zum Entschlüsseln:


    Nun meine Frage:


    Könnte mir bitte jemand behilflich sein, einen Code in meine Funktionen einzusetzen, sollte die Passwortangabe in der Inputbox zum entschlüsseln eine andere (falsche) sein, als die Passworteingabe, welche beim Verschlüsseln verwendet wurde. Ziel soll also sein: Wurde ein falsches Passwort zum entschlüsseln verwendet, soll erst eine Nachricht als Warnung ausgegeben werden, nach einem weiteren gescheiterten Versuch, soll das Programm beendet werden.

    PS: Der Benutzer vergibt sein Passwort selbst. Es ist also nicht vordefiniert.

    3 Mal editiert, zuletzt von bazii (22. Januar 2017 um 23:26) aus folgendem Grund: Schreibfehler geputzt

  • Ziel soll also sein: Wurde ein falsches Passwort zum entschlüsseln verwendet, soll erst eine Nachricht als Warnung ausgegeben werden, nach einem weiteren gescheiterten Versuch, soll das Programm beendet werden.

    Verschlüsselungsalgorithmen wissen nie ob etwas korrekt entschlüsselt wurde oder nicht. Du gibst Parameter wie Algorithmus und Passwort rein und sie liefern dir das entsprechende Ergebnis wenn es mit diesem Parametern verschlüsselt wurde.

    Füg am Anfang / Ende der Datei oder des Datensatzes ein Kennstring hinzu den du immer nach dem Entschlüsseln überprüfen kannst ob er vorliegt. Wenn er vorliegt so ist er mit 100%iger Wahrscheinlichkeit richtig entschlüsselt (es kommt praktisch nie vor das andere Parameter zum selben Ergebnis führen) und sollte er nicht vorliegen, dann nicht.

    Die Logik zum Abfragen und abschalten kriegst du sicherlich selber hin, ist ja nicht schwierig.

    $StringAn = StringLeft("An",2)
    $StringAus = StringLeft("Aus",3)

    Was soll das eigentlich bedeuten? Da kommt doch nur folgendes raus $StringAn = "An" und $StringAus = "Aus", warum das StringLeft?

  • Füg am Anfang / Ende der Datei oder des Datensatzes ein Kennstring hinzu den du immer nach dem Entschlüsseln überprüfen kannst ob er vorliegt. Wenn er vorliegt so ist er mit 100%iger Wahrscheinlichkeit richtig entschlüsselt (es kommt praktisch nie vor das andere Parameter zum selben Ergebnis führen) und sollte er nicht vorliegen, dann nicht.

    Die Logik zum Abfragen und abschalten kriegst du sicherlich selber hin, ist ja nicht schwierig.

    Hallo Alpines,

    Ich habe mir daran bereits die Zähne ausgebissen. Daher fragt ich um Hilfe an. Die Umsetzung von Füg am Anfang / Ende der Datei oder des Datensatzes ein Kennstring hinzu den du immer nach dem Entschlüsseln überprüfen kannst ob er vorliegt. schaffe ich alleine nicht. Die Logik zum Abfragen ... auch nicht. Daher fragte ich an, ob mir jemand im geposteten Code behilflich sein kann.


    Was soll das eigentlich bedeuten? Da kommt doch nur folgendes raus $StringAn = "An" und $StringAus = "Aus", warum das StringLeft?

    Der Code ist noch ungeputzt. Entschuldige. $StringAn = "An" und $StringAus = "Aus" waren Testbehilfe. Sind unrelevant.

  • Schau mal hier:
    [Blockierte Grafik: http://i.imgur.com/FhHZqAA.png]

    [Blockierte Grafik: http://i.imgur.com/jFobiXW.png]

    Damit kannst du schon mal schauen ob du die Nachricht erfolgreich verschlüsselt und entschlüsselt hast.


    Die Logik ob ein falsches Passwort eingegeben wurde ist wirklich leicht. Du erstellst einfach eine Variable die die Anzahl der Versuche hochzählt und das dem User mitteilt.
    Erreicht die Variable in der Schleife irgendwann den Wert X springst du raus und beendest das Programm.

  • Hallo Alpines,
    den von Dir geposteten Code habe ich ja bereits in etwa in meinen oben geposteten Funktionen enthalten und er funktioniert ja auch. Was ich noch benötige ist die Abfrage und daran scheiterte ich bislang.
    Variable die die Anzahl der Versuche hochzählt und das dem User mitteilt.Erreicht die Variable in der Schleife irgendwann den Wert X springst du raus

    Ist aber schon ok. Ich komme sicher wieder alleine nach ein paar Stunden drauf. ;(

  • Was ich noch benötige ist die Abfrage und daran scheiterte ich bislang.

    Verstehe ich deine Frage falsch oder bin ich einfach zu blöd um es zu begreifen? :D
    Möchtest du sowas, nur auf dein Script angepasst? Du siehst ja wo die Abfrage ist, wo der korrekte Fall ist und wo der falsche Fall ist, da kannst du deine Sachen reinpacken oder das Script hier unten um deins packen.

  • Hallo Alpines

    mit Deinem Hinweis auf die For / Next Schleife ging es ganz einfach.

    Herzlichen Dank dafür.

  • weil es doch eigentlich nicht so schwierig ist oder?

    Naja, den Code von Dir einzusetzen ist easy, da gebe ich Dir 100% Zustimmung. Aber für mich ist es oft nicht einfach, den richtigen Weg zu finden.

    So hatte ich es erst so versucht: Das klappte auch mehr schlecht als recht aber zufrieden war ich nicht...

    der Hinweis mit der For / Next Schleife kam mir nicht in den Sinn. So wollte ich die Meldung noch in einer While 1.... aufrunden was aber nicht zielführend war. So habe ich dann noch einige andere Experimente gemacht und habe mich verzettelt. Daher bedanke ich mich nochmal für Deine Hilfe sehr.

  • Hallo alpines,

    ich habe noch ein (für mich nicht lösbares) Problem.

    Solange ich mein Programm am laufen habe und die Funktionen __idIni_encrypt__ und __idIni_decrypt__ aufrufe funktioniert alles prima wie es soll.

    Wenn ich aber mein Programm beende und die funktion __idIni_decrypt__ wieder aufrufe, muss ich das richtige Passwort so oft eintragen, wie es die Schleife vorgibt, also 3 mal eintippen, bis es angenommen wird. Wie kann ich es so ändern, dass es bereits beim ersten Male als richtig erkannt wird? Ich stehe so was von auf dem Schlauch.

    Vor allem auch darum, weil nur dann, wenn ich diesen Teil vom Code deaktiviere,

    AutoIt
    If Not $aKeyOk Then
    		IniWrite ($sInifile, $idctrlread, 'PW-Crypt', "An")
    		MsgBox(64, 'Achtung ', 'Passwort falsch! Programm wird beendet', 20)
    	Exit
    EndIf

    nach den 3 Eingaben das Passwort als richtig erkannt wird. Ein Wiederspruch für mich.


    Ich habe irgendwo einen unschönen Haken, doch ich kann ihn nicht erkennen. Könntest du bitte nochmal helfen?

  • ich habe noch ein (für mich nicht lösbares) Problem.

    ... ich hab nen falschen Eindruck hinterlassen ...

    Funktioniert es denn beim dritten Mal überhaupt? Die Bedingungen in der For-Schleife sind eigentlich korrekt und du springst raus wenn die Keys identisch sind.

    Lass dir mal $aDeCryptKey und $aCryptKey (Das sind keine Arrays, das sind Strings also immer schön $s nehmen und nicht $a!) in die Konsole ausgeben.
    Außerdem solltest du mal nachprüfen wie oft die __idIni_decrypt_() aufgerufen wird, eventuell wird sie 3x aufgerufen, springt aber immer aus der Schleife raus und es kommt dir nur so vor als ob sie nicht rausspringt?

    Ein Tipp am Rande:
    Wenn deine _Crypt_DeriveKey() Funktion fehlschlägt und du schon mit If @error nachprüfst ob sie gescheitert ist, dann solltest du die Funktion auch unterbrechen, da ansonsten die anderen _Crypt*-Funktionen ausgeführt werden und sie sowieso zwangsweise fehlschlagen.

    Des Weiteren benutzt du _Crypt_Shutdown() nur wenn es keinen Error gab, obwohl das jedes Mal ausgeführt werden sollte.

    Und was soll eigentlich die zwei Sends unten nach dem GUISwitch() bringen?

  • Funktioniert es denn beim dritten Mal überhaupt?

    Ja, aber nur dann wenn ich

    Code
    If Not $aKeyOk Then
    		IniWrite ($sInifile, $idctrlread, 'PW-Crypt', "An")
    		MsgBox(64, 'Achtung ', 'Passwort falsch! Programm wird beendet', 20)
    	Exit
    EndIf

    ausklammere.


    Lass dir mal $aDeCryptKey und $aCryptKey (Das sind keine Arrays, das sind Strings also immer schön $s nehmen und nicht $a!) in die Konsole ausgeben.

    Hab ich gemacht. Die passen gut zusammen! Das $a tausche ich bei Gelegenheit mit $s aus. Hast vollkommen recht damit.

    Und was soll eigentlich die zwei Sends unten nach dem GUISwitch() bringen?

    Sind (waren) in der nachfolgenden Gui-Aktualisierung nötig (gewesen), da mir die Combobox Wochenlang ohne die "sends" Probleme machte. Bin aber mittlererweile fast davon weggekommen. Das ist aber von meinem Problem unabhängig.

    Ein Tipp am Rande:

    Hab ich zum Test immer gemacht.


    Des Weiteren benutzt du _Crypt_Shutdown() nur wenn es keinen Error gab, obwohl das jedes Mal ausgeführt werden sollte.

    Danke für den Tip. Das habe ich nun im Code berichtigt.

    Leider konnte ich keine Verbesserung erzielen. Ich frag mich immer noch, wo der Haken sein kann.

    EDIT: Die Funktion __idIni_decrypt_() wird nur bei Betätigen eines Buttons aktiv. Sonst nicht.

  • Lass dir mal alle Parameter in der Funktion die du verwendest ausgeben wenn du es normal machst und wenn du es während dem Schließens machst.

    Sehr guter Hinweis. Der Fehler wurde wie von Dir erwartet beim schließen gefunden. Von dort aus wurde eine Abfrage zur Verschlüsselung bei nicht verschlüsselten Ini-Einträgen durchgeführt und ich hatte nicht bedacht, dass ein Klick auf "JA" die Verschlüsselung nochmals verschlüsseln könnte, was aber leider so geschehen ist. Nun, der Fehler saß mal wieder vor der Tastatur. Eine weitere IF Abfrage und das Problem war in 2 Minuten gelößt. Danke Dir nochmals.