Sécurisation des communications
Numérique et sciences informatiques

Qu’est ce que la sécurité ?
La sécurité détermine les parties critiques à protéger et les risques sur le réseau.
Principes généraux
La cryptographie est une des disciplines de la cryptologie s'attachant à protéger des messages (assurant confidentialité, authenticité et intégrité) en s'aidant de clés. Elle se distingue de la stéganographie qui fait passer inaperçu un message dans un autre message alors que la cryptographie rend un message supposément inintelligible à autre que qui-de-droit.
Elle est utilisée depuis l'Antiquité, mais certaines de ses méthodes les plus modernes, comme la cryptographie asymétrique, datent de la fin du xxe siècle.
Sécuriser un réseau, c'est assurer :
- La confidentialité des données (et des acteurs) de la communication ;
- L'authenticité des données de la communication en vérifiant l’identité des acteurs ;
- l'intégrité des données en vérifiant qu'elles n’ont pas été altérées ;
- La disponibilité de la communication
- la "non-répudiation" : les acteurs impliqués dans la communication ne peuvent nier y avoir participer.
La cryptologie est la « science du secret ».
Le chiffrement est le procédé de cryptographie. Son but est de rendre un document incompréhensible par une personne qui n'a pas à connaître son contenu. On chiffre (cipher en anglais) un message avec une "clé de chiffrement". Un message qui a été chiffré est ensuite déchiffré par la personne qui a la clé de déchiffrement.
Décrypter un message est le fait de tenter, SANS la clé de déchiffrement, de retrouver le message original.
Le chiffrement à clé symétrique
Le chiffrement symétrique est un algorithme de chiffrement qui utilise la même clé pour chiffrer et déchiffrer les données. Cette clé est partagée entre les parties qui communiquent et elle doit être gardée secrète pour assurer la sécurité de la communication. L'algorithme de chiffrement symétrique le plus communément utilisé est l'algorithme AES (Advanced Encryption Standard).
Lorsqu'un message est envoyé à un destinataire, le message est chiffré en utilisant la clé symétrique partagée. Le destinataire doit utiliser la même clé pour déchiffrer le message. La sécurité du chiffrement symétrique dépend de la sécurité de la clé partagée.
Entraînement 1 : le code de César
L’exemple le plus connu de chiffrement symétrique, et un des plus simples, est le chiffre de César. Pour obtenir le texte chiffré, le chiffre de César consiste à remplacer chaque lettre du texte en clair par la lettre obtenue après un décalage d’un nombre fixe de lettres dans l’alphabet.
Pour un décalage de 3 lettres, le A devient D, le B devient E… Comme le montre l’image ci-dessous :

Le nombre 3, qui correspond au nombre de lettres à décaler, est appelé la clef secrète de chiffrement. Pour déchiffrer le message, il suffit de donner la clef de chiffrement au destinataire du message qui réalise l’opération inverse pour déchiffrer le message.

La fonction position_alphabet
ci-dessous prend en paramètre un caractère lettre et renvoie la position de lettre dans la chaîne de caractères ALPHABET s’il s’y trouve et -1 sinon.
La fonction cesar
prend en paramètre une chaîne de caractères message et un nombre entier décalage et renvoie le nouveau message codé avec le codage de César utilisant le décalage .
ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def position_alphabet(lettre):
# lettre.upper() convertit la lettre en majuscule
return ALPHABET.find(lettre.upper())
def cesar(message, decalage):
resultat = ...
for lettre in message:
if lettre.isalpha(): # Vérifie si la lettre est alphabétique
indice = (position_alphabet(...) + ...) % 26
# lettre.isupper() vérifie si la lettre était en majuscule
if lettre.isupper():
resultat += ALPHABET[...]
else:
resultat += ALPHABET[...].lower()
else:
resultat += ...
return ...
Compléter la fonction cesar.
Exemples :
# Résultat attendu : 'FSRNSYV E XSYW. ZMZI PE QEXMIVI RWM !'
print(cesar('BONJOUR A TOUS. VIVE LA MATIERE NSI !', 4))
# Résultat attendu : 'BONJOUR A TOUS. VIVE LA MATIERE NSI !'
print(cesar('GTSOTZW F YTZX. ANAJ QF RFYNJWJ SXN !', -5))
Entraînement 2 :
Décrypter le message suivant (code cesar)
RWM IX XSXS RI WI WITEVIRX NEQEMW !
Entraînement 3 : Analyse fréquentielle
Dans la langue française, la lettre "E" est la plus employée. Des études statistiques ont permis d'estimer la fréquence des lettres en fonction de la langue. Voici ce tableau de fréquences pour le français et l'anglais.
Lettre | Fréquence (Français) | Fréquence (Anglais) |
---|---|---|
A | 7.11% | 8.04% |
B | 0.94% | 1.49% |
C | 3.48% | 2.54% |
D | 3.73% | 4.25% |
E | 17.26% | 12.49% |
F | 0.84% | 2.40% |
G | 1.18% | 1.99% |
H | 0.85% | 6.09% |
I | 6.86% | 7.57% |
J | 0.45% | 0.53% |
K | 0.05% | 0.74% |
L | 3.87% | 4.03% |
M | 3.15% | 2.51% |
N | 6.69% | 7.23% |
O | 5.95% | 7.64% |
P | 3.03% | 1.93% |
Q | 0.65% | 0.12% |
R | 6.07% | 5.99% |
S | 5.68% | 6.51% |
T | 5.48% | 9.28% |
U | 5.41% | 2.76% |
V | 0.90% | 1.05% |
W | 0.04% | 2.24% |
X | 0.15% | 0.14% |
Y | 0.04% | 1.97% |
Z | 0.30% | 0.09% |
- | 0.01% | 0.01% |
, | 0.01% | 0.01% |
. | 0.01% | 0.01% |
; | 0.01% | 0.01% |
' | 0.01% | 0.01% |
: | 0.01% | 0.01% |
? | 0.01% | 0.01% |
! | 0.01% | 0.01% |
Si on connaît la langue d'un texte, alors on peut par exemple, dans le cas d'un chiffrement de César, retrouver le décalage.
Pour que cette analyse soit efficace, il faut que le texte soit suffisamment long.
- Écrire une fonction, `analyse_frequence`, qui renvoie un dictionnaire des fréquences en pourcentages des différentes lettres utilisées dans un message passé en argument.
- Effectuez une analyse fréquentielle du fichier suivant.
- En déduire, dans le cas d'utilisation du code César, la clé utilisée pour ce texte.
- Que venez-vous de décoder ?
>>> analyse_frequence("hello world")
{'h': 10.0, 'e': 10.0, 'l': 30.0, 'o': 20.0, 'w': 10.0, 'r': 10.0, 'd': 10.0}
Entraînement 4 :Le Sortilège du Secret ( Chiffrement XOR)
Le Défi de Poudlard
Harry Potter doit envoyer un message secret à Hermione pour contrer les Mangemorts. Le professeur Flitwick leur enseigne un sort de chiffrement puissant : le XOR magique.
Message original : "Voldemort"
Clé magique : une séquence secrète
Partie 1 : Le Sortilège XOR
Le XOR (⊕) est une opération binaire magique :
Bit 1 | Bit 2 | Résultat (⊕) |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Question 1 : Pratique du sort
Calculez : 1100 ⊕ 1010
Partie 2 : Application sur des mots
Pour chiffrer "NSI" avec la clé "XOR" :
Étape 1 : Conversion en runes binaires (ASCII)
N = 78 → 01001110
S = 83 → 01010011
I = 73 → 01001001
Question 2 : Chiffrement
Calculez 01001110 ⊕ 01011000
(N ⊕ X)
Mission : Décrypter le message secret
Hermione a reçu ce message chiffré :
11000111 10101101 01010100 10011001 00100110 11101110 00101111 01010011 00011001
Avec la clé magique :
10101010 11001100 00110011 11110000 01010101 10011001 01001010 00111100 01101101
Question 3 : Implémentation du sort
Complétez les fonctions Python suivantes :
def texte_vers_binaire(texte):
"""Convertit un texte en sa représentation binaire (8 bits par caractère)."""
binaire = ""
for caractere in texte:
# Convertit le caractère en code ASCII, puis en binaire sur 8 bits
binaire += format(ord(___), '08b') # À compléter
return ___ # À compléter
def xor_binaire(binaire1, binaire2):
"""Applique un XOR entre deux chaînes binaires de même longueur."""
resultat = ""
for bit1, bit2 in zip(binaire1, binaire2):
resultat += str(int(___) ^ int(___)) # ^ Opération XOR # À compléter
return ___ # À compléter
def binaire_vers_texte(binaire):
"""Convertit une chaîne binaire (8 bits par caractère) en texte."""
texte = ___ # À compléter
for i in range(0, len(binaire), 8):
octet = binaire[i:i+8]
texte += chr(int(___, 2)) # Convertit l'octet en caractère
return ___ # À compléter
Question 4 : Exécution du sort
Quel message Harry a-t-il envoyé ?
Voir une solutionLe chiffrement à clé asymétrique
Le chiffrement asymétrique est une méthode de chiffrement qui utilise deux clés différentes pour chiffrer et déchiffrer les données. Ces clés sont appelées clé privée et clé publique. La clé privée est gardée secrète par son propriétaire, tandis que la clé publique est accessible à tous.

Le destinataire d'un message utilise sa clé publique pour chiffrer le message avant de l'envoyer au propriétaire de la clé privée. Le propriétaire de la clé privée utilise sa clé pour déchiffrer le message. Le chiffrement asymétrique est plus sûr que le chiffrement symétrique car la clé privée n'est connue que par le propriétaire, ce qui rend la communication plus sécurisée.

L'algorithme de chiffrement asymétrique le plus couramment utilisé est RSA.
Le chiffrement RSA (algorithmes de chiffrement asymétrique avec clés partagées)
En 1977, trois chercheurs du MIT (États-Unis) inventent le premier algorithme de chiffrement asymétrique (sans risque d’interception par un tier) et change le monde.
Ron Rivest, Adi Shamir et Leonard Adleman inventent le RSA (Prix Turing 2002 (le "Nobel de l’informatique")
RSA est comme un cadenas à code :
- Tout le monde peut le fermer (chiffrer avec la clé publique).
- Seul celui qui a le code peut l'ouvrir (déchiffrer avec la clé privée).
La sécurité du RSA repose sur un problème mathématique difficile :
- C'est facile de multiplier deux très grands nombres premiers (2, 5 ,7 ,11, ..).
- C'est quasi impossible (avec nos ordinateurs actuels) de retrouver ces nombres si on ne connaît que le résultat.
Exemple concret :
- Essayez de multiplier : 1 000 000 009 × 2 000 000 011. C'est rapide.
- Maintenant, essayez de retrouver ces deux nombres à partir de 2 000 000 037 000 000 099 → Très long !

Applications pratiques
RSA est partout autour de nous :
- Sécuriser Internet : Protège les connexions HTTPS (sites bancaires, réseaux sociaux).
- Messages chiffrés : WhatsApp et Signal l'utilisent pour échanger des clés secrètes.
- Signatures électroniques : Garantit l'authenticité des documents (contrats, e-mails officiels).
Ses limites
- Lent pour les gros fichiers : On ne l'utilise que pour échanger une clé de session, puis on passe à AES (plus rapide).
- Clés longues obligatoires : Moins de 2048 bits → Risque de piratage. Les clés modernes font souvent 3072 ou 4096 bits.
Le chiffrement RSA sécurise nos échanges, mais on le combine avec d’autres méthodes pour plus d’efficacité.
Le protocole HTTPS
Le protocole HTTPS (Hypertext Transfer Protocol Secure) est une version sécurisée du protocole HTTP, utilisé pour les communications entre un client (comme un navigateur web) et un serveur web. Il utilise le chiffrement pour protéger les données qui transitent entre le client et le serveur.
Le chiffrement est réalisé à l'aide d'un certificat SSL/TLS (Secure Sockets Layer/Transport Layer Security). Ce certificat est un fichier électronique qui associe une clé publique à une entité (comme un site web). Il est émis par une autorité de certification de confiance, qui garantit que le site web est authentique et que la communication est sécurisée.
Le protocole HTTPS utilise un échange de clés pour établir une session sécurisée entre le client et le serveur. Ce processus est réalisé en plusieurs étapes :
- Le client envoie une demande de connexion sécurisée au serveur.
- Le serveur répond en envoyant son certificat SSL/TLS au client, qui contient la clé publique du serveur.
- Le client vérifie la validité du certificat SSL/TLS en le comparant avec une liste de certificats de confiance, stockée dans le navigateur web.
- Si le certificat SSL/TLS est valide, le client génère une clé de session aléatoire et l'envoie au serveur, chiffrée à l'aide de la clé publique du serveur.
- Le serveur déchiffre la clé de session à l'aide de sa clé privée, et utilise cette clé pour chiffrer les données échangées entre le client et le serveur pendant la session.
Une fois la session établie, toutes les données échangées entre le client et le serveur sont chiffrées à l'aide de la clé de session, ce qui garantit la confidentialité et l'intégrité des données.

En conclusion, le protocole HTTPS est essentiel pour garantir la sécurité des communications sur Internet, en particulier lorsqu'il s'agit de transactions financières, de transfert de données sensibles ou de l'échange d'informations personnelles. Les sites web qui utilisent HTTPS sont facilement reconnaissables grâce au cadenas vert affiché dans la barre d'adresse du navigateur web.
Entraînement 5 : explorer les données contenues dans un certificat
Ouvrez un nouvel onglet dans votre navigateur et rendez-vous sur le site https://www.elysee.fr/
Remarquez dans la barre d’adresse le petit cadenas à gauche qui signifie que les communications sont sécurisées (et cryptées).
En fait, tout le processus décrit précédemment s’est déjà déroulé, sans que vous ayez eu conscience de ce qui s’est passé. Les clés ont été échangées et le canal de communication utilise un cryptage symétrique.
Pour visualiser les données contenues dans le certificat :
• Si vous utilisez Chrome, cliquez sur le cadenas puis sur “certificat”.
• Si vous utilisez Firefox, cliquez sur le cadenas puis la flèche à droite de “Connexion”. Cliquez sur “plus d’informations”, et enfin sur “Afficher le certificat”.
Questions :
- Comment s’appelle le tiers de confiance ayant signé le certificat ?
- Pour qui le certificat a-t-il été émis ?
- Quelle est sa date d’expiration ?
- Trouvez la clé publique contenue dans le certificat ainsi que l’algorithme de chiffrement utilisé. (détails)
- Quel est l’algorithme utilisé pour la signature du certificat ?
Un certificat numérique possède trois caractéristiques essentielles :
- il est infalsifiable : il est chiffré pour empêcher toute modification.
- il est nominatif : il est délivré à une seule entité (comme la carte d’identité est délivrée à une personne et une seule).
- il est certifié : il y a le « tampon » de l’autorité qui l’a délivré.
Entraînement 6 : Remettre dans le bon ordre les évènements suivants
- a) Le navigateur génère aléatoirement une clé de session
- b) Le serveur déchiffre la clé de session en utilisant le même algorithme de chiffrement asymétrique que le navigateur du client
- c) Le navigateur du client demande le certificat du serveur de la banque de chiffrement asymétrique
- d) Le serveur établit une session de communication par chiffrement symétrique avec le client
- e) Le navigateur envoie la clé de session chiffrée au serveur
- f) Le navigateur chiffre la clé de session à l’aide de la clé publique, en utilisant un algorithme
- g) Le navigateur extrait du certificat la clé publique du serveur
- h) Le navigateur vérifie l’authenticité du certificat à l’aide d’une clé publique racine
- i) Le serveur envoie le certificat de la banque au navigateur du client
Attaque par Force Brute : Comprendre et Sécuriser
Entraînement 7 : Sécurisation des communications et attaque par chronométrage
Lorsqu'un système vérifie un mot de passe, une attaque par chronométrage peut être exploitée. En mesurant le temps de réponse, un attaquant peut deviner progressivement un mot de passe.
Code de départ
On considère la fonction suivante qui vérifie un mot de passe :
# Importation des modules nécessaires
from timeit import default_timer as timer # Pour mesurer précisément le temps d'exécution
import string # Pour utiliser des constantes de caractères (ascii_letters, digits, etc.)
import time # Pour ajouter des délais contrôlés
# Configuration initiale
mot_de_passe_cible = "code42" # Le mot de passe que nous allons tenter de deviner
def verifier_mot_de_passe(mot_à_tester, mot_de_passe_réel):
"""
Fonction de vérification vulnérable aux attaques par chronométrage.
Args:
mot_à_tester (str): Le mot de passe testé
mot_de_passe_réel (str): Le vrai mot de passe
Returns:
bool: True si correspondance, False sinon
"""
for position in range(min(len(mot_à_tester), len(mot_de_passe_réel))):
# Comparaison caractère par caractère
if mot_à_tester[position] != mot_de_passe_réel[position]:
return False # Échec immédiat si caractère incorrect
# Délai qui rend la fonction vulnérable
# Plus il y a de caractères corrects, plus le temps de réponse est long
time.sleep(0.001) # 1ms par caractère correct
return True # Tous les caractères testés sont corrects
Analyse du fonctionnement
- Que fait cette fonction lorsqu’on lui soumet un mot de passe ? Voir une solution
- Pourquoi retourne-t-elle
True
même si la longueur des deux mots de passe ne correspond pas ? Voir une solution - Comment un attaquant pourrait-il exploiter le temps d’exécution de cette fonction pour deviner progressivement le mot de passe ? Voir une solution
Mesure du temps d'exécution
- Complétez la fonction suivante pour mesurer le temps moyen sur 20 essais
check()
.def mesurer_temps(mot_à_tester, mot_de_passe_réel, répétitions=___): """ Mesure le temps moyen d'exécution de la vérification. Pourquoi plusieurs répétitions ? - Lisser les variations aléatoires du système - Obtenir une mesure plus fiable - 50 répétitions offrent un bon compromis précision/temps Args: mot_à_tester (str): Mot de passe à tester mot_de_passe_réel (str): Mot de passe de référence répétitions (int): Nombre de mesures pour calculer la moyenne Returns: float: Temps moyen en secondes """ temps_cumulé = ___ for _ in range(répétitions): début = timer() # Début du chronomètre verifier_mot_de_passe(___, ___) fin = timer() # Fin du chronomètre temps_cumulé += ___ - ___ return temps_cumulé / ___ # Retourne la moyenne
- Teste la fonction avec différentes entrées, comme "c", "cy", "cyb", "cyber17M", et analyse les résultats. Voir une solution
- Compare les temps d'exécution obtenus. Que remarques-tu ? Voir une solution
Simulation d'une attaque par chronométrage
- Écris une fonction qui tente de deviner le mot de passe caractère par caractère en exploitant le temps de réponse. Voir une solution 1 Voir une solution 2