Bonjour,
CONTEXTE :
Ceci est un moyen d'authentification pour un agent secret, il doit rentré dans un premier temps une lettre qui lui est attribué (de A à Q mais sans le G). Par la suite le programme va lui renvoyé un nombre crypté (en lien avec le "m random"). Ensuite via un site externe, il obtient le nombre "m" et l'inscrit dans le monitor, si le nombre inscrit est le bon, alors il est authentifié, sinon non.
Dans mon programme je souhaites attendre une première saisi dans mon Monitor (ici une lettre a,b,c,...) qui me donne un nombre (ici "c"), par la suite, via un site externe, je dois saisir un autre nombre, donc une 2ème saisi dans le moniteur. Dans mon programme je laisse un delay(20000) mais je ne souhaite pas y recourir, car en théorie il est censé rentré dans la boucle " if(Serial.available())" lorsque je rentre ma 2ème saisi.
En clair, je souhaite mettre à la suite 2 "if(Serial.available())" or le 2ème n'attend pas la 2ème saisi dans mon monitor.
Merci d'avance.
Désolé pour le long programme, je ne sais pas comment le mettre en mode Code. Pour bien le différencier du texte.
char x;
bool V = false; // me permet de passer à l'autre Serial.available() de la 2eme saisi
int chiffrer(int m, int e);
int clefagent(char x);
int Modexp(int a, int e, int n);
void setup() {
Serial.begin(9600);
randomSeed(analogRead(90)); // 90 un pin analogique non utilisé (juste pour que
//j'ai bien un nombre random, car random() n'est pas
//si random que ca...)
}
void loop() {
int e, mp, c;
short m; // ou int ou lon peut import
char x;
Serial.println(" ");
Serial.println(" ");
Serial.println("Identifiez-vous");
while(V==false){
if(Serial.available()){ // 1ER Serial.available()
x = Serial.read();
Serial.println(x);
m = random(0, 2881);
e = clefagent(x);
c = chiffrer(m ,e);
Serial.print("Message à dechiffrer :");
Serial.println(c);
V=true;
delay(1000);
}
}
while(V==true){
if(Serial.available()){ // 2EME Serial.available
mp=Serial.parseInt();
if (m==mp){
Serial.print("Vous etes authentifie ! Bienvenue agent ");
Serial.println(x);
delay(1000);
exit(0);
}
else{
Serial.println("Erreur d'authentification, le systeme de securité se déclenchera dans 5 secondes");
delay(1000);
exit(0);
}
}
}
}
int Modexp(int m, int e, int n){
unsigned long r; // On a besoin d'une grosse mémoire car les calculs de R peuvent aller jusque 5 millions
if(e<=0){
Serial.println("unhandled case");
exit(0);
}
if(m==0 || n==1){
r=0;
}
else{
r=1;
while(e>0){
r = (r*m) % n ;
e--;
}
}
return r;
}
///// CHIFFRER /////
int chiffrer(int m, int e){
int c;
int n= 2881;
c = Modexp(m, e, n);
return c;
}
///// ClefS Publique Des AGENTS /////
int clefagent(char x){
char a=65;
char b=66;
char c=67;
char d=68;
char e1=69;
char f=70;
char h=72;
char i=73;
char j=74;
char k=75;
char l=76;
char m=77;
char n=78;
char o=79;
char p=80;
char q=81;
int e;
if(x==a){
e=601;
}
if(x==b){
e=619;
}
if(x==c){
e=631;
}
if(x==d){
e=641;
}
if(x==e1){
e=647;
}
if(x==f){
e=653;
}
if(x==h){
e=661;
}
if(x==i){
e=673;
}
if(x==j){
e=691;
}
if(x==k){
e=701;
}
if(x==l){
e=733;
}
if(x==m){
e=739;
}
if(x==n){
e=751;
}
if(x==o){
e=797;
}
if(x==p){
e=809;
}
if(x==q){
e=811;
}
return e;
}