\chapter{Réseaux et sécurité}

\section{Protocoles de routage}

\subsection{Protocole IP}

Internet est constitué d'un ensemble interconnecté de réseaux, au sein duquel les données doivent pouvoir circuler entre deux machines, indépendamment des réseaux locaux auxquels elles sont connectées. Ce transport des données repose sur la couche réseau du modèle TCP/IP, qui correspond à la couche 3 du modèle OSI. Son rôle est rempli par le protocole IP (Internet Protocol) dont les deux fonctions principales sont : 

\begin{itemize}

	\item l'\textit{adressage} des machines pour les identifier de façon unique sur un réseau IP ;

	\item le \textit{routage} des paquets entre les réseaux, en les acheminant de proche en proche vers leur destination, sans garantie de livraison.

\end{itemize}

\subsubsection{Adresses réseau}

Une adresse IP est attribuée à chaque interface réseau d'un \textit{hôte} (ou \textit{machine} : ordinateur, routeur, objet connecté, etc.) sur un réseau qui utilise le protocole IP. Ainsi, un hôte possédant plusieurs interfaces réseau (Wi-Fi, Ethernet, etc.) sera identifié par plusieurs adresses IP distinctes, chacune correspondant à une interface spécifique.

\begin{defin}[Adresse IP]

Une \textit{adresse IP} est un identifiant numérique unique attribué à chaque interface réseau d'un hôte connecté à un réseau informatique utilisant le protocole IP. Elle permet de localiser et d'acheminer les paquets vers l'interface concernée.

\end{defin}

Elle peut être permanente (adresse IP statique) ou temporaire (allouée dynamiquement par un serveur DHCP).

Pour simplifier, nous parlerons souvent de l'\og adresse IP d'une machine \fg, bien qu'il s'agisse en réalité de l'adresse IP de l'interface qu'elle utilise sur un réseau donné.

Dans un réseau informatique, on distingue deux types d'adresses utilisées pour identifier une machine :

\begin{itemize}

	\item l'\textit{adresse IP}, qui est une adresse logique attribuée dynamiquement ou statiquement et qui permet de localiser un appareil dans un réseau IP.  

	\item l'\textit{adresse MAC}, qui est une adresse physique unique inscrite directement dans la carte réseau.

\end{itemize}

\enlargethispage*{\baselineskip}

\begin{defin}[Adresse MAC]

Une \textit{adresse MAC} (\textit{Media Access Control}) correspond à une adresse physique, utilisée au niveau de la couche accès réseau. C'est un identifiant numérique unique de 48 bits (6 octets), représenté en hexadécimal (exemple : \texttt{2a-6e-64-7f-a9-e0}). Elle identifie de manière unique une carte réseau.

\end{defin}

Lorsqu'un appareil veut envoyer des paquets sur un réseau local, il doit connaître l'adresse MAC du destinataire. Des mécanismes comme ARP (pour IPv4) permettent d'établir cette correspondance entre adresse IP et adresse MAC.

On distingue deux versions d'adresses IP :

\begin{itemize}

 \item IPv4, codées sur 4 octets (32 bits), présentées sous la forme \textit{décimale pointée} \texttt{a.b.c.d} où \texttt{a}, \texttt{b}, \texttt{c} et \texttt{d} sont les valeurs en base 10 des quatre octets. Exemple : 172.20.18.13 ;
 
 \item IPv6, codées sur 16 octets (128 bits), souvent représentées en notation hexadécimale. Exemple : \texttt{2a01:c9c0:a300:0800:0000:0004}. 
 
\end{itemize}

L'espace d'adressage IPv4 est limité à environ 4,3 milliards d'adresses ($2^{32}$), ce qui pose problème avec l'augmentation du nombre d'appareils connectés. IPv6 offre un espace bien plus vaste ($2^{128}$), permettant une adresse unique pour chaque machine. Dans la suite du cours, nous nous concentrerons sur les adresses IPv4.

\subsubsection{Structure d'une adresse IP}

Une adresse IP est constituée de deux parties :

\begin{itemize}

	\item l'\textit{adresse réseau} déterminée par la partie gauche de l'adresse IP, soit les $n$ premiers bits de poids fort : identifie le réseau auquel appartient l'hôte ;
	
	\item le \textit{numéro d'hôte} déterminé par la partie droite de l'adresse IP, soit les $32-n$ bits de poids faible : identifie une machine au sein de ce réseau.
	
\end{itemize}

\begin{methode}

Pour bien visualiser la séparation entre la partie réseau et la partie hôte, il est conseillé d'écrire l'adresse IP sous la forme \texttt{w.x.y.z} où \texttt{w}, \texttt{x}, \texttt{y} et \texttt{z} sont les valeurs \textit{binaires} des quatre octets.

\end{methode}


\begin{center}
\includegraphics{289_masque-reseau-1}
\figcaption{Structure d'une adresse IPv4}
\label{structure-ip}
\end{center}

Un \textit{réseau local} (ou \textit{sous-réseau}) est un ensemble de machines connectées physiquement et partageant une partie commune de leur adresse IP. 

\begin{defin}[Masque de réseau]

Le \textit{masque de réseau} (ou \textit{masque de sous-réseau}, en anglais \textit{subnet mask}), constitué d'une suite de 32 bits, possède des bits à 1 dans la partie réseau (bits de poids fort) et des bits à 0 dans la partie hôte. Il permet de délimiter la séparation entre l'adresse réseau et l'adresse hôte.

\end{defin}

Deux adresses IP appartiennent au même réseau local si elles ont en commun les bits de la partie réseau définie par le masque.

\begin{defin}[Notation CIDR]

La \textit{notation CIDR} (Classless Inter-Domain Routing) est une notation abrégée permettant d'exprimer la taille de la partie réseau d'une adresse IP. Elle s'écrit sous la forme \texttt{a.b.c.d/n}, où $n$ indique le nombre de bits utilisés pour coder l'adresse réseau.

\end{defin}

Par exemple, l'adresse 50.40.30.123/24 signifie que les 24 premiers bits définissent l'adresse du réseau et les 8 bits restants identifient les hôtes.

\begin{figure}
\begin{center}
\includegraphics{289_masque-reseau-2}
\figcaption{Illustration du masque de réseau}
\label{exemple-masque-reseau}
\end{center}
\end{figure}

Une fois la séparation réseau/hôte définie, on peut identifier deux adresses particulières dans chaque réseau :

\begin{defin}[Adresse de réseau]

L'\textit{adresse de réseau} est l'adresse où tous les bits de la partie hôte sont mis à 0. Elle permet d'identifier le réseau et ne peut être attribuée à un hôte.

\end{defin}

\begin{methode}

L'adresse de réseau peut être calculée en effectuant un ET bit à bit entre l'adresse IP et le masque de réseau.

\end{methode}


\begin{defin}[Adresse de diffusion]

L'\textit{adresse de diffusion} (broadcast) est l'adresse où tous les bits de la partie hôte sont mis à 1. Elle permet d'envoyer un message à toutes les machines du réseau simultanément.

\end{defin}

Ces adresses sont réservées et ne peuvent pas être attribuées aux machines du réseau.

La taille de la partie hôte ($32-n$ bits) permet de calculer le nombre d'adresses IP disponibles pour les hôtes de ce réseau. Sachant que deux adresses sont réservées, le nombre de machines adressables d'un réseau \texttt{a.b.c.d/n} est : $2^{32-n}-2$.

Lorsqu'une machine doit envoyer un paquet à destination d'une adresse IP, elle commence par vérifier si cette adresse appartient à son réseau local :

\begin{itemize}

  \item si c'est le cas, elle envoie le paquet directement au destinataire (avec une éventuelle résolution d'adresse MAC par ARP) ;
  
  \item sinon, elle l'envoie à une \textit{passerelle}, un routeur connecté à au moins un autre réseau, qui se charge de relayer le paquet vers sa destination finale.
  
  \end{itemize}  

\begin{aretenir}

La configuration d'un hôte sur un réseau local nécessite trois informations essentielles :

\begin{itemize}

    \item \textit{l'adresse IP de la machine} : identifie l'interface de l'hôte sur le réseau local.
    
    \item \textit{le masque de réseau} : détermine quelle partie de l'adresse IP correspond au réseau et quelle partie identifie l'hôte. La combinaison de l'adresse IP et du masque permet de déterminer l'adresse du réseau local.
    
    \item \textit{l'adresse IP de la passerelle} : c'est l'adresse d'un routeur présent sur le réseau local. Il sert d'intermédiaire pour envoyer les paquets destinés à des machines situées en dehors du réseau local.
    
\end{itemize}

\end{aretenir}


\begin{plusloin}

Sur Internet, chaque machine connectée doit posséder une adresse IP unique. Cependant, avec la pénurie d'adresses IPv4, de nombreuses machines au sein d'un réseau local partagent une seule adresse IP publique grâce à un mécanisme appelé \textit{NAT} (Network Address Translation).

\Break


Le NAT est souvent utilisé sur les routeurs domestiques et d'entreprise :

\begin{itemize}

    \item il permet à plusieurs appareils du réseau local d'accéder à Internet en utilisant une seule adresse IP publique ;
    
    \item il protège indirectement les machines internes en cachant leurs adresses IP privées.
\end{itemize}

Avec IPv6, le NAT est moins nécessaire car l'espace d'adressage est suffisamment grand pour attribuer une adresse publique unique à chaque machine.

\end{plusloin}



\subsection{Principe du routage}

\begin{problematique}

Comment les paquets IP trouvent-ils leur chemin sur un réseau aussi vaste et hétérogène qu'Internet ? Quelles stratégies permettent aux routeurs d'acheminer efficacement les paquets jusqu'à leur destination ?

\end{problematique}

\subsubsection{Routeur}

\begin{defin}[Routeur]

Un routeur est un équipement connecté à au moins deux réseaux distincts, dont le rôle est d'acheminer les paquets d'un réseau à un autre en respectant certaines règles de routage.

\end{defin}

Un routeur possède plusieurs \textit{interfaces}, chacune étant connectée à un réseau spécifique. Chaque interface doit disposer d'une adresse IP correspondant au réseau auquel elle est rattachée. 

Lorsqu'un paquet arrive sur l'une des interfaces d'un routeur, celui-ci doit \og décider \fg où l'envoyer en fonction de l'adresse IP de destination. C'est là qu'intervient la \textit{table de routage}, qui indique à chaque routeur comment transmettre les paquets vers le réseau approprié.

\subsubsection{Tables de routage}

\begin{defin}[Table de routage]

La \textit{table de routage} est une structure de données utilisée par un routeur pour stocker les informations sur les réseaux qu'il peut atteindre. Chaque entrée de la table associe un réseau de destination à l'interface ou au routeur intermédiaire à utiliser pour y accéder.

\end{defin}

\newpage

Lorsqu'un routeur reçoit un paquet IP, il consulte sa \textit{table de routage} pour déterminer, en fonction de l'adresse IP destinataire, la meilleure route à emprunter. Si la destination est directement connectée au routeur, il transmet le paquet sur l'interface correspondante. Sinon, il l'envoie vers un autre routeur qui se trouve plus proche de la destination.

Les tables de routage peuvent être mises à jour de deux manières :

\begin{itemize}

\item routage statique : les entrées sont configurées manuellement par un administrateur. Ce mode est fiable mais peu flexible, car il nécessite une mise à jour manuelle à chaque modification du réseau.

\item routage dynamique : la table de routage est mise à jour automatiquement à l'aide de protocoles de routage. Cette approche permet aux routeurs d'échanger des informations et d'adapter les itinéraires en fonction de l'état du réseau.

\end{itemize}


Considérons l'architecture réseau suivante qui présente quatre réseaux locaux interconnectés par le biais de quatre routeurs (R1, R2, R3 et R4) dont un (R4) est connecté à Internet (R4 peut être une box ADSL ou fibre par exemple).

\Par

\begin{figure}
\begin{center}
\includegraphics{292_architecture-reseau}
\figcaption{Réseau à quatre routeurs}
\label{archi-reseau}
\end{center}
\end{figure}

Lorsqu'un routeur démarre, sa table de routage ne contient par défaut que les réseaux directement connectés à ses interfaces. En l'absence de configuration, il ne sait pas encore comment joindre les autres réseaux.

Chaque entrée (ligne) de la table de routage correspond à un réseau et contient :  
\begin{itemize}

	\item l'\textit{adresse du réseau} avec son \textit{masque}, par exemple : 192.134.164.0/24 ;
	
	\item la \textit{destination}, qui indique où envoyer le paquet :
	
  \begin{itemize}
  
    \item si le réseau de destination est directement connecté, la destination est l'interface locale (ou port) à utiliser ;
    
    \item si le réseau de destination est distant, la destination est l'adresse IP de la passerelle, c'est-à-dire l'adresse d'un autre routeur à qui transmettre le paquet, en précisant également l'interface par laquelle l'envoyer.
    
  \end{itemize}
  
	\item la \textit{métrique}, qui permet de quantifier la \og distance \fg au destinataire final. La méthode de mesure utilisée dépend de l'algorithme de routage utilisé. Elle vaut 0 si le réseau est directement connecté au routeur.
	
\end{itemize}

Les tables de routages des quatre routeurs sont donc initialement :

\Par

\begin{center}
\begin{tabular}{|>{\centering\arraybackslash}m{1.2cm}|m{2.5cm}|m{2.8cm}|>{\centering\arraybackslash}m{1.6cm}|}
\tabulartitle\hline
Routeur & Réseau & Destination & Métrique \\
\hline
\multirow{2}{*}{R1} &\color{DG} 192.168.4.0/24 &\color{DG} Interface locale F0 & 0 \\\cline{2-4}
                    & \color{DB} 50.40.30.0/24  &\color{DB} Interface locale F1 & 0 \\\hline
\multirow{2}{*}{R2} & \color{DB}50.40.30.0/24  &\color{DB} Interface locale F0 & 0 \\\cline{2-4}
                    & 192.134.164.0/24 & Interface locale F1 & 0 \\\hline
\multirow{2}{*}{R3} &\color{DO} 97.0.14.0/24 &\color{DO} Interface locale F0 & 0 \\\cline{2-4}
                    & 192.134.164.0/24 & Interface locale F1 & 0 \\\hline
				R4  & \color{DO} 97.0.14.0/24 &\color{DO} Interface locale F0 & 0 \\\hline
\end{tabular}
\end{center}

Ces informations ne suffisent pas à router l'ensemble du réseau décrit ci-dessus. Par exemple, les machines F et A ne peuvent pas communiquer ensemble : 

\begin{itemize}

\item La machine F envoie un paquet à destination de la machine A d'adresse\linebreak 192.134.164.1. Le réseau local de F est 192.168.4.0 : A n'appartient pas à ce réseau. Elle envoie donc le paquet à sa passerelle par défaut, le routeur R1 à l'adresse 192.168.4.254 ;

\item Le routeur R1 recherche une route pour atteindre le réseau 192.134.164.0/24. Or, sa table de routage ne contient aucune entrée correspondant à cette destination. Faute d'une route par défaut ou d'un protocole de routage dynamique, le paquet est abandonné.

\end{itemize}

Deux solutions permettent de résoudre ce problème :

\begin{itemize}

\item ajouter une route par défaut pour rediriger les paquets inconnus vers un routeur de sortie (comme R4, qui est connecté à Internet).

\item utiliser un protocole de routage dynamique, comme RIP ou OSPF, permettant aux routeurs de partager automatiquement leurs tables de routage.

\end{itemize}

La mise à jour de la table de routage doit se faire périodiquement pour pouvoir prendre en compte les modifications du réseau (panne d'un routeur, ajout d'une liaison, ajout d'un routeur, etc.). 

À part pour des petits réseaux, cette opération peut difficilement se faire de manière centralisée. Elle repose sur des algorithmes distribués (chaque routeur les exécute indépendamment des autres). Les échanges d'informations entre routeurs sont décrits dans des protocoles de routage. 

\enlargethispage*{3em}



\subsection{Protocole RIP}

\subsubsection{Principe}

Le protocole RIP (\textit{Routing Information Protocol}) est un des protocoles de routage dynamique mis en œuvre au niveau des routeurs afin d'acheminer les paquets.

\newpage

Avec ce protocole, la métrique correspond au \textit{nombre de sauts} (hops) entre le routeur et le réseau de destination.

Les routeurs transmettent automatiquement à leurs voisins les informations issues de leurs tables de routage (typiquement, une itération toutes les 30 secondes). 

À la réception de ces informations, le routeur effectue les analyses suivantes : 

\begin{itemize}
	
	\item s'il trouve une nouvelle route (c'est-à-dire un nouveau réseau), il incrémente la métrique de 1 et si celle-ci est inférieure à 15, il l'ajoute à sa propre table de routage ;
	
	\item si la route existe déjà dans sa table : \begin{itemize}
		
		\item soit la métrique reçue est inférieure à celle qu'il connaît : il supprime alors l'ancienne route et la remplace par la nouvelle ;
		
		\item soit la métrique reçue est supérieure : si cette information vient du même routeur, alors il met à jour la métrique dans sa table.
	
	\end{itemize}

\end{itemize}

La table contient donc, pour chaque réseau connu, l'adresse du routeur voisin dont la métrique est la plus petite. À chaque nouvelle itération, la table est ainsi mise à jour dynamiquement à chaque nouvelle itération du protocole.

Voici le résultat de l'application du protocole RIP sur l'architecture (figure~\ref{archi-reseau}) à l'issue des échanges de tables. La topologie réseau n'étant pas modifiée sur le temps analysé, les tables sont uniquement complétées au fur et à mesure des échanges RIP.

\Par

\begin{center}
\begin{tabular}{|Zc|*2{Zl|}Zc|}
\tabulartitle\hline
Routeur & Réseau & Destination & Métrique\\\hline
\multirow{4}{*}{R1} & \color{DG} 192.168.4.0/24 & \color{DG} Interface locale F0 & 0\\\cline{2-4}
                    & \color{DB} 50.40.30.0/24 & \color{DB} Interface locale F1 & 0\\\cline{2-4}
                    & 192.134.164.0/24 & \color{DB} 50.40.30.254 (R2) & 1\\\cline{2-4}
                    & \color{DO} 97.0.14.0/24 & \color{DB} 50.40.30.254 (R2) & 2\\\hline
\multirow{4}{*}{R2} & \color{DB} 50.40.30.0/24 & \color{DB} Interface locale F0 & 0\\\cline{2-4}
                    & 192.134.164.0/24 & Interface locale F1 & 0\\\cline{2-4}
                    & \color{DG} 192.168.4.0/24 & \color{DB} 50.40.30.1 (R1) & 1\\\cline{2-4}
                    & \color{DO} 97.0.14.0/24 & 192.134.164.254 (R3) & 1\\\hline
\multirow{4}{*}{R3} & \color{DO} 97.0.14.0/24 & \color{DO} Interface locale F0 & 0\\\cline{2-4}
                    & 192.134.164.0/24 & Interface locale F1 & 0\\\cline{2-4}
                    & \color{DB} 50.40.30.0/24 & 192.134.164.253 (R2) & 1\\\cline{2-4}
                    & \color{DG} 192.168.4.0/24 & 192.134.164.253 (R2) & 2\\\hline
\multirow{4}{*}{R4} & \color{DO} 97.0.14.0/24 & \color{DO} Interface locale F0 & 0\\\cline{2-4}
                    & 192.134.164.0/24 & \color{DO} 97.0.14.1 (R3) & 1\\\cline{2-4}
                    & \color{DB} 50.40.30.0/24 & \color{DO} 97.0.14.1 (R3) & 2\\\cline{2-4}
                    & \color{DG} 192.168.4.0/24 & \color{DO} 97.0.14.1 (R3) & 3\\\hline
\end{tabular}
\end{center}


\subsubsection{Limites}

Le protocole RIP présente des limites car :

\begin{itemize}

	\item les routes présentant plus de 15 sauts sont ignorées ;

	\item la notion de \og plus court chemin \fg fondée sur le nombre de sauts ne tient pas compte de la nature réelle des routes empruntées, et en particulier du débit qui les caractérise.

\end{itemize}

\subsection{Protocole OSPF}

Le protocole \textit{OSPF} (pour Open Shortest Path First) est un autre type de protocole de routage. Il tient compte du débit des liaisons entre routeurs afin d'établir la route la plus rapide. Il ne tient pas compte du nombre de sauts.

\begin{defins}

Le \textit{débit} d'une liaison est la quantité d'information effectivement transmise par unité de temps (en nombre de bits par unité de temps, le plus souvent exprimée en kbit/s, Mbit/s, etc.)

\Par

La \textit{bande passante} représente le débit maximal théorique d'une liaison (fonction de ses caractéristiques physique : câble, fibre optique, wi-fi, etc.).

\end{defins}

Dans OSPF, on calcule le \textit{coût} de chaque liaison entre deux routeurs. Ce coût est d'autant plus élevé que la bande passante est faible.

\begin{defin}[Coût d'une liaison]

Par convention, on utilise la relation suivante :
$$\textrm{coût}= \frac{\textrm{débit maximal de référence}}{\textrm{débit de la liaison}} = \frac{10^8}{\textrm{débit}}$$
les débits étant exprimés en bit/s. Le coût est sans unité.

\end{defin}

Le coût d'une liaison tient lieu de métrique pour le protocole OSPF.

Le \textit{coût d'une route} entre deux routeurs qui ne sont pas liés directement est la somme des coûts de toutes les routes à traverser. 

\begin{Remarque}
Le coût calculé est encodé par les routeurs sous la forme d'un entier compris entre 1 et 65~535. Ainsi, pour des liaisons à haute vitesse (supérieures à 100 Mbit/s), le coût calculé (inférieur à 1) est assimilé à 1. Pour pouvoir prendre en compte ces liaisons à haute vitesse, la bande passante de référence utilisée pour le calcul ($10^8$) peut être augmentée ($10^9$ ou $10^{10}$ par exemple). Si ce n'est pas le cas, sauf mention contraire dans l'énoncé, on conservera les valeurs calculées.
\end{Remarque}

\newpage

Le fonctionnement du protocole OSPF se décompose en deux étapes.

\begin{questions}
	\item diffusion, entre voisins, de l'information sur le voisinage : les routeurs s'échangent des messages afin de reconstituer la topologie de leur zone ;
	
	\item chaque routeur utilise un algorithme afin de calculer la meilleure route à emprunter pour joindre chacun des autres routeurs de la zone. Après calcul, chaque route est mémorisée dans la table de routage. Typiquement, le réseau peut être vu comme un graphe pondéré sur lequel on fait fonctionner un algorithme de recherche de plus court chemin (\textit{Shortest Path First}) (\textit{cf}. Dijkstra).
\end{questions}

\begin{Exemple}
considérons un réseau constitué de cinq routeurs, dont les débits entre chaque routeur sont : 
\begin{itemize}
\item 1 Mbit/s entre R1 et R4 ;
\item 10 Mbit/s entre R3 et R4, R3 et R5, R4 et R5 ;
\item 100 Mbit/s entre R1 et R3, R1 et R2, R2 et R3 ;
\item 1 Gbit/s entre R2 et R5.
\end{itemize}.
\end{Exemple}

Dans le protocole OSPF, chaque routeur peut se construire le graphe complet des liaisons inter-routeur :

\Par

\begin{figure}
\begin{center}
\includegraphics{291_08-graphe-ospf-1}
\figcaption{Graphe correspondant au réseau }
\end{center}
\end{figure}

Considérons le cas où R1 a besoin de router un paquet vers R4 :

\begin{itemize}

\item S'il passe directement par son interface, ce qui serait le cas en appliquant le protocole RIP (métrique égale à 0) la transmission se fera avec un débit de 1~Mbit/s.

\item S'il passe par R3 (route R1 -- R3 -- R4), la transmission sera dix plus rapide (le débit de la transmission globale sera limité par le débit le plus bas rencontré sur la route) : 10 Mbit/s sur R3 -- R4.

\item Dans cette configuration, les autres routes possibles (R1 -- R3 -- R5 -- R4, R1 -- R2 -- R3 -- R4, R1 -- R2 -- R5 -- R4, R1 -- R2 -- R5 -- R3 -- R4) sont toutes limitées par le débit de 10~Mbit/s entre R3 (ou R5) et R4.

\end{itemize}

\newpage

Le calcul de coût conduit au graphe pondéré suivant :

\Par

\begin{figure}
\begin{center}
\includegraphics{292_08-graphe-ospf-2}
\figcaption{Graphe représenté par chaque routeur}
\end{center}
\end{figure}

Dans le protocole OSPF, la route choisie minimise le coût total. Ainsi, c'est bien la route R1 -- R3 -- R4, de coût $1 + 10 = 11$ qui sera privilégiée.

\begin{aretenir}
\begin{center}
\includegraphics{293_RIP-OSPF}
\end{center}
\end{aretenir}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\section{Sécurisation des communications}
\index{Chiffrement!Principes}

Sur Internet, la protection des données sensibles échangées est un enjeu majeur. Lorsqu'un message transite sur un réseau, il peut être intercepté par un tiers malveillant. Le chiffrement permet de rendre ces messages inexploitables sans la clé de déchiffrement correspondante.

\begin{defins}

La \textit{cryptographie} est l'ensemble des techniques permettant de chiffrer et déchiffrer des messages. Le message à transmettre est en général appelé \textit{message clair} ou \og \textit{en clair} \fg. Le message clair, une fois transformé par la technique de chiffrement est appelé \textit{message chiffré}. 

La \textit{cryptanalyse} est l'ensemble des techniques visant à déchiffrer un message sans en être le destinataire légitime et donc sans en avoir la clé (on parle aussi de \og \textit{casser} \fg ou \textit{décrypter} un message), voire sans connaître la méthode de chiffrement utilisée.

\end{defins}

\newpage

Depuis 1977 et l'article présentant le système RSA, on a l'habitude d'utiliser des personnages fictifs pour désigner les différents intervenants : Alice veut transmettre un message à son ami Bob. Elle ne souhaite pas qu'\`Eve, qui peut écouter les échanges, puisse déchiffrer les messages.

Une méthode de chiffrement repose sur un \textit{algorithme} (de chiffrement et de déchiffrement) et sur une \textit{clé}. La clé est une donnée (par exemple un nombre ou un texte) permettant de chiffrer et de déchiffrer un message en utilisant l'algorithme. 



\subsection{Chiffrement symétrique}



Le chiffrement symétrique repose sur le \textit{partage d'une clé} entre Alice et Bob. Cette clé partagée est \textit{secrète}. Idéalement, elle doit être échangée hors du réseau ou être transmise de manière sécurisée (ce qui déplace le problème). La clé utilisée pour chiffrer est la même que celle utilisée pour déchiffrer, d'où le terme \og \textit{symétrique} \fg.

\subsubsection{Chiffre de César}
\index{Chiffrement!César}

Le chiffre de César est une méthode très ancienne fondée sur le décalage au sein d'un alphabet. Il permet de substituer une lettre par une autre lettre de l'alphabet, décalée dans cet alphabet d'une distance fixe (un nombre de lettres). 

Dans le cas de l'alphabet latin (26 lettres), une clé de 4 correspond à une substitution de A par E, B par F, ..., V par Z, W par A, etc. (permutation circulaire de l'alphabet). Une clé égale à 0 (ou 26) ne modifie pas le texte.

\begin{Exemple}

Un décalage de 4 transforme \og NSI \fg{} en \og RWM \fg.

\end{Exemple}

Bien que simple à implémenter, ce chiffrement est facilement cassable par une attaque exhaustive (énumération de toutes les possibilités) car il n'existe que 25 clés possibles.

\subsubsection{ROT13}
\index{Chiffrement!ROT13}

L'algorithme ROT13 est un chiffrement de César dont la clé vaut 13. On en déduit qu'appliquer deux fois cet algorithme sur un texte en clair est équivalent à un décalage de 26, ce qui restitue le texte initial.

$$\mathrm{NSI} \xrightarrow{\text{ROT13}} \mathrm{AFV} \xrightarrow{\text{ROT13}} \mathrm{NSI}$$

\subsubsection{Chiffre de Vigenère}

Le chiffre de Vigenère est une méthode améliorée de chiffrement par décalage, qui utilise le chiffrement de César non plus sur une seule clé numérique mais en utilisant successivement plusieurs clés, de manière cyclique. 

On peut alors présenter la clé sous forme d'une chaîne. Ainsi, la clé \texttt{'ALLO'} sera appliquée de telle manière que :
\begin{itemize}
	\item le premier caractère du texte en clair est décalé de \og A \fg soit 1 caractère ;
	\item le deuxième caractère est décalé de \og L \fg soit 12 caractères ;
	\item idem pour le troisième (L : 12) ;
	\item le quatrième est décalé de A : 1 caractère ;
	\item le cinquième utilise à nouveau la première lettre de la clé et applique un décalage de A : 1 ;
	\item ainsi de suite...
\end{itemize}

\begin{Exemple} ici, le texte en clair \og INFORMATIQUE \fg est chiffré à l'aide de la clé \og NSI \fg.

\Par

\begin{tabular}{|L|*{12}{Zc|}}
\hline
Lettre en clair & I & N & F & O & R & M & A & T & I & Q & U & E \\\hline
Clé 		    & N & S & I & N & S & I & N & S & I & N & S & I \\\hline
Décalage & 14 & 19 & 9 & 14 & 19 & 9 & 14 & 19 & 9 & 14 & 19 & 9 \\\hline
Lettre chiffrée & W & G & O & C & K & V & O & M & R & E & N & N \\\hline
\end{tabular}

\Par

D'où : $$\mathrm{INFORMATIQUE} \xrightarrow{NSI} \mathrm{WGOCKVOMRENN}$$

\end{Exemple}

Cette technique rend plus difficile les attaques par force brute ou par analyse statistique.

\subsubsection{Chiffrement XOR}
\index{Chiffrement!XOR}

Le chiffrement XOR repose sur l'opérateur \textit{ou exclusif} (XOR), noté $\oplus$, appliqué bit à bit entre le message clair et la clé.

\begin{center}
$M \oplus K = C$, et donc $C \oplus K = M$
\end{center}

On rappelle sa table de vérité :

\begin{center}
\begin{tabular}{|Zc|Zc|Zc|}
\tabulartitle\hline
$A$ & $B$ & $A \oplus B$ \\
\hline
0 & 0 & 0 \\
\hline
1 & 0 & 1 \\
\hline
0 & 1 & 1 \\
\hline
1 & 1 & 0 \\
\hline
\end{tabular}
\end{center}

Si la clé est de longueur plus petite que le message clair, la clé est répétée autant de fois que nécessaire.

\begin{Remarque}

En Python, l'opérateur \texttt{\^} (\textit{accent circonflexe}) permet de réaliser l'opérer un \textit{ou exclusif} entre deux entiers.

\end{Remarque}

\subsubsection{Chiffrement par substitution}

Plutôt que de passer par une permutation circulaire des lettres de l'alphabet, on peut convenir de table de traduction qui à chaque lettre de l'alphabet associe une autre lettre.

\begin{tabular}{|L|*{13}{Zc|}}
\hline
Lettre en clair: & A & B & C & D & E & F & G & H & I & J & K & L & M\\\hline
Lettre chiffrée: & S & E & T & R & O & G & Q & B & P & I & F & L & W\\\hline
\end{tabular}

\Par

\begin{tabular}{|L|*{13}{Zc|}}
\hline
Lettre en clair: & N & O & P & Q & R & S & T & U & V & W & X & Y & Z\\\hline
Lettre chiffrée: & H & X & C & Y & Z & V & U & J & A & K & N & D & M\\\hline
\end{tabular}

$$\mathrm{NSI} \xrightarrow{\text{table}} \mathrm{HVP}$$

Alice et Bob doivent tous les deux disposer de la table de correspondance, qui constitue la clé secrète. Cette table peut être représentée sous la forme d'une chaîne de caractères :

\begin{center}
\texttt{SETROGQBPIFLWHXCYZVUJAKNDM}
\end{center}

Un espion qui intercepterait le message secret sans connaître la clé peut tenter une attaque par analyse statistique si le message est suffisamment long et s'il connaît la langue utilisée en clair.

\subsubsection{Algorithmes modernes}

Les algorithmes symétriques modernes, comme \textit{AES} (Advanced Encryption Standard) ou \textit{ChaCha20}, offrent une meilleure sécurité grâce à des clés longues (128 à 256 bits).

\begin{plusloin}

Le principe de Kerckhoffs (hors programme), connu depuis le \textsc{xix}\ieme ~siècle, stipule que pour qu'un algorithme de chiffrement soit sûr, il ne doit pas reposer sur le secret de l'algorithme de chiffrement. Les cryptographes travaillent donc avec des algorithmes majoritairement publiés.

\end{plusloin}

\subsection{Chiffrement asymétrique}

\begin{problematique}

Les algorithmes de chiffrement symétrique reposent toujours sur un principe fondamental : une clé secrète doit être partagée entre les interlocuteurs avant tout échange de données chiffrées. Si Alice et Bob ne disposent pas d'un canal de communication déjà sécurisé, un attaquant interceptant leurs communications pourrait la récupérer et déchiffrer leurs messages. Pour contourner cette limitation, une approche différente doit être adoptée.

\end{problematique}



\subsubsection{Principe}

Le chiffrement asymétrique repose sur une \textit{paire de clés} :
\begin{itemize}

    \item une \textit{clé publique}, qui peut être librement diffusée ;
 
    \item une \textit{clé privée}, qui doit être gardée secrète.

\end{itemize}

Ces deux clés sont mathématiquement liées : un message chiffré avec l'une ne peut être déchiffré qu'avec l'autre. Ainsi, si Alice utilise la clé publique de Bob pour chiffrer un message, seul Bob, qui détient la clé privée correspondante, pourra le déchiffrer. Ce système permet d'échanger des informations de manière sécurisée sans nécessiter de clé secrète partagée au préalable.

Ce type de chiffrement repose sur des \og \textit{fonctions mathématiques à sens unique} \fg. Il s'agit de fonctions faciles à calculer dans un sens, mais pratiquement impossibles à inverser sans une information secrète (la clé privée). Connaître une clé publique ne permet donc pas de retrouver la clé privée associée.

Toutefois, le chiffrement asymétrique est bien plus coûteux en calcul que le chiffrement symétrique. Il est donc rarement utilisé pour chiffrer de grandes quantités de données, mais principalement pour établir un canal sécurisé afin d'échanger une clé de chiffrement symétrique. Une fois cette clé secrète transmise de manière sécurisée, la communication peut se poursuivre avec un algorithme symétrique (AES par exemple), plus rapide et mieux adapté aux flux temps réel (voix, vidéo) ou aux échanges volumineux. 

\subsubsection{Chiffrement RSA}

En 1977, Rivest, Shamir et Adleman ont proposé un système de chiffrement asymétrique connu sous le nom de RSA, fondé sur la difficulté de factoriser de grands nombres premiers.

Chaque interlocuteur génère de son côté sa propre paire de clés $(K_p, K_s)$ :

\begin{itemize}

	\item \textit{une clé publique $K_p$} : diffusée librement, elle est utilisée par quiconque souhaite envoyer un message chiffré à son propriétaire. Un message clair $m$ devient un message chiffré $c = K_p(m)$.

	\item \textit{une clé privée $K_s$} : conservée secrète par le destinataire, elle lui permet de retrouver le message initial en appliquant l'opération inverse :
	$$K_s(c) = K_s(K_p(m)) = m$$

\end{itemize}

L'efficacité de ce chiffrement repose sur une fonction à sens unique : la multiplication de deux très grands nombres premiers est facile à réaliser, mais la factorisation du produit obtenu est extrêmement difficile. Ainsi, la connaissance de la clé publique $K_p$ ne permet pas d'en déduire la clé privée $K_s$.

\begin{Exemple} 
Alice génère sa paire de clés $(K_p^A, K_s^A)$ et Bob génère de son côté $(K_p^B, K_s^B)$. Alice souhaite recevoir de Bob un message qu'elle seule pourra déchiffrer. Ève peut intercepter toutes leurs communications.

\begin{itemize}
	\item Alice diffuse sa clé publique $K_p^A$.
	
	\item Bob utilise la clé publique $K_p^A$ pour chiffrer son message clair $m$ : il génère un message chiffré $c = K_p^A(m)$.
	
	\item Bob envoie $c$ à Alice.
	
	\item Alice utilise sa clé privée pour déchiffrer le message de Bob : $m = K_s^A(K_p^A(c))$.
	
	\item Pendant ce temps, Ève a intercepté $K_p^A$ mais aussi $c = K_p^A(m)$. Heureusement pour Alice et Bob, elle ne peut déduire ni $m$ à partir de $K_p^A(m)$ ni $K_s^A$ à partir de $K_p^A$.

\end{itemize}

\end{Exemple}

\begin{Remarque}

Bob peut aussi utiliser sa clé privée pour signer un message (chiffrement avec sa clé privée). Ainsi, toute personne possédant la clé publique pourra vérifier que le message provient bien de Bob, assurant son authenticité.

\end{Remarque}


Briser RSA par force brute reviendrait à factoriser un très grand nombre, c'est-à-dire retrouver les deux nombres premiers utilisés pour générer la clé publique. Actuellement, les clés doivent mesurer au moins \textit{2~048 bits} pour garantir une sécurité suffisante, bien que certaines applications utilisent déjà des clés de \textit{4~096~bits} pour anticiper les progrès du calcul informatique.

\subsection{Sécurisation des échanges sur le web}
\enlargethispage*{3em}


Le protocole HTTPS est un protocole HTTP sécurisé où HTTP est complété par une surcouche qui sert aux échanges entre navigateurs et serveurs web. La problématique de HTTPS est de fournir une navigation sécurisée sur des sites authentifiés par certificat, sans la ralentir (par des calculs cryptographiques trop lourds ou par un échange de données significativement plus volumineuses du fait du chiffrement).

Pour ce faire, on utilise le protocole TLS (Transport Layer Security) qui vient compléter HTTP pour former HTTPS, en combinant chiffrement symétrique et asymétrique.

La connexion à un site web sécurisé par HTTPS commence par une requête classique (HTTP) vers le serveur. Le serveur répond et démarre la phase initiale, propre à TLS (sur un port dédié, le port 443, différent du port 80 propre à HTTP), appelée \og \textit{poignée de main TLS}. En voici une décomposition (voir figure \ref{https}) :

\begin{itemize}

	\item le serveur commence par envoyer au client son certificat, sa clé publique $K_p^s$, la signature de son certificat par une autorité de certification ;

	\item le client vérifie la signature du certificat (en utilisant la clé publique de l'autorité de certification) ;

	\item le client génère aléatoirement une clé de chiffrement symétrique K (\textit{clé de session}) et utilise la clé publique du serveur pour la chiffrer : $K_p^s(K)$ ;

	\item le serveur reçoit la clé chiffrée et la déchiffre à l'aide de sa clé privée car $K=K_s^s(K_p^s(K))$. Il dispose alors de la clé de chiffrement symétrique $K$. Les données échangées par le protocole HTTP peuvent dès lors être chiffrées pour toute la durée de la session, par exemple avec l'algorithme AES.

\end{itemize}

\enlargethispage*{3em}

\begin{figure}
\begin{center}
\includegraphics{303_08-https}
\figcaption{Utilisation des chiffrements symétrique et asymétrique sur le web}
\label{https}
\end{center}
\end{figure}

\Par

\begin{aretenir}

Chiffrement symétrique (exemple : AES) : il utilise une clé partagée, secrète, pour chiffrer et déchiffrer. La taille de la clé doit être suffisamment grande pour parer les attaques par force brute. La clé doit être échangée de façon sûre et nécessite une méthode sécurisée (chiffrement asymétrique).

\Par

Chiffrement asymétrique (exemple : RSA) : chacun génère sa paire clé privée-clé publique. Le lien entre les deux clés repose sur l'existence de fonctions mathématiques en pratique impossible à inverser. 

\Par

Sécurisation d'une communication (exemple : HTTPS) : elle s'appuie sur le chiffrement asymétrique pour la signature et l'authentification de l'émetteur et permet l'échange sécurisé d'une clé de chiffrement symétrique.

\end{aretenir}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%