Forum: Mikrocontroller und Digitale Elektronik Passwort programmieren


von Tom (Gast)


Lesenswert?

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

von Division (Gast)


Lesenswert?

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

von Johannes M. Richter (Gast)


Lesenswert?

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 manni72 (Gast)


Lesenswert?

von dem abbruch merkt der benutzer doch nichts. also gibt es doch 1000
verschiedene möglichkeiten.

von Tom (Gast)


Lesenswert?

Danke für eure Hilfe...
Bin nun selbst auf eine gute Lösung gekommen.

Gruss Tom

von Tobi (Gast)


Lesenswert?

erst alle 4 zahlen einlesen und danach vergleichen. nach 3 fehlversuchen
eingabe für 1 minute sperren. hilft gegen zu viel ausprobieren

von Profi (Gast)


Lesenswert?

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.

von Zotteljedi (Gast)


Lesenswert?

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.

von FranzK (Gast)


Lesenswert?

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.

von Tobi (Gast)


Lesenswert?

seh ich auch so. wäre ziemlich sinnlos das nicht zu erlauben. ist vor
allem kein mehraufwand bei der implementierung

von Profi (Gast)


Lesenswert?

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.

von manni72 (Gast)


Lesenswert?

@profi:

ja, sorry, meinte natürlich 10000

von Schueler :) (Gast)


Lesenswert?

Hat denn nun jemand eine passende Programmierung,die er mal freigeben 
könnte?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael K. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.