Instructions pour le Concours EAE SIN 3
Instructions pour le Concours EAE SIN 3
SESSION 20 23
____
AGRÉGATION
CONCOURS EXTERNE
Durée : 6 heures
____
Calculatrice autorisée selon les modalités de la circulaire du 17 juin 2021 publiée au BOEN du 29
juillet 2021.
L’usage de tout ouvrage de référence, de tout dictionnaire et de tout autre matériel électronique est
rigoureusement interdit.
Il appartient au candidat de vérifier qu’il a reçu un sujet complet et correspondant à l’épreuve à laquelle
il se présente.
Si vous repérez ce qui vous semble être une erreur d’énoncé, vous devez le signaler très lisiblement sur
votre copie, en proposer la correction et poursuivre l’épreuve en conséquence. De même, si cela vous conduit à
formuler une ou plusieurs hypothèses, vous devez la (ou les) mentionner explicitement.
NB : Conformément au principe d’anonymat, votre copie ne doit comporter aucun signe distinctif, tel que
nom, signature, origine, etc. Si le travail qui vous est demandé consiste notamment en la rédaction d’un
projet ou d’une note, vous devrez impérativement vous abstenir de la signer ou de l’identifier.
Le fait de rendre une copie blanche est éliminatoire
Vous trouverez ci-après les codes nécessaires vous permettant de compléter les rubriques
figurant en en-tête de votre copie
Ces codes doivent être reportés sur chacune des copies que vous remettrez.
Présentation
Flex-e-Trans est un prototype futuriste de système de transport à la demande avec des véhicules
électriques et autonomes. Ce système est à mi-chemin entre les taxis individuels et les transports
collectifs de masse. Comme les taxis individuels, il propose un service de porte à porte aux passagers.
Comme les transports collectifs, les passagers acceptent de partager une partie de leur itinéraire avec
d’autres, la contrepartie étant un coût moins élevé que les taxis individuels. Le système tire profit
de toutes les avancées dans la mobilité électrique, les communications sans fil, l’internet haut débit,
les transports autonomes, etc. Les véhicules roulent en conditions urbaines normales (pas de site
propre), et peuvent souffrir de la congestion comme tout autre véhicule.
Le service de mobilité est exploité par un opérateur public ou privé. Cet opérateur dispose d’une
flotte de véhicules électriques autonomes de deux types :
• adaptés aux Personnes à Mobilité Réduite (PMR dans la suite) ;
• véhicules de tourisme non-adaptés aux PMR.
L’opérateur dispose d’un dépôt dans lequel les véhicules peuvent être stockés. Le dépôt est également
équipé de bornes de recharge des véhicules. Tous les véhicules démarrent et terminent leurs courses
dans ce dépôt.
Les objectifs de Flex-e-Trans sont de :
• réduire la congestion routière en permettant le partage de trajets et l’augmentation des taux
de remplissage des véhicules en circulation ;
• favoriser l’intermodalité et l’usage des transports collectifs, puisque le service de Flex-e-Trans
peut servir comme un service de rabattement vers les transports en commun ;
• résoudre le problème du premier et du dernier kilomètre, qui sont parmi les raisons de la
préférence de la voiture privée ;
• améliorer l’accessibilité à moindre coût pour les PMR.
Le système est composé de :
• une application Web ou mobile destinée aux passagers ;
• une application Web destinée aux administrateurs du système ;
• une application serveur permettant la communication avec les véhicules, l’optimisation des
missions des véhicules, l’intégration des nouvelles demandes en temps-réel et la supervision
des missions en cours.
L’opérateur dispose des ressources suivantes :
• une flotte de véhicules de deux types (adaptés aux PMR ou non) ;
• un dépôt pouvant contenir l’ensemble de la flotte, et équipé de bornes de recharge permettant
de recharger en charge rapide un quart de la flotte de véhicules simultanément.
Dans un dépôt central se trouve un ensemble de véhicules avec des niveaux de charge différents.
Certains sont en train d’être chargés, d’autres non. Les missions des véhicules autonomes sont
composées d’un ensemble d’adresses à visiter, avec des horaires de passage estimés selon l’état du
trafic courant. Ces missions sont continuellement mises à jour avant le démarrage de la mission, et
éventuellement pendant l’exécution de celle-ci.
Un client (qui ne sera pas nécessairement le passager) peut à tout moment se connecter au système
et demander un trajet en fournissant les informations suivantes :
• l’adresse d’origine et l’adresse de destination ;
• les informations sur le passager (PMR ou non) ;
B
Page 2 Tournez la page S.V.P.
• l’horaire de départ au plus tôt à l’adresse d’origine et l’horaire d’arrivée au plus tard à l’adresse
de destination.
Un code QR qui permet l’accès du passager au véhicule lui est alors est délivré.
La figure 1 représente le système Flex-e-Trans. Les étiquettes des arêtes pleines représentent le
temps de parcours courant. Les arcs en pointillés représentent l’origine et la destination du passager.
L’horaire associé aux passagers au nœud de départ est l’horaire de départ au plus tôt. L’horaire
associé au nœud d’arrivée représente l’horaire d’arrivée au plus tard. Les nœuds peuvent être des
carrefours, ou des points de collecte et de dépose des passagers.
≤09:15
15 a
dépôt h
20
≥09:55
10 ≤11:00
8 c
9
b
≥10:20
15 20
5
15
d e 25
10 15 ≤11:00 g
≥08:30
f
Le système d’optimisation a pour objectifs de prévoir et ajuster les trajets, en respectant les con-
traintes horaires des clients, tout en minimisant la distance parcourue par les véhicules, ainsi que le
nombre de véhicules utilisés. Le système prend aussi en compte les contraintes liées à la recharge
des véhicules électriques.
L’épreuve se décompose en trois parties distinctes et indépendantes :
• la partie 1 est relative à la conception du système d’information et au mode d’accès par code
QR aux véhicules ;
• la partie 2 traite de certaines parties matérielles et des protocoles réseau des unités mobile ;
• la partie 3 traite de l’algorithme d’optimisation des missions des véhicules.
Q3. Donner la requête SQL (SELECT) qui permet de récupérer (uniquement) tous les couples
latitude / longitude des points de départs des trajets que John Smith (identifié par son
email [email protected]) a déjà réalisé (les trajets planifiés ou en cours ne doivent
donc pas être inclus).
Q4. Donner la requête SQL (SELECT) qui permet de récupérer toutes les informations sur le
prochain (au sens de l’horaire de départ) trajet planifié par un client, à partir de son email.
La requête ne devra donc donner qu’une seule réponse au maximum, contenant exactement
6 colonnes : les coordonnées géographiques et les horaires des points de départ et d’arrivée.
Afin de garder une base de code facile à maintenir, et plutôt que d’utiliser un ORM (Object-Relational
Mapping), on décide de regrouper toutes les fonctions d’accès à la base de données dans une classe
nommée Database du module database.
Des extraits de plusieurs modules (dont le module database) sont donnés dans le document tech-
nique DT2.
Q5. En s’inspirant de la méthode Database.get_hashed_password, donner le code de la
méthode Database.get_client_name_from_email (prototype visible dans le DT2).
Q12. Sur le document réponse DR4, compléter la fonction check_sign du module outils qui
prend en paramètre des données signées, et indique en renvoyant un booléen si la signature
est valide.
Q16. Le type d’une trame NMEA 0183 est donné par 3 caractères contenus dans la trame. Parmi
les types présentés dans le document DT7, quel est celui qui sera utilisé pour récupérer la
position du véhicule ?
Q17. Quels sont les deux caractères manquants à la fin de la trame donnée ci-dessous ? Une table
ASCII est donnée dans le document technique DT8.
$GPGSA,A,3,06,07,16,20,14,,,24,,07,,,2.5,1.3,2.1*
Le microcontrôleur qui gère le système eCall est programmé en langage C. Il a pour fonction de
détecter, par le biais de différents capteurs (coussin auto-gonflant etc.) un éventuel accident, et
prévient les secours dans ce cas. Parmi les tâches qui lui incombent, figurent la lecture des trames
NMEA 0183 qui émanent du module GPS (lecture sur le port série) et le décodage de ces trames,
de manière à accéder à la latitude, à la longitude, et à l’horodatage.
typedef struct {
float latitude, longitude;
int heures, minutes;
float secondes;
} position;
Vecteurs de Position
À plusieurs niveaux, il est nécessaire de décrire une position géographique :
1. une station peut informer les stations environnantes de sa position, en utilisant un Long
Position Vector ou un Short Position Vector
2. une zone peut être ciblée, en donnant un point ou une aire géographique (possibilité offerte
dans l’entête des trames GeoNetworking)
La structure des Long Position Vectors est donnée dans le document technique DT10.
Q20. Le champs TST propose un horodatage des données de position. Du fait du nombre de bits
utilisés pour encoder ce champs, la valeur TST cycle et repasse régulièrement par la valeur 0.
Avec quelle période, exprimée en jours, ce phénomène se produit-il ?
Trames GeoNetworking
L’entête des trames GeoNetworking est décrit dans le document technique DT11.
Q21. En supposant que l’unité est la seconde, si le champ LT de l’entête code un nombre entier
sur un octet, quelle est la durée maximum représentable (vmax) et quelle est la plus petite
durée non nulle représentable (vmin) ?
Afin d’avoir une meilleure résolution sur les petites valeurs, LT utilise un encodage non linéaire qui
n’est pas détaillé dans les documents techniques, mais uniquement ci-après :
• les 6 bits de poids fort de LT représentent un nombre entier nommé multiplieur
• les 2 bits de poids faible de LT encodent la base :
La valeur encodée est obtenue en faisant le produit entre multiplieur et valeur base. Par exemple, le
code LT=14 (0b00001110) correspond à un multiplieur égal à 3 (0b000011) et à une valeur base
égale à 10 s (code base égale à 2, 0b10). La durée encodée par LT=14 correspond donc à une durée
de 30 secondes (3 × 10 s).
Q22. En utilisant ce codage, quelles sont les nouvelles valeurs de vmin et vmax ? Quels octets
(donner des nombres entiers en base 10) permettent de représenter ces deux valeurs ex-
trêmes ?
ℝ2 → ℝ
{
(𝑥𝑥𝑥𝑥𝑥𝑥 𝑥 𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥𝑥
telle que :
• 𝐹𝐹 𝐹𝐹𝐹𝐹𝐹𝐹𝐹 𝐹 𝐹 si 𝑀𝑀 𝑀𝑀𝑀𝑀 𝑀𝑀𝑀 𝑀𝑀𝑀
• 𝐹𝐹 𝐹𝐹𝐹𝐹𝐹𝐹𝐹 𝐹 𝐹 si 𝑀𝑀 𝑀𝑀𝑀𝑀 𝑀𝑀𝑀 appartient au disque ouvert de centre 𝐶𝐶 et de rayon 𝑟𝑟
• 𝐹𝐹 𝐹𝐹𝐹𝐹𝐹𝐹𝐹 𝐹 𝐹 si 𝑀𝑀 𝑀𝑀𝑀𝑀 𝑀𝑀𝑀 appartient au cercle de centre 𝐶𝐶 et de rayon 𝑟𝑟
• 𝐹𝐹 𝐹𝐹𝐹𝐹𝐹𝐹𝐹 𝐹 𝐹 si 𝑀𝑀 𝑀𝑀𝑀𝑀 𝑀𝑀𝑀 n’appartient pas au disque fermé de centre 𝐶𝐶 et de rayon 𝑟𝑟
Q23. Proposer une fonction 𝐹𝐹 qui satisfait ces conditions.
L’algorithme de routage Simple Geobroadcast Forwarding Algorithm est donné dans le document
technique DT12. Il est accompagné d’un algorithme nommé Greedy Forwarding algorithm.
Q24. Sur le document réponse DR7, sont représentés différents nœuds d’un réseau GeoNetworking.
La distance entre chaque nœud est donnée par un tableau du document DR7. Une trame
GeoBroadcast (figure 4) est émise depuis le nœud LPV, à destination d’une zone de rayon
3, centrée autour de A. Quel sera le trajet suivi par la trame pour atteindre le premier nœud
destination si elle est routée en utilisant les algorithmes du document DT12, en supposant
que le voisinage correspond à une distance de 4 ? Autrement dit, (i.IS_NEIGHBOUR) est
vrai si le point i est à une distance inférieure ou égale à 4 du point considéré. Indiquer
clairement la liste des nœuds par lesquels l’information transite et expliquer la construction
du tracé.
Q25. La solution obtenue avec les algorithmes du DT12 est-elle optimale en nombre de sauts ?
Si ce n’est pas le cas, trouver un trajet optimal de LPV à sa destination.
Q26. Dans le document DT12, l’algorithme nommé GF ALGORITHM est qualifié de glouton (greedy
en anglais). Pour quelle raison (texte libre, moins de 10 lignes) ?
Q27. Pour quelle(s) raison(s) (texte libre, moins de 10 lignes) le protocole IP n’est-il pas suffisant
pour assurer les services de la couche réseau et en quoi le protocole GeoNetworking permet-il
de régler ce problème ?
Q29. Donner en pseudo-code un algorithme permettant de calculer le chemin le plus rapide entre
un nœud particulier 𝑣𝑣⋆ et tous les autres nœuds du graphe, suivant le temps de parcours
courant. Quelle est la complexité temporelle de l’algorithme proposé ?
L’algorithme permettant d’insérer une nouvelle requête (collecte et dépose d’un passager) dans les
missions des véhicules) est nommé insertion_missions.
Cet algorithme utilise une fonction nommée insertion(r,veh) qui insère la requête r d’un nouveau
client dans le plan du véhicule particulier veh, et renvoie le temps de parcours additionnel pour veh
suite à l’insertion de cette requête. La fonction insertion(r,veh) renvoie l’infini si la requête ne
peut pas être insérée sans violer les contraintes temporelles, ou si le véhicule est inadapté (véhicule
non adapté pour une personne à mobilité réduite par exemple). Dans la suite, on supposera la
pré-existence de cette fonction insertion(r,veh).
Lorsqu’un passager demande à être transporté d’une origine à une destination, l’ensemble
des véhicules (ceux au dépôt comme ceux en circulation) est inspecté par l’algorithme
insertion_missions : À l’aide de la fonction insertion, chaque véhicule essaie d’insérer
le point de départ, puis le point de destination dans son parcours. Les itinéraires entre chaque
couple de nœuds de la mission sont calculés suivant le chemin le plus rapide. Si l’insertion
est possible sans violer les contraintes temporelles du nouveau passager, ni celles des éventuels
passagers déjà planifiés ou à bord, le véhicule calcule le détour résultant de l’insertion du nouveau
L’heuristique d’insertion insertion_missions est rapide mais « myope ». Cela signifie que
l’apparition ultérieure d’une requête de passager peut rendre la précédente insertion sous-optimale.
Q31. Proposer une idée de modification de l’algorithme insertion_missions, qui serait plus
efficace selon vous en limitant sa myopie (argumenter).
Pendant l’exécution des missions des véhicules, un écart peut être observé entre le plan et la réalité
du terrain. Cet écart peut être plus ou moins important selon que cela rend invalides les missions
ou non (violation des contraintes temporelles des véhicules). Trois cas sont identifiés, exigeant
potentiellement un recalcul de certaines missions :
1. une congestion (augmentation des temps de parcours) ;
2. une panne d’un véhicule autonome ;
3. une annulation de requête.
Q32. Décrire (en texte libre, moins de 10 lignes) une solution permettant de déterminer si un
re-calcul de missions est nécessaire ou non dans chacun des trois cas précédents.
Q33. Proposer une solution (description en texte libre, moins de 10 lignes) permettant de recalculer
les missions en cas de congestion. On ne considère que les requêtes qui ne sont pas en cours
d’exécution (i.e. on ne considère pas les passagers à bord des véhicules).
Q34. Proposer une solution (description en texte libre, en moins de 10 lignes) permettant de
recalculer les missions en cas de panne.
Q35. Proposer une solution (description en texte libre, en moins de 10 lignes) permettant de
recalculer les missions en cas d’annulation de requête.
Supposons que l’on dispose de données historique de trafic associant à chaque arc un minimum et
un maximum de temps de parcours observé.
Q36. Proposer une manière d’intégrer cette information dans l’algorithme insertion(r, veh),
pour minimiser les recalculs d’itinéraires à cause de la congestion (description en texte libre
en moins de 10 lignes).
L’utilisation de véhicules autonomes a l’avantage d’éviter les coûts associés aux conducteurs. Il est
donc envisageable que des véhicules attendent, non pas dans le dépôt, mais dans des places de
stationnement quelque part dans la ville.
Q37. Comment peut-on utiliser cette possibilité pour améliorer l’efficacité du système
d’optimisation ?
La recharge des véhicules est une question importante dans un système d’électromobilité.
Q38. Proposer au moins deux idées pour optimiser l’autonomie énergétique des véhicules. Quels
véhicules recharger au dépôt et quand ?
Page 14
EAE SIN 3
Documents techniques
DT1 : Exemples de requêtes SQL sur une base de données fictive
C
Page 15 Tournez la page S.V.P
module database.py
class Database:
"""
Utilisation de la base de données Flex-e-trans,
"""
def __init__(self, type_: int, params: dict):
"""
:param type_: 0 pour sqlite, 1 pour mariadb
:param params: dict. contenant les informations de connection
pour sqlite3
{'filename' : <nom_fichier> }
pour mariadb
{'host': <host>, 'database': <dbname>, 'username': <user>,
'password': <password>}
"""
self.type: int = type_
self.params: dict = params
self.is_connected: bool = False
def _connect(self):
...
self.is_connected = True
Page 16
def get_hashed_password(self, email: str) -> str:
"""
Récupération du mot de passe haché stocké dans la base à partir
de l'email
"""
req = "SELECT password FROM Client where email=?"
res = self._select(req, (email,))
if not res:
raise DatabaseValueError("Utilisateur inconnu")
if len(res) > 1:
raise DatabaseValueError("Utilisateur en double")
return res[0][0] # Renvoie le 1er champ de la 1ère ligne
Page 17 Tournez
Tournezlalapage
pageS.V.P.
S.V.P
module course_client.py
class CourseClient:
@classmethod
def from_bytes(cls, b: bytes) -> "CourseClient":
...
def create_qr_code(self) -> Image:
""" Crée l'image d'un code QR signé à partir des informations
d'un trajet (CourseClient) """
...
Page 18
# suite classe CourseClient
@classmethod
def read_qr_code(cls, img: Image) -> Optional["CourseClient"]:
""" Si l'image du code QR est valide, et que le code QR est
correctement signé, renvoie l'objet CourseClient contenu
dans le code QR. Sinon, renvoie None
"""
...
@dataclass
class Position:
latitude: float
longitude: float
@classmethod
def from_bytes(cls, data: bytes) -> "Position":
lat, long = struct.unpack(">ff", data)
return cls(lat, long)
module outils.py
import random
import hashlib
import datetime
import hmac
import string
from PIL import Image
from typing import Optional, Union, Tuple
SECRET_KEY = bytes.fromhex("043372332e372272153e352f3d2b6760")
Page 19 Tournez
Tournezlalapage
pageS.V.P.
S.V.P
def sign(data: bytes) -> bytes:
""" Renvoie les données signées (données + signature) au format :
- 1 octet pour le type de signature
- 2 octets pour la taille des données
- X octets pour les données
- la signature
"""
sig_type = 1 # Évolution possible vers d'autres signatures
n = len(data)
if n > 0xffff:
raise ValueError("Too large data")
sig = hmac.HMAC(SECRET_KEY, msg=data, digestmod=hashlib.sha256).digest()
return bytes([sig_type, n // 256, n % 256]) + data + sig
Page 20
On nomme fonction de hachage, de l’anglais hash function (hash : pagaille, désordre, recouper et
mélanger) par analogie avec la cuisine, une fonction particulière qui, à partir d’une donnée fournie
en entrée, calcule une empreinte numérique servant à identifier rapidement la donnée initiale, au
même titre qu’une signature pour identifier une personne. Les fonctions de hachage sont utilisées en
informatique et en cryptographie notamment pour reconnaître rapidement des fichiers ou des mots
de passe.
Principe général
Une fonction de hachage est typiquement une fonction qui, pour un ensemble de très grande taille
(théoriquement infini) et de nature très diversifiée, va renvoyer des résultats aux spécifications pré-
cises (en général des chaînes de caractères de taille limitée ou fixe) optimisées pour des applications
particulières. Les chaînes permettent d’établir des relations (égalité, égalité probable, non-égalité,
ordre…) entre les objets de départ sans accéder directement à ces derniers, en général soit pour
des questions d’optimisation (la taille des objets de départ nuit aux performances), soit pour des
questions de confidentialité.
Autrement dit : à 1 fichier (ou à 1 mot) va correspondre une signature unique (le résultat de la
fonction de hachage, soit le hash).
En termes très concrets, on peut voir une fonction de hachage (non cryptographique) comme un
moyen de replier l’espace de données que l’on suppose potentiellement très grand et très peu rempli
pour le faire entrer dans la mémoire de l’ordinateur. En revanche, une fonction de hachage cryp-
tographique est ce que l’on appelle une fonction à sens unique, ce qui veut dire que le calcul de
la fonction de hachage est facile et rapide tandis que le calcul de sa fonction inverse est infaisable
par calcul et donc non calculable en pratique. Grâce à la valeur de hachage (le hash), on peut
discriminer deux objets apparemment proches, ce qui peut être utilisé pour garantir l’intégrité des
objets, autrement dit leur non-modification par une erreur ou un acteur malveillant.
Les algorithmes SHA-1 (Secure Hash Algorithm 1 : 160 bits) et MD5 (Message-Digest algorithm 5,
128 bits, plus ancien et moins sûr, voir figure 6) sont des fonctions de hachage utilisées fréquemment.
Le SHA-2 (SHA-256, SHA-384 ou SHA-512 bits au choix) est d’ores et déjà prêt s’il faut abandonner
aussi le SHA-1.
Page 21 Tournezlalapage
Tournez pageS.V.P.
S.V.P
Fonction de
Hachage
(MD5)
« Renard » 1b481e5ac2a687de752b330bee95ce8a
Fonction de
Hachage
« Le Renard (MD5)
edd709aa11109ba153a6183893e2cb8c
court sur la glace »
Fonction de
Hachage
« Le Renard (MD5)
69ec8ca429f63f2d907ea2cd505329b8
marche sur la glace »
Fonction de
Hachage
Texte intégral de (MD5)
« 20.000 lieues sous 730da858e0c7be81d27d8c0ffacd6b03
les mers » (a)
Fonction de
Texte intégral de Hachage
« 20.000 lieues sous (MD5)
4e9cad9bb7b0db7b37c7364ee39ab8c4
les mers »
Modifié (b)
Figure 6: Exemples de hachages de textes par la fonction MD5; (a) le texte utilisé est la version
libre de Vingt mille lieues sous les mers du projet Gutenberg2 ; (b) la version modifiée est le même
fichier texte, le 10e caractère de la 1000e ligne ayant été remplacé par le caractère *.
méthode simple est de concaténer le mot de passe avec le sel. Le sel n’étant pas identique pour
deux utilisateurs, on obtiendra deux signatures différentes avec le même mot de passe. Cela réduit
fortement la marge d’une attaque via un dictionnaire.
Objectif du salage
Le salage est une méthode permettant de renforcer la sécurité des informations qui sont destinées
à être hachées (par exemple des mots de passe) en y ajoutant une donnée supplémentaire afin
d’empêcher que deux informations identiques conduisent à la même empreinte (la résultante d’une
fonction de hachage). Le but du salage est de lutter contre les attaques par analyse fréquentielle, les
attaques utilisant des rainbow tables (tables arc-en-ciel), les attaques par dictionnaire et les attaques
par force brute. Pour ces deux dernières attaques, le salage est efficace quand le sel (la valeur utilisée
dans le salage) utilisé n’est pas connu de l’attaquant ou lorsque l’attaque vise un nombre important
de données hachées toutes salées différemment.
Initialisation
Le salage consiste à concaténer le mot de passe avec le sel, une chaîne de caractères quelconque, le
plus souvent aléatoire. Le salage peut être statique : chaque mot de passe est salé avec la même
chaîne de caractères (mais ce type de salage est considéré comme dépassé), ou dynamique : chaque
mot de passe est salé aléatoirement (cela empêchera à deux utilisateurs d’avoir la même empreinte
s’ils ont le même mot de passe).
Dans le cas où le salage est dynamique, chaque enregistrement de la table de mots de passe du
système d’authentification peut contenir les trois informations suivantes :
Page 22
identifiant | hachage(sel + mot de passe) | sel
Exemple
Prenons par exemple le mot de passe « Wikipedia », qui utilisé avec l’algorithme de hachage SHA-
256 produit (valeur en hexadécimal) :
d38b38a2dd476e045c299e8ee5d6466834456d97bd592a71746b423a6a05f386.
Utilisons un salage du mot de passe en y ajoutant le sel « S_8u ». En hachant « S_8uWikipedia »,
le hachage est maintenant :
33bf32c0e27f6361d21287df83f19a23c5b2d0e7f25e1899ef8c3621640f8907.
Le hash salé est très différent du hash non salé.
Utilisation
L’utilisateur entre son identifiant et son mot de passe brut. À partir de l’identifiant, le système
d’authentification retrouve la valeur du sel associé, il concatène le sel et mot de passe brut, traite la
chaîne de caractères obtenue par la fonction de hachage cryptographique puis compare le résultat
avec le mot de passe salé et haché enregistré dans la table des mots de passe.
Page 23 Tournezlalapage
Tournez pageS.V.P.
S.V.P
The values 𝑐𝑐, 𝑑𝑑, and 𝑒𝑒 are then looked up [in the following table] to produce a three character string.
The process is reversed when decoding.
For encoding a single byte [𝑎𝑎𝑎, it MUST be interpreted as a base 256 number, i.e. as an unsigned
integer over 8 bits. That integer MUST be converted to base 45 [𝑐𝑐𝑐𝑐𝑐 so that 𝑎𝑎 𝑎 𝑎𝑎 𝑎 𝑎𝑎𝑎 𝑎 𝑎𝑎𝑎.
The values 𝑐𝑐 and 𝑑𝑑 are then looked up in [the following table] to produce a two-character string.
A byte string [𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎 with arbitrary content and arbitrary length MUST be encoded as follows:
From left to right pairs of bytes MUST be encoded as described above. If the number of bytes is
even, then the encoded form is a string with a length that is evenly divisible by 3. If the number
of bytes is odd, then the last (rightmost) byte MUST be encoded on two characters as described
above.
For decoding a Base45 encoded string the inverse operations are performed.
Encoding examples
It should be noted that although the examples are all text, Base45 is an encoding for binary data
where each octet can have any value 0-255.
Encoding example 1: The string "AB" is the byte sequence [[65 66]]. If we look at all 16 bits, we
get 65× 256 + 66 = 16706.
16706 equals 11 +(11 ×45)+(8 ×45×45), so the sequence in base 45 is [11 11 8]. Referring
to [the previous table], we get the encoded string "BB8".
AB Initial string
[[65 66]] Decimal value
[16706] Value in base 16
[11 11 8] Value in base 45
BB8 Encoded string
Page 24
[…]
Encoding example 3: The string "base-45" as ASCII is the byte sequence [[98 97] [115 101]
[45 52] [53]]. If we look at this two bytes at a time, we get [25185 29541 11572 53]. Note
the 53 for the last byte. When looking at the values in base 45, we get [[30 19 12] [21 26
14] [7 32 5] [8 1]] where the last byte is represented by two values. Referring to [the Base45
Alphabet Table], we get the encoded string "UJCLQE7W581".
Decoding examples
Decoding example 1: The string "QED8WEX0" represents, when looked up in [the Base45 Alphabet
Table], the values [26 14 13 8 32 14 33 0]. We arrange the numbers in chunks of three, except
for the last one which can be two numbers, and get [[26 14 13] [8 32 14] [33 0]]. In base
45, we get [26981 29798 33] where the bytes are [[105 101] [116 102] [33]]. If we look at
the ASCII values, we get the string "ietf!".
Décodage :
Page 25 Tournezlalapage
Tournez pageS.V.P.
S.V.P
<trame type> peut prendre (entre autres) une des valeurs suivantes :
• GGA : horodatage, position et informations sur le fix
• GSA : mode opératoire, nombre de satellites utilisés, et valeurs de dilution de précision
• GSV : position (élévation, azimuth…) des satellites visibles
Dans le cas d’une trame GGA, on trouve 14 champs entre GGA et le * annonçant le checksum, séparés
par des virgules :
$GPGGA,064036.289,4836.5375,N,00740.9373,E,1,04,3.2,200.2,M,,,,0000*0E
Page 26
On a ainsi les données sur 4 satellites dans une trame. Le maximum de 3 trames correspond au
maximum de 12 satellites.
0 1 2 3 4 5 6 7 8 9 A B C D E F
0
1
2 ␣ ! ” # $ % & ’ ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9 : , < = > ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ \ ] ^ _
6 ‘ a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { ∣ } ~
Page 27 Tournez
Tournezlalapage
pageS.V.P.
S.V.P
Certaines valeurs possible pour le champs ITS Country Code sont données dans le tableau suivant :
| 0 | 1 | 2 | 3 |
| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 |
+-----------------+-----------------+-----------------+-----------------+
0 | GN_ADDR |
4 | |
+-----------------+-----------------+-----------------+-----------------+
8 | TST |
+-----------------+-----------------+-----------------+-----------------+
12 | Latitude |
+-----------------+-----------------+-----------------+-----------------+
16 | Longitude |
+-----------------+-----------------+-----------------+-----------------+
20 | S | H |
+-----------------+-----------------+-----------------+-----------------+
24 | Alt | TAcc | PosAcc | SAcc | HAcc |Acc|
+-----------------+-----------------+-----------------+-----------------+
Page 28
DT11 : Entête étendu GeoNetworking
Dans cette description, le bit 0 est le bit de poids fort.
| 0 | 1 | 2 | 3 |
| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 |
+-----------------+-----------------+-----------------+-----------------+
0 |Version | NH | HT | HST | Reserved | Flags |
+-----------------+-----------------+-----------------+-----------------+
4 | PL | TC | HL |
+-----------------+-----------------+-----------------+-----------------+
8 | |
...| SE PV |
32 | |
+-----------------+-----------------+-----------------+-----------------+
36 | SN | LT | Reserved |
+-----------------+-----------------+-----------------+-----------------+
40 | |
...| SO PV |
64 | |
+-----------------+-----------------+-----------------+-----------------+
68 | GeoAreaPos Latitude |
+-----------------+-----------------+-----------------+-----------------+
72 | GeoAreaPos Longitude |
+-----------------+-----------------+-----------------+-----------------+
76 | Distance a | Distance b |
+-----------------+-----------------+-----------------+-----------------+
80 | Angle | Reserved |
+-----------------+-----------------+-----------------+-----------------+
Si la zone ciblée est un cercle (HST à 0), Distance a vaut le rayon du cercle, Distance b et Angle
Page 29 Tournezlalapage
Tournez pageS.V.P.
S.V.P
sont à zéro et la latitude et la longitude données sont le centre du cercle.
The algorithm utilizes the function 𝐹𝐹 𝐹𝐹𝐹𝐹 𝐹𝐹𝐹 to determine whether the GeoAdhoc router is located
inside, at the border or outside the geographical target area carried in the GeoBroadcast packet
header. If the GeoAdhoc router is inside or at the border of the area, the packet shall be re-
broadcasted. If it is outside the area, the packet shall be forwarded by the Greedy Forwarding
algorithm (GF Algorithm).
With the Greedy Forwarding (GF) algorithm, the GeoAdhoc router uses the location information of
the destination carried in the GeoUnicast packet header and selects one of the neighbours as the
next hop. The algorithm applies the most forward within radius (MFR) policy, which selects the
neighbour with the smallest geographical distance to the destination, thus providing the greatest
progress when the GeoUnicast packet is forwarded.
If no neighbour with greater progress than the local GeoAdhoc router exists, the packet has reached
a local optimum.
Page 30
GF ALGORITHM
==============
-- P is the GeoUnicast packet to be forwarded
-- i is the i-th LocTE
-- NH is the LocTE identified as next hop
-- NH_LL_ADDR is the link layer address of the next hop
-- LPV is the local position vector
-- PVp is the destination position vector in the GeoNetworking
-- packet to be forwarded
-- PVi is the position vector of the i-th LocTE
MFR = DIST(PVp, LPV)
FOR (i ∈ LocT)
IF (i.IS_NEIGHBOUR) THEN
IF (DIST(PVp, PVi) < MFR) THEN
NH ← i
MFR ← DIST(PVp, PVi)
ENDIF
ENDIF
ENDFOR
IF (MFR < DIST(PVp, LPV)) THEN
SET NH_LL_ADDR = NH.LL_ADDR
ELSEIF
LOCAL OPTIMUM
SET NH_LL_ADDR = 0
ENDIF
Nom de famille :
(Suivi, s’il y a lieu, du nom d’usage) $$$$$$$$$$$$$$$$$$$$$$$
Prénom(s) :
$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$ Né(e) le : $$/$$/$$$$
Numéro
Inscription :
(Le numéro est celui qui figure sur la convocation ou la feuille d’émargement)
(Remplir cette partie à l’aide de la notice)
Concours / Examen : ……………………………….. Section/Spécialité/Série : ………………………………………………………
EAE SIN 3
DR1 à DR5
DOCUMENTS RÉPONSES :
Tous les documents réponses sont à rendre,
même non complétés.
D
Tournez la page S.V.P.
NE RIEN ECRIRE DANS CE CADRE
# dans outils.py
def hash_with_salt(salt: str, password: str) -> str:
"""
>>> hash_with_salt("S_8u", "Wikipedia")
Document réponse DR1
'S_8u:33bf32c0e27f6361d21287df83f19a23c5b2d0e7f25e1899ef8c3621640f8907'
"""
b_password
# dans outils.py= password.encode("utf8")
b_salt = ..........................
def hash_with_salt(salt: str, password: str) -> str:
hashed_password
""" = hashlib.sha256(b_salt + ..........).hexdigest()
return salt + ":" + ........................
>>> hash_with_salt("S_8u", "Wikipedia")
'S_8u:33bf32c0e27f6361d21287df83f19a23c5b2d0e7f25e1899ef8c3621640f8907'
# dans
"""database.py
class Database:= password.encode("utf8")
b_password
b_salt = ..........................
def store_password(self,
hashed_password client_email: str,
= hashlib.sha256(b_salt password: str) -> bool:
+ ..........).hexdigest()
salt = outils.random_chars(16)
return salt + ":" + ........................
return self.update_pwd(client_email, ..............................)
# dans database.py
class Database:
class Database:
Page 32
Document réponse DR3
class CourseClient:
@classmethod
def from_bytes(cls, b: bytes) -> "CourseClient":
"""
Méthode de classe qui renvoie un nouvel objet `CourseClient`
à partir de sa représentation compacte
"""
course, client = struct.unpack(">ii", b[:8])
pos_depart = Position.from_bytes(......................)
h_depart = ........................
pos_arrivee = .....................
h_arrivee = .......................
heure_depart = datetime.datetime(*h_depart)
heure_arrivee = datetime.datetime(*h_arrivee)
return cls(..............................)
Page 33 Tournez
Tournezlalapage
pageS.V.P.
S.V.P
Document réponse DR5
def to_b45(a: int, b: Optional[int]=None) -> Union[Tuple[int, int],
Tuple[int, int, int]]:
if b is None:
n = a
c, d = n % 45, n // 45
return (c, d)
else:
.........................................................
.........................................................
.........................................................
.........................................................
return (c, d, e)
Page 34
Modèle CMEN-DOC v2 ©NEOPTEC
Nom de famille :
(Suivi, s’il y a lieu, du nom d’usage) $$$$$$$$$$$$$$$$$$$$$$$
Prénom(s) :
$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$ Né(e) le : $$/$$/$$$$
Numéro
Inscription :
(Le numéro est celui qui figure sur la convocation ou la feuille d’émargement)
(Remplir cette partie à l’aide de la notice)
Concours / Examen : ……………………………….. Section/Spécialité/Série : ………………………………………………………
EAE SIN 3
DR6 - DR7
DOCUMENTS RÉPONSES :
Tous les documents réponses sont à rendre,
même non complétés.
E
Tournez la page S.V.P.
NE RIEN ECRIRE DANS CE CADRE
A B C D E F G H
A 10.7 13.0 12.8 9.4 10.0 9.4 5.7
B 10.7 5.2 2.1 1.6 2.9 4.9 6.6
C 13.0 5.2 4.8 6.5 3.3 3.8 7.5
D 12.8 2.1 4.8 3.6 4.0 6.0 8.4
E 9.4 1.6 6.5 3.6 3.6 5.3 6.0
F 10.0 2.9 3.3 4.0 3.6 2.1 4.8
G 9.4 4.9 3.8 6.0 5.3 2.1 3.8
H 5.7 6.6 7.5 8.4 6.0 4.8 3.8
I 7.4 4.3 8.8 6.3 2.7 5.6 6.7 5.7
J 8.9 4.3 9.3 6.0 2.9 6.4 7.8 7.3
K 2.8 7.9 10.6 10.0 6.6 7.4 7.2 3.8
L 7.0 6.7 11.3 8.5 5.1 8.1 9.0 7.3
M 6.1 6.0 10.3 8.1 4.5 7.0 7.8 5.9
N 2.2 11.9 13.4 13.9 10.8 10.6 9.6 5.9
O 1.0 11.3 13.9 13.5 10.0 10.8 10.3 6.6
P 2.2 11.3 14.4 13.5 9.9 11.2 10.9 7.4
LPV 14.1 3.8 3.7 2.0 5.4 4.5 6.2 9.3