Le CAPTCHA est une mesure de sécurité sur le Web de type authentification par question-réponse. Cette mesure de sécurité sert à vérifier que l'utilisateur est bien un être humain et non pas un programme malveillant.
Dans ce problème, on considère les CAPTCHAS basés sur des opérations de calcul.
Afin de simplifier la programmation de ce type d'authentification, on utilisera deux tableaux T1 et T2 où T1 contiendra des opérations de calcul et T2 contiendra leurs résultats correspondants.
A chaque authentification :
1- une opération est affichée aléatoirement
2- l'utilisateur saisit sa réponse à cette opération
3- un message de validation est affiché:
a) "Authentification valide" dans le cas ou la réponse est correcte
b) "Authentification invalide" dans le cas contraire
On se propose d'écrire un algorithme et un programme Python permettant :
1- de remplir deux tableaux T1 et T2 de même taille N compris entre 4 et 20 sachant que :
a) chaque élément T1[i] contient une opération de la forme "Nbre1 op Nbre2 = ?", avec :
- Nbre1 et Nbre2 sont deux nombres compris entre 0 et 30.
- Op est un opérateur arithmétique de la liste (+, - ou *)
b) T2[i] contient le résultat de l'opération contenue dans T1[i]
2- d'afficher aléatoirement un élément (opération) de T1.
3- d'afficher le message de validation correspondant suite à la réponse saisie par l'utilisateur.
Exemple:
Pour n=6 et les deux tableaux T1 et T2 suivants :
T1
"3 + 18 = ?" | "4 * 22 = ?" | "25 - 8 = ?" | " 11 - 6 = ?" | " 8 - 20 = ? " | " 12 * 6 = ? " |
T2
21 | 88 | 17 | 5 | -12 | 72 |
Si le programme choisit aléatoirement T1[4], l'opération "11 - 6 = ?" sera affichée.
Si l'utilisateur saisit 5, le message "Authentification valide" sera affiché, sinon le message "Authentification invalide" sera affiché pour toute autre réponse.
Dans cet algorithme, On va utiliser trois fonctions et une procédure:
Algorithme du programme Principal
1 2 3 4 5 6 7 8 9 10 11 12 |
Algorithme CAPCTHA Debut n<-saisie_taille() remplir(t1,t2,n) Ecrire("Donner le resulat de l'operation "+t1[Alea(0,n-1)]+" : ") Lire(essai) Si essai==t2[3] alors Ecrire('Authentification valide') Sinon Ecrire('Authentification invalide') Fin si Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
t1 | tableau des chaînes des caractères |
t2 | tableau des entiers |
n | entier |
essai | entier |
La fonction saisie_taille
Cette fonction saisit la taille du tableau entre 4 et 20.
1 2 3 4 5 6 7 8 9 10 |
fonction saisie_taille():entier Début Ecrire("donner un entier entre 4 et 20")) Lire(n) Tant que (n<4) ou (n>20) faire Ecrire("donner un entier entre 4 et 20 ")) Lire(n) Fin tant que retourner n Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
n | entier |
La fonction verif_operation
Cette fonction vérifie l'opération saisie est sur la forme "Nbre1 op Nbre2 = ?".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
fonction verif_operation(ch:chaine):booleen Début i<-0 nbr1<-'' # verifier que la chaine se termine par les deux symboles "=" et "?" Si ch[long(ch)-2]='=' et ch[long(ch)-1]='?' : # verifier que Nbr1 est un nombre Tant que (i<long(ch)-1) et ('0'<=ch[i]<='9') faire nbr1<-nbr1+ch[i] i<-i+1 Fin tant que # verifier que Nbr1 est un nombre entre 0 et 30 Si 0<=Valeur(nbr1)<=30 alors # verifier que Op est un operateur de la liste(+, -, *)) Si ch[i] dans ('+','-','*') alors i<-i+1 nbr2<-'' # verifier que Nbr1 est un nombre Tant que (i<long(ch)-1) et ('0'<=ch[i]<='9') faire nbr2<-nbr2+ch[i] i<-i+1 Fin tant que # verifier que Nbr1 est un nombre entre 0 et 30 Si 0<=Valeur(nbr2)<=30 alors retourner Vrai Sinon retourner Faux Fin si Sinon retourner Faux Sinon retourner Faux Sinon retourner Faux Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
nbr1 | chaîne des caractères |
nbr2 | chaîne des caractères |
La fonction calcul_operation
Cette fonction calcule et retourne l'opération arthmétique.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
fonction calcul_operation(ch:chaine):entier Début i<-0 nbr1<-'' nbr2<-'' Tant que ('0'<=ch[i]<='9') faire nbr1<-nbr1+ch[i] i<-i+1 Fin tant que op<-ch[i] i<-i+1 Tant que ('0'<=ch[i]<='9'): nbr2=nbr2+ch[i] i<-i+1 Fin tant que Selon op faire cas '+': retourner Valeur(nbr1)+Valeur(nbr2) cas '-': retourner Valeur(nbr1)-Valeur(nbr2) cas '*': retourner Valeur(nbr1)*Valeur(nbr2) Fin selon Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
nbr1 | chaîne des caractères |
nbr2 | chaîne des caractères |
La procédure remplir
Cette procédure remplit les deux tableaux T1 et T2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
procedure remplir(@t1:tab1;;@t2:tab2;n:entier) Début Pour i de 0 à n-1 faire # remplir T1 par des operations de la forme "Nbre1 op Nbre2 = ?" Ecrire("donner operation N°"+i+" sous forme nbr1 op nbr2=?: ") Lire(t1[i]) Tant que (verif_operation(t1[i])=Faux) faire Ecrire("donner operation N°"+i+" sous forme nbr1 op nbr2=?: ") Lire(t1[i]) Fin tant que # Mettre le résultat de l'opération contenue dans T1[i] dans T2[i] t2[i]=calcul_operation(t1[i]) Fin pour Fin |
Déclaration des objets
Objet | Type / Nature |
---|---|
i | entier |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
from numpy import array import random t1=array([str]*100) # declaration du tableau des operations t2=array([int()]*100) # declaration du tableau des resultats des operation def saisie_taille(): n=int(input("donner la taille du tableau entre 4 et 20: ")) while (n<4) or (n>20): n=int(input("donner la taille du tableau entre 4 et 20: ")) return n def verif_operation(ch): i=0 nbr1='' if ch[len(ch)-2]=='=' and ch[len(ch)-1]=='?' : while (i<len(ch)-1) and ('0'<=ch[i]<='9'): nbr1=nbr1+ch[i] i=i+1 if 0<=int(nbr1)<=30 : if ch[i] in ('+','-','*'): i=i+1 nbr2='' while (i<len(ch)-1) and ('0'<=ch[i]<='9'): nbr2=nbr2+ch[i] i=i+1 if 0<=int(nbr2)<=30 : return True else: return False else: return False else: return False else: return False def calcul_operation(ch): i=0 nbr1='' nbr2='' while ('0'<=ch[i]<='9'): nbr1=nbr1+ch[i] i=i+1 op=ch[i] i=i+1 while ('0'<=ch[i]<='9'): nbr2=nbr2+ch[i] i=i+1 match op : case '+': return int(nbr1)+int(nbr2) case '-': return int(nbr1)-int(nbr2) case '*': return int(nbr1)*int(nbr2) def remplir(t1,t2,n): # remplir le tableau des noms for i in range (n) : t1[i]=input("donner operation N°"+str(i)+" sous forme nbr1 op nbr2=?: ") while (verif_operation(t1[i])==False): t1[i]=input("donner operation N°"+str(i)+" sous forme nbr1 op nbr2=?: ") t2[i]=calcul_operation(t1[i]) #programme principal n=saisie_taille() remplir(t1,t2,n) essai=int(input("Donner le resulat de l'operation "+t1[random.randint(0,n-1)]+" : ")) if essai==t2[3] : print('Authentification valide') else: print('Authentification invalide') |
Exécution du programme:
Pour créer une application en Python et Designer QT afin de gérer le suivi de la vaccination contre le COVID-19, on va suivre ces étapes:
a- Ouvrez Qt Designer et créez un nouveau fichier de type Main Window.
b- Ajoutez ces widgets:
QLabel
nommé 'msg' pour afficher des messages d'erreur.
QLineEdit
nommé 'ch' pour entrer les opérations arithmétiques
QPushButton
nommé 'remplir_bt' pour mettre les opérations arithmétiques dans le tableau T1 et leurs résultats dans le tableau T2.
QLabel
nommé 'tabt1_label' pour contenir les opérations arithmétiques
QLabel
nommé 'tabt2_label' pour contenir les résultats des opérations arithmétiques
QPushButton
nommé 'captcha_bt' pour choisir aléatoirement une opération du tableau T1.
QLabel
nommé 'affichage_captcha' pour contenir l'opération choisie.
QLineEdit
nommé 'essai' pour entrer la réponse de l'opération arithmétique.
QPushButton
nommé 'verifier_bt' pour vérifier la réponse saisie par l'utilisateur est valide.
QLabel
nommé 'resulat' pour contenir le résultat de la vérification .
Enregistrez le fichier avec l'extension .ui
, par exemple tabtab-3.ui
.
Voici un exemple de script Python qui utilise l'interface graphique générée par Qt Designer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
from PyQt5.uic import loadUi from PyQt5.QtWidgets import QApplication import random from numpy import array t1=array([str]*100) # declaration du tableau des operations t2=array([int()]*100) # declaration du tableau des resultats des operation app = QApplication([]) windows = loadUi ("tabtab-2.ui") # Fonction qui supprime des espaces de la chaine des carcatères def supprimer_espaces (ch) : while(ch[0]==' '): # elimnier tous les espaces au début de la chaine ch=ch[1:len(ch)] while(ch[len(ch)-1]==' '): # elimnier tous les espaces a la fin de la chaine ch=ch[0:len(ch)-1] while (ch.find(' ')>0): ch=ch.replace(" ", " ") # remplacer les doubles espaces apar un seul espace return ch def verif_operation(ch): i=0 nbr1='' if ch[len(ch)-2]=='=' and ch[len(ch)-1]=='?' : while (i<len(ch)-1) and ('0'<=ch[i]<='9'): nbr1=nbr1+ch[i] i=i+1 if 0<=int(nbr1)<=30 : if ch[i] in ('+','-','*'): i=i+1 nbr2='' while (i<len(ch)-1) and ('0'<=ch[i]<='9'): nbr2=nbr2+ch[i] i=i+1 if 0<=int(nbr2)<=30 : return True else: return False else: return False else: return False else: return False def calcul_operation(ch): i=0 nbr1='' nbr2='' while (i<len(ch)-1) and ('0'<=ch[i]<='9'): nbr1=nbr1+ch[i] i=i+1 op=ch[i] i=i+1 while (i<len(ch)-1) and ('0'<=ch[i]<='9'): nbr2=nbr2+ch[i] i=i+1 match op : case '+': return int(nbr1)+int(nbr2) case '-': return int(nbr1)-int(nbr2) case '*': return int(nbr1)*int(nbr2) # Procedure qui remplit les deux tableaux T1 et T2 def createTabT1T2(): windows.tabt1_label.clear() windows.tabt2_label.clear() windows.msg.clear() global n #pour la taile des tableaux ch = windows.ch.text() if ch=="": windows.msg.setText("Veuillez remplir la chaîne") else: windows.msg.clear() # effacer le message d erreur ch= supprimer_espaces(ch) i=0 j=0 ch1='' # parcourir les caracteres de la chaine CH1 verifoperation=True while (i<len(ch)) and (verifoperation) : if (ch[i]!=' '): ch1=ch1+ch[i] if ((ch[i]==' ') or (i==len(ch)-1)) : # remplir le tableau T1 par les operations t1[j]=ch1 if verif_operation(t1[j]): # calcul le resulatat de l'operation t2[j]=calcul_operation(t1[j]) else: verifoperation=False ch1='' j=j+1 i=i+1 if (i==len(ch)) and verifoperation : if 4<=j<=30: n=j # pour la taille des deux tableaux tab1='' tab2='' for k in range (j) : tab1=tab1+ 't1['+str(k)+']= '+t1[k]+ '\n' tab2=tab2+ 't2['+str(k)+']= '+str(t2[k])+ '\n' #afficher les elements du tableau windows.tabt1_label.setText(tab1) windows.tabt2_label.setText(tab2) else: windows.msg.setText("la taille du tableau doit etre entre 4 et 30") else: windows.msg.setText("donner les operateurs sous forme 'nbr1 op nbr = ?' avec nbr1 et nbr2 entre 0 et 30") def afficher_captcha(): global numero_operation numero_operation=random.randint(0,n-1) windows.affichage_captcha.setText("Donner le resulat de l'operation "+t1[numero_operation]+" : ") def verifier(): essai = int (windows.essai.text()) if essai==t2[numero_operation] : windows.resultat.setText('Authentification valide') else: windows.resultat.setText('Authentification invalide') windows.remplir_bt.clicked.connect ( createTabT1T2 ) windows.captcha_bt.clicked.connect ( afficher_captcha ) windows.verifier_bt.clicked.connect ( verifier ) windows.show() app.exec_() |
Exécution du programme
1) Remplissage du tableau T1 et T2
2) Afficher l'opération arithmétique à tester
3) Saisir la réponse de l'utilisateur et retourner le résultat de la vérification.
Vous pouvez voir aussi :
La robotique éducative joue un rôle important dans l'éducation des enfants et des jeunes en les aidant à acquérir des compétences en science et technologie.
Dans ce cadre notre site web représente une excellente ressource pour les parents, les enseignants et les enfants qui souhaitent découvrir la robotique.
Zaouiet Kontech-Jemmel-Monastir-Tunisie
+216 92 886 231
medaliprof@gmail.com
Site robotique réalisé par Mohamed Ali-Prof Info