9. Salasõna seif

#include "DigiKeyboard.h"

int punaneLed = 5;
int rohelineLed = 0;
int sinineLed = 1;
int nupp = 2;


//Defineerin värvid arvudena, siis saan neile viidata nime järgi, aga samas tehe kergesti
//järgmise peale lülitumiseks matemaatikat - ühe võrra suurendamist.
#define PUNANE 0
#define KOLLANE 1
#define ROHELINE 2
#define SININE 3
#define LILLA 4

int pinkood[4] = {ROHELINE, LILLA, KOLLANE, PUNANE};// <-- See on minu PIN KOOD, mis õige salasõne trükib
char oigesalasona[] = "p2risp455w0rd"; // <--See on minu SALASÕNA, mida trükkida tahan USB seadmega

//See täherodu on siin selleks, et teha keerukamaks õige üles leidmine katsetamise teel
//Vale pin koodi puhul kirjutatakse juhuslik 13 märki pikk lõik sellest rodust
char valedsonad[] = { 
  "jsQd745Fjiu4GtrAf9d92hjEEre8432hRre9942NMi3hjrwe9342rwgdsdfHJgsd465hgehjFS7Flkrlew3" 
};


unsigned long varviAlgusaeg; //Loome muutuja arve pidamiseks, millal uus värv sisse lülitati
unsigned long varviKestus = 1200; //Määran, et ühte värvi tahan näidata 1,2 sekundit ehk 1200 millisekundit.

void setup() {

  pinMode(punaneLed, OUTPUT);
  pinMode(sinineLed, OUTPUT);
  pinMode(rohelineLed, OUTPUT);
  pinMode(nupp, INPUT);

  randomSeed(analogRead(A1));//Juhusliku arvu parema juhuslikkusega genereerimiseks
  
  boolean lopeta = false;//hoiab infot selle kohta, kas võib kordamise lõpetada
  int varvid[4] = {}; //Teeme array, kuhu koguda kasutaja valitud värvide numbrid
  int valitudvarve = 0;//Loendab, mitu värvi on nupuvajutusega ära valitud
  
  int praegunevarv = 0;
  boolean praeguneVarvValitud = false;//Sellega peame arvet, et 0.8 sek jooksul saab värvi
        //pin koodi valida ainult ühe korra, ka siis kui nuppu kauem hoida või klõbistada
  varviAlgusaeg = millis();//millis() on funktsioon, mis küsib kontrolleri sisemise kella aega
                           //Loendus toimub millisekundites alates sisselülitumisest
  naitaVarvi(praegunevarv);//Lülitame esimese värvi sisse

    
  while (lopeta == false) {
    if (millis() >= varviAlgusaeg + varviKestus) {//Kui värvi on näidatud juba 1200ms
      praegunevarv++;//Võtame järgmise värvi
      if(praegunevarv == 5) {//Kui eelmise tehtega värvid said otsa, siis 
        praegunevarv = 0;//tagasi algusesse
      }
      naitaVarvi(praegunevarv);//Näitame uut värvi
      varviAlgusaeg = millis();
      praeguneVarvValitud = false;
    }
    if (digitalRead(nupp)==HIGH) {//Kui nuppu vajutatakse
      if (praeguneVarvValitud == false) {//Kui selle 1.2 sek jooksul veel pole kirja läinud
        varvid[valitudvarve] = praegunevarv;
        valitudvarve++;
        praeguneVarvValitud = true;//salvestame, et mitte uuesti valikut sisse lugeda
      }
    }
    if (valitudvarve == 4) {//Kui 4 värvi on ära valitud, hakkame trükkima
      kustutaVarv();
      //Kontrollime kas valitud värvid olid õiged
      if (varvid[0]==pinkood[0] && varvid[1]==pinkood[1] && varvid[2]==pinkood[2] && varvid[3]==pinkood[3]) {
        trykiOigeSona(); 
      }
      else {
        trykiValeSona();
      }
      lopeta = true;//paneme püsti märguande, et while korduse võib ära lõpetada (olenemata sellest, kas õige või vale sõna)
    }
    DigiKeyboard.delay(50);
  }//while blokk lõppeb siin
 
}

void loop() {}

void trykiOigeSona() {
  DigiKeyboard.sendKeyStroke(0);
  DigiKeyboard.delay(500);
  DigiKeyboard.print(oigesalasona);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(500);
}

void trykiValeSona() {
  int random_number = random(0,65);//Valime suvalise järjekorranumbri, kust alustada
  char sona[14];
  for (int i=0; i<13; i++) {
    sona[i] = valedsonad[random_number+i];
  }
  sona[13]=0;//Selleks, et tähemärkide arrayd anda print funktsioonile, peab ta lõppu tähistama null
  DigiKeyboard.sendKeyStroke(0);
  DigiKeyboard.delay(500);
  DigiKeyboard.print(sona);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(500);
}

void naitaVarvi(int varv) {
  if (varv == PUNANE) {
    digitalWrite(punaneLed, LOW);
    analogWrite(rohelineLed, 255);
    analogWrite(sinineLed, 255);
  }
  else if (varv == KOLLANE) {
    digitalWrite(punaneLed, LOW);
    analogWrite(rohelineLed, 0);
    analogWrite(sinineLed, 255);
  }
  else if (varv == ROHELINE) {
    digitalWrite(punaneLed, HIGH);
    analogWrite(rohelineLed, 0);
    analogWrite(sinineLed, 255);
  }
  else if (varv == SININE) {
    digitalWrite(punaneLed, HIGH);
    analogWrite(rohelineLed, 255);
    analogWrite(sinineLed, 0);
  }
  else if (varv == LILLA) {
    digitalWrite(punaneLed, LOW);
    analogWrite(rohelineLed, 255);
    analogWrite(sinineLed, 0);
  }
}

void kustutaVarv() {
  digitalWrite(punaneLed, HIGH);
  analogWrite(rohelineLed, 255);
  analogWrite(sinineLed, 255);
}

ÜLESANNE 1: Mõtle, mida peaks muutma seoses “valede salasõnade” trükkimisega, et kui häkker ei saa katsetada kõiki sõnu kohe kuhugi sisselogimiseks, siis ei oleks tal võimalust teada saada, millised on valed salasõnad.

ÜLESANNE 2: Muuda koodi nii, et see oleks kasutatav ka inimesele, kes ei erista punast ja rohelist värvi üksteisest. Aga ära vähenda valikus olevate “värvide” arvu. Inimene peab saama kirjutada pinkoodi värvid (näidises int pinkood[4] = {ROHELINE, LILLA, KOLLANE, PUNANE};) vastavalt sellele, mida seade näitama hakkab.

Järgmine: 10. Pahatahtlik klaviatuur

Lisa kommentaar

Sinu e-postiaadressi ei avaldata. Nõutavad väljad on tähistatud *-ga