Hallo Zusammen Ich will in c ein kleines Passwort programmieren. Ich springe durch einen Tastendruck auf der Matrixtastatur in eine Funktion. Diese Funktion soll erst wieder verlassen werden, wenn 4 Zahlen in der richtigen Reihenfolge gedrückt werden. Hat jemand ein Beispielprogramm? Es sollte einwenig schwer sein den Code zu knacken, also man sollte nicht einfach alle Tasten ein paar mal durchrattern lassen und hat diesen schon geknackt. Fort Know muss er aber auch nicht gerade beschützen ;o) Für weitere Fragen bin ich stehts offen... Danke Gruss Tom
na das ja nich so wild.... ich würde das zwar etwas anders machen, aber warum nicht so. Wie wäre es mit einer 4fach verschachtelten if abfrage, und in der letzen wird erst was auch immer geschaltet. In den einzelnen ifabfragen musst du dann natürlich abbruchbedingungen einbauen, das bei einer falschen zahl wieder von vorne angefangen werden muss. Liebe Grüsse
Wenn bei jeder If-Abfrage bei jeder falschen Zahl gleich abgebrochen wird, dann hat man das Passwort ja mit max. 40x ausprobieren draussen, wenn ich's richtig verstanden habe. D.h. geprueft werden darf erst nach der Eingabe aller 4 Zahlen. Oder man gibt keinen Abbruch in die If-Abfrage, sondern setzt nur ein flag, das am Ende ausgewertet wird. Oder so..
von dem abbruch merkt der benutzer doch nichts. also gibt es doch 1000 verschiedene möglichkeiten.
Danke für eure Hilfe... Bin nun selbst auf eine gute Lösung gekommen. Gruss Tom
erst alle 4 zahlen einlesen und danach vergleichen. nach 3 fehlversuchen eingabe für 1 minute sperren. hilft gegen zu viel ausprobieren
Du kannst schon nach jeder Ziffer vergleichen, musst dann aber einen Zähler mitlaufen lassen, der weiß, welche Ziffer eingegeben wurde / welche die nächste ist. Wenn eine falsche dabei ist, wird der Zähler zurückgesetzt. Wenn 4/5 erreicht ist, war der Code richtig. Wenn das die einzige Funktion sein soll: siehe Codeschloß-ICs LS7220 / LS7222 LS7223 LS7225 / LS7226. www.lsicsi.com/pdfs/LS7220.pdf http://www.lsicsi.com/products_files/body_products-programmable_digital_locks.htm manni72: Wieso 1000? 10^4=10000 (0000-9999) Aber LS7220 hat 5040. Fällt mir gerade nicht ein, wie man darauf kommt, hat aber mit der Kombinatorik zu tun.
5040 ist 4 Ziffern aus 0..9 ohne "Zurücklegen", d.h. jede darf nur einmal vorkommen. Am Anfang hast Du 10 Möglichkeiten, beim zweiten Tastendruck nur noch 9 (weil eine ja schon gedrückt wurde), 8, 7. Macht 10 9 8 * 7 = 5040.
Ohne Zurücklegen ist aber doch recht unsinnig! Warum darf das Passwort nicht 4444 oder 1232 sein? Mit "zurücklegen sind mehr Kombinationen möglich und damit ist das Ganze sicherer.
seh ich auch so. wäre ziemlich sinnlos das nicht zu erlauben. ist vor allem kein mehraufwand bei der implementierung
Genau Zotteljedi, du hast Recht! Das hat speziell mit diesem IC zu tun, weil die 4 Tasten, die den Code beinhalten, auf 4 Pins gehen, und die nicht benutzten auf Reset. Damit die korrekte Reihenfolge getestet werden kann, darf eine Taste nur auf genau ein Pin gehen. Jede Ziffer darf in Code max. 1mal vorkommen.
Hat denn nun jemand eine passende Programmierung,die er mal freigeben könnte?
Schueler :) wrote: > Hat denn nun jemand eine passende Programmierung,die er mal freigeben > könnte? Wo ist das Problem? Auf 4 Tastendrücke warten und 4 Vergleiche. Das Komplizierteste dran dürfte das Auswerten der Tastendrücke sein, weil es dafür mehrere Möglichkeiten gibt, wenn man es sauber mit Tastenentprellung machen möchte. Ein zusätzlicher Timeout wäre nicht schlecht, damit ein Benutzerabbruch nach einer der ersten Tastendrücke das System nicht in einem Zwischenzustand für den nächsten Benutzer hinterlässt. Also PseudoCode void WaitPwd() { int Key[4]; do { Rückmeldung_auf_Enter_PW(); TimeOut_rücksetzen(); i = 0; while( i < 4 ) { if( Key_Pressed() ) { Key[i] = Get_Key_Press(); i = i + 1; TimeOut_rücksetzen(); } if( TimeOut() ) i = 0; } } while( Key[0] != Erste_PW_Key || Key[1] != Zweiter_PW_Key || Key[2] != Dritter_PW_Key || Key[3] != Vierter_PW_Key ); Rückmeldung_Enter_PW_löschen(); } Lass deiner Phanatsie freien Lauf, da kann man noch viel verändern, aber die Grundstruktur ist immer: Warte auf n Tastendrücke, Vergleiche ob es die richtigen waren.
Meine Lösung: uint8_t PW[4] = {1, 2, 3, 4}; uint8_t CheckPW (uint8_t PressedNumber) { static uint8_t PWIndex = 0; if (PressedNumber == PW[PWIndex]) { PWIndex++; if (PWIndex >= 4) { PWIndex = 0; return 1; } } else PWIndex = 0; return 0; } Die Funktion CheckPW immer dann aufrufen, wenn eine Taste gedrückt wurde. Der Rückgabewert ist nur dann 1 wenn die Kombination richtig eingegeben wurde. Grüße, Michael
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.