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..
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.
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.
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