Forum: Mikrocontroller und Digitale Elektronik Arduino - Passwortvergleich mit Array


von Paul (Gast)


Lesenswert?

Hallo,

ich bastle zurzeit an einem Codeschloss welches mittels Arduino 
realisiert werden soll. Jeder Taster steht für eine Ziffer und wird in 
das PasswortArray2 geschrieben. Ich überlege jetzt aber schon seit ein 
paar Stunden angestrengt wie ich die beiden Arrays auf Gleichheit 
überprüfen könnte doch ich komme einfach nicht drauf..

1
 int PasswortArray[6] = {1,2,3,4,5,6};
2
 int PasswortArray2[6];
3
4
  int zaehler2=0;
5
  int zaehler=0;
6
  int test= 0;
7
  int pineins = 7;
8
  int pinzwei = 6; 
9
  int pindrei = 5;
10
  int pinvier = 4;
11
  int pinfuenf = 3;
12
  int pinsechs = 2;
13
  int absendepin =8;
14
  
15
  int zahlhalter1=0;
16
  int zahlhalter2=0;
17
  int zahlhalter3=0;
18
  int zahlhalter4=0;
19
  int zahlhalter5=0;
20
  int zahlhalter6=0;
21
  
22
  
23
  
24
  int prelltime=200;
25
  int program=0;
26
 
27
  int ledgruen =12;
28
  int ledrot=11;
29
30
  
31
  
32
void setup() {
33
 
34
  pinMode(pineins, INPUT_PULLUP);
35
  pinMode(pinzwei, INPUT_PULLUP);
36
  pinMode(pindrei, INPUT_PULLUP);
37
  pinMode(pinvier, INPUT_PULLUP);
38
  pinMode(pinfuenf, INPUT_PULLUP);
39
  pinMode(pinsechs, INPUT_PULLUP);
40
  pinMode(absendepin, INPUT_PULLUP);
41
  pinMode(ledrot, OUTPUT);
42
  pinMode(ledgruen, OUTPUT);
43
  Serial.begin(9600);
44
 
45
}
46
47
void loop() {
48
  
49
  
50
  //Pinabfrage - Wenn der Button gedrückt wird, wird die gedrückte Ziffer in das Passwortarray2 geschrieben
51
  //Delay um Taster zu entprellen
52
  
53
  if(digitalRead(pineins) == LOW) {
54
      
55
    delay(prelltime);  //Entprellen
56
    PasswortArray2[0]=1;
57
    Serial.println("EINS");
58
      
59
  }   
60
      else if(digitalRead(pinzwei) == LOW) {
61
       delay(prelltime);
62
       PasswortArray2[1]=2;
63
       Serial.println("ZWEI");
64
65
  }
66
  
67
  else if(digitalRead(pindrei) == LOW) {
68
      delay(prelltime);
69
      PasswortArray2[2]=3;
70
      Serial.println("DREI");
71
72
  }
73
  
74
  else if(digitalRead(pinvier) ==LOW) {
75
      delay(prelltime);
76
      PasswortArray2[3]=4;
77
      Serial.println("VIER");
78
79
  }
80
  
81
  else if(digitalRead(pinfuenf) ==LOW){
82
       delay(prelltime);
83
       PasswortArray2[4]=5;
84
        Serial.println("FUENF");
85
86
       
87
  }
88
  
89
  else if(digitalRead(pinsechs)==LOW) {
90
   
91
        delay(prelltime);
92
        PasswortArray2[5]=6;
93
        Serial.println("SECHS");
94
95
  }
96
  
97
  
98
  if(digitalRead(absendepin) == LOW) {
99
    
100
// Hier PIN-Code auf Gleichheit überprüfen    
101
102
103
  }
104
}
Könnte mir jemand ein paar Tipps/Denkanstöße geben?

: Bearbeitet durch Moderator
von Max H. (hartl192)


Lesenswert?

1
gleich=1;
2
for(i=0;i<6;i++)
3
{
4
  if(PasswortArray[i]!=PasswortArray2[i])
5
  {
6
    gleich=0;
7
    break;
8
  }
9
}

BTW: Entprellen mit Delay ist Murks

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>BTW: Entprellen mit Delay ist Murks

Ist doch schon egal bei seinem Programm.
Egal in welcher Reihenfolge man die Taster betätigt,
wenn alle einmal betätigt wurden stimmt das Passwort;)

von Max H. (hartl192)


Lesenswert?

holger schrieb:
> Ist doch schon egal bei seinem Programm.
Ok, dann die gesamte Routine zum Abfrage der Taster.

von Dussel (Gast)


Lesenswert?

Einer, der die Vorurteile über Arduinonutzer bestätigt. Das ist noch 
nichtmal böse gemeint, es ist eher interessant. ;-)

Aber zum Thema noch ein kurzer Nachtrag zum Code von Max H.:
1
gleich=1;
2
for(i=0;i<6;i++)
3
{
4
  if(PasswortArray[i]!=PasswortArray2[i])
5
  {
6
    gleich=0;
7
    break;
8
  }
9
}
Da würde ich das break rauslassen, um eine (theoretische) 
Sicherheitslücke zu schließen. Ansonsten könnte man über die 
Durchlaufzeit feststellen, bis zu welcher Stelle das Passwort richtig 
ist.
Das ist hier bei einem Hobbyprojekt sicher nicht notwendig, aber warum 
es nicht mit weniger Aufwand noch ein bisschen besser machen?

von Max H. (hartl192)


Lesenswert?

Dussel schrieb:
> Da würde ich das break rauslassen, um eine (theoretische)
> Sicherheitslücke zu schließen...
Guter Einwand, daran habe ich gar nicht gedacht.

von scazeug (Gast)


Lesenswert?

Wenn wir bei den theoretischen Sicherheitslücken sind: Änderungen im 
Kontrollfluss sieht man über Strommessung deutlich besser als ein paar 
kippende Bits. Daher würde ich das so machen:
1
ungleich=0;
2
for(i=0;i<6;i++)
3
{
4
  ungleich |= PasswortArray[i] ^ PasswortArray2[i]
5
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Paul schrieb:
> Könnte mir jemand ein paar Tipps/Denkanstöße geben?
Lies mal den Beitrag "Zahlenschloss - Fehler"
Ließ ihn gut, und versuche die Posts dort zu verstehen. Du wirst ein 
Dejavu haben...

: Bearbeitet durch Moderator
von Paul (Gast)


Lesenswert?

Vielen Dank für den Link, ich hab gestern verzweifelt versucht den 
Thread wieder zu finden..:)

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.