+Le but est de faire décoder par un oracle tout ou une partie d'un message chiffré intercepté. Le décryptage se fait par bloc de 16 octets et nécessite le bloc chiffré le précédant ou l'\emph{IV} dans le cas du premier bloc. Pour notre test nous partons du principe que l'attaquant a intercepté un paquet chiffré, qu'il en a compris la structure et qu'il a deviné que l'\emph{IV} correspondait au \emph{timestamp}.
+
+Nous utilisons une attaque basée sur l'information renvoyée par l'oracle concernant la présence d'un bourrage valide. D'après le protocole un \emph{MAC} est calculé à partir des données non-bourrées, puis le bourrage est ajouté pour obtenir une taille multiple de 16, et finalement les données et le bourrage sont chiffrés. Lors du traitement par l'oracle, les données sont d'abord déchiffrées puis le bourrage est contrôlé. S'il n'est pas valide un paquet d'erreur est renvoyé au client (\emph{CryptError}). Si le bourrage est correct, alors celui-ci est retiré et les données restantes sont authentifiées à l'aide du \emph{MAC}. Si l'authentification échoue alors un paquet d'erreur est renvoyé au client (\emph{AuthError}).
+
+La valeur des octets du bourrage correspond à sa taille, par exemple un bourrage de longueur trois est représenté par \emph{[0x03, 0x03, 0x03]}. Si les données avant bourrage sont déjà multiple de 16, alors un bourrage de longueur 16 est ajouté de sorte qu'un bourrage soit toujours présent.
+
+\begin{figure}
+\begin{center}
+\includegraphics[scale=0.6]{diagramme_AES-CBC.eps}
+\caption{\label{diagramme_AES-CBC} \textit{Décryptage par un oracle, AES-CBC.}}
+
+\end{center}
+\end{figure}
+
+La figure \ref{diagramme_AES-CBC} illustre la structure de l'attaque. \emph{IV} et \emph{D} n'ont pas d'importance dans notre cas. \emph{X} est le bloc à décrypter (\emph{ciphertext}), \emph{X'} est le bloc à décrypter après avoir été décodé par \emph{AES} mais avant d'avoir été \og xoré \fg{} par \emph{F}. \emph{F} correspond à un bloc qui sera forgé par nos soins durant le décryptage de \emph{X}. De plus \emph{C}, qui n'est pas illustré sur le schéma, correspond au bloc précédent \emph{X} ou à l'\emph{IV} si \emph{X} est le premier bloc et \emph{R} correspond au message décrypté (\emph{plaintext}).
+
+Dans un premier temps nous allons chercher le premier octet $b$ de $F$ noté $F_{1}$ en itérant celui ci de 0 à 255. Pour chaque itération un paquet de commande est envoyé à l'oracle comprenant en guise de données chiffrées : $F + X$. Le paquet d'erreur renvoyé va nous indiquer si le bourrage est correct (\emph{AuthError}) ou s'il ne l'est pas (\emph{CryptError}). Pour le premier octet nous allons chercher le bourrage \emph{[0x01]}, pour le deuxième le bourrage \emph{[0x02, 0x02]} et ainsi de suite jusqu'à l'octet 16.
+
+Dès qu'un paquet d'erreur \emph{AuthError} est reçu alors nous pouvons calculer $X'_{1} = F_{1} \oplus b$ puis le premier octet de notre message décrypté $R_{1} = X'_{1} \oplus C_{1}$. Avant de passer à l'octet suivant $b' = b + 1$ il faut s'assurer que les $b$ premiers octets de \emph{E} vaudront bien $b'$ lors du décryptage par l'oracle. Pour ce faire on met à jour \emph{F} comme ceci : $\forall i \in [1, \ldots, b], F_{i} = b' \oplus X_{i}$.
+
+Une subtilité existe pour la recherche du premier octet : il est possible que le paquet d'erreur \emph{AuthError} corresponde, avec une faible probabilité, à un autre bourrage que \emph{[0x01]}. Pour prévenir ce cas il faut, pour ce premier octet, envoyer un paquet de commande pour toutes les valeurs de $F_{1}$ et compter le nombre de paquets d'erreur \emph{AuthError} reçus. Si ce nombre est égal à 1 alors on peut passer à $b'$, sinon il faut recommencer en modifiant $F_{2} = (F_{2} + 1)\, mod\, 256$.
+
+Le code correspondant à cette attaque peut être exécuté par la commande suivante :
+
+\begin{lstlisting}
+$> cargo run --release -- oracle-weak
+\end{lstlisting}
+
+La sortie est la suivante :
+
+\begin{lstlisting}[breaklines, basicstyle=\small]
+The oracle machine has found the plain block!:
+ Expected block: [242, 93, 12, 22, 8, 164, 4, 77, 200, 120, 189, 71, 75, 189, 2, 2]
+ Decrypted block: [242, 93, 12, 22, 8, 164, 4, 77, 200, 120, 189, 71, 75, 189, 2, 2]
+\end{lstlisting}
+
+
+\subsection{Calcul de la complexité moyenne de l'attaque en terme de nombre de requêtes effectuées auprès de l'oracle}
+
+Sans prendre en compte la particularité du premier octet illustré à la section précédente, la complexité moyenne pour le décryptage d'un bloc de 16 octets est de $16 * 256 / 2 = 2048$ requêtes.
+
+Dans l'exemple présenté dans le code, le nombre de requêtes est de 2099. La durée d'exécution est de ~180 ms, cette relative longue durée est certainement due à un overhead engendré par les couches réseau \emph{TCP/IP}.