\documentclass[a4paper,french,12pt]{article}

\title{Théorie de l'information et Cryptologie}
\author{}
\date{Dernière compilation~: \today{} à \currenttime}

\usepackage{styles}

\begin{document}

\maketitle
\tableofcontents

\clearpage

\section{Introduction}

    L'algorithme de chiffrement est \emph{connu publiquement}.
    C'est le principe de Kirshoff.
    Il faut se baser sur la qualité de l'algorithme et la taille des clés.
    Un algorithme gardé secret finira tôt ou tard par être rendu publique (sur un forum par exemple).

    \subsection{Cas d'usage}

        \begin{itemize}
            \item Clé à usage unique
            \item Chiffrement de fichiers
            \item Signatures numériques
            \item Communication anonyme
            \item Monnaie numérique
            \item Élection privée
            \item Enchère
        \end{itemize}

    \subsection{Une science rigoureuse}

        \paragraph{Les trois étapes de la cryptographie}

            \begin{itemize}
                \item spécifier avec précision le \emph{modèle de menace}
                \item proposer une construction
                \item prouver que briser la construction résoudra un problème difficile sous-jacent
            \end{itemize}

        \paragraph{Choses à retenir}

            La cryptographie est un outil formidable et à la base de nombreux mécanismes de sécurité.
            Mais elle n'est \emph{pas}~:

            \begin{itemize}
                \item la solution à tous les problèmes
                \item fiable à moins d'être implémentée et utilisée correctement
                \item quelque chose à essayer d'inventer soi-même
            \end{itemize}

\section{Cryptographie classique}

    \subsection{Chiffrement de César}

        C'est un chiffrement simple par substitution.
        On définit un décalage et on remplace chaque lettre de l'alphabet par la lettre résultant de ce décalage~:
        \begin{align*}
            C = E(k,p) = (p+k) \mod{26} \\
            p = D(k,C) = (C-k) \mod{26}
        \end{align*}

        Ce chiffrement est vulnérable à une attaque par force brute pour trois raisons~:

        \begin{enumerate}
            \item Les algorithmes de chiffrement et déchiffrement sont connus.
            \item Il n'y a que 25 clés à essayer.
            \item La langue du texte brut est connue et facilement reconnaissable.
        \end{enumerate}

        De plus, une lettre donnant toujours la même lettre après chiffrement, il est facile de faire une analyse fréquentielle pour deviner le décalage à opérer.

    \subsection{Chiffrement monoalphabétique}

        Une \emph{permutation} d'un ensemble fini d'éléments $S$ est une suite ordonnée de tous les éléments de $S$, chaque élément apparaissant exactement une fois.

        Par exemple~:
        \begin{align*}
            S = \{a,b,c\} \quad &\implies P = \{abc,acb,bac,bca,cab,cba\} \\
            |S| = n \quad &\implies |P| = n!
        \end{align*}

        Comparativement au chiffrement de César, si la lettre chiffrée peut prendre n'importe quelle permutation, alors il y a aura $26!$ clés différentes, c'est à dire $\approx 4 \times 10^{26} \approx 2^{86}$.

        Là encore, ce chiffrement est vulnérable aux analyses fréquentielles.
        Comme solution au problème, on peut~:

        \begin{itemize}
            \item chiffrer plusieurs lettres à la fois
            \item utiliser plusieurs alphabets
        \end{itemize}

    \subsection{Chiffrements par substitution polygrammique --- Playfair}

        Dans les systèmes polygrammiques, un groupe de $n$ lettres est chiffré par un groupe de $m$ symboles.
        Les lettres ne sont donc pas chiffrées séparément, mais par groupes.
        On parle parfois de chiffrement \emph{par blocs}.

        Exemple de Playfair~: la substitution se base sur la position des lettres dans un rectangle, selon plusieurs règles~:

            \begin{enumerate}

                \item Si les deux lettres sont sur les coins d'un rectangle, alors les lettres chiffrées sont sur les deux autres coins~:

                    \begin{center}
                    \begin{tabular}{ccccc}
                        B & Y & D & G & Z \\
                        J & S & F & U & P \\
                        L & \color{red}{\textbf{A}} & R & \color{blue}{\textbf{K}} & X \\
                        C & \color{blue}{\textbf{O}} & I & \color{red}{\textbf{V}} & E \\
                        Q & N & M & H & T \\
                    \end{tabular}
                    \end{center}

                \item Si deux lettres sont sur la même ligne, on prend les deux lettres qui les suivent immédiatement à leur droite~:

                    \begin{center}
                    \begin{tabular}{ccccc}
                        B & Y & D & G & Z \\
                        \color{blue}{\textbf{J}} & \color{red}{\textbf{S}} & \color{blue}{\textbf{F}} & \color{red}{\textbf{U}} & P \\
                        L & A & R & K & X \\
                        C & O & I & V & E \\
                        Q & N & M & H & T \\
                    \end{tabular}
                    \end{center}

                \item Si deux lettres sont sur la même colonne, on prend les deux lettres qui les suivent immédiatement en dessous~:

                    \begin{center}
                    \begin{tabular}{ccccc}
                        B & Y & \color{red}{\textbf{D}} & G & Z \\
                        J & S & F & U & P \\
                        L & A & \color{blue}{\textbf{R}} & K & X \\
                        C & O & \color{red}{\textbf{I}} & V & E \\
                        Q & N & \color{blue}{\textbf{M}} & H & T \\
                    \end{tabular}
                    \end{center}

                \item Si le bigramme est composé d'une lettre répétée, on insère une nulle (souvent le X) entre les deux pour éliminer le doublon.

            \end{enumerate}

    \subsection{Chiffrement polyalphabétique --- Vigénère}

        Le chiffrement de Vigénère utilise non pas un mais 26 alphabets décalés pour chiffrer un message.
        Cela réduit les possibilités d'analyse fréquentielle.

        \begin{tabular}{lccccccccccccccccc}
            \toprule
            clair     & c & h & i & f & f & r  & e & d & e  & v & i & g & e & n & e  & r & e \\
            \midrule
            clef      & B & A & C & H & E & L  & I & E & R  & B & A & C & H & E & L  & I & E \\
            \midrule
            décalage  & 1 & 0 & 2 & 7 & 4 & 11 & 8 & 4 & 17 & 1 & 0 & 2 & 7 & 4 & 11 & 8 & 4 \\
            \midrule
            chiffré   & d & h & k & m & j & c  & m & h & v  & w & i & i & l & r & p  & z & i \\
            \bottomrule
        \end{tabular}

        \subsubsection{Déchiffrement}

            \paragraph{Méthode Babbage-Kasiski}

                On cherche des séquences de lettres qui apparaissent plus d'une fois dans le texte.
                Deux cas se présentent~:

                \begin{itemize}
                    \item soit la même séquence de lettres du texte clair a été chiffrée avec la même partie de la clef
                    \item soit deux suites de lettres différentes dans le texte clair ont par pure coïncidence engendré la même suite dans le texte chiffré
                \end{itemize}

                Comme le premier cas est le plus probable, il permettra de deviner la longueur de la clef.

            \paragraph{Méthode Bazeries}

                Cette méthode se base sur l'existence d'un mot \emph{probable} et préconise la recherche du mot-clef.

            \paragraph{Méthode Friedman}

                L'indice de coïncidence (IC) est la probabilité que deux lettres choisies aléatoirement dans un texte soient identiques.

                \begin{align*}
                    IC = \frac{n_A(n_A - 1) + n_B(n_B - 1) + \cdots + n_Z(n_Z -1)}{n(n-1)}
                \end{align*}

                \begin{tabularx}{\linewidth}{lcccccccc}
                    \toprule
                    \textbf{Langue} & allemand & anglais & espagnol & esperanto & français & italien & norvégien & suédois \\
                    \midrule
                    \textbf{IC} & $0.072$ & $0.065$ & $0.074$ & $0.069$ & $0.074$ & $0.075$ & $0.073$ & $0.071$ \\
                    \bottomrule
                \end{tabularx}

                Cet indice a des propriétés très intéressantes~:

                \begin{itemize}

                    \item Pour une langue avec un alphabet de 26 lettres où chaque lettre a la même fréquence~:
                        \begin{equation*}
                            IC=\frac{1}{26} \approx 0.038
                        \end{equation*}

                    \item Pour toute substitution monoalphabétique et pour toute transposition, la distribution des fréquences est invariante, donc l'IC sera la même que pour le texte clair.

                    \item Donc, si l'on calcule l'IC d'un texte chiffré avec un chiffrement monoalphabétique, on devrait trouver un IC égal environ à 0.074 en français.
                        Si l'IC est beaucoup plus petit (par exemple 0.050), le chiffrement est probablement polyalphabétique.
                \end{itemize}

                On va considérer les sous-chaînes de lettres obtenues en prenant les lettres à différents intervalles donnés.
                À chaque fois, on calcule l'IC et on sélectionne l'intervalle dont l'IC correspond à la langue du texte.

\section{Stéganographie}

    La stéganographie, en grec \emph{écriture couverte}, cache les messages dans un support.

    \paragraph{Encres invisibles}

        \begin{itemize}
            \item apparaissant avec le feu
            \item apparaissant avec de la poudre
            \item utilisant des produits chimiques
            \item utilisant des fluides corporels
        \end{itemize}

    \paragraph{Les Ave Maria de Trithème}

        On établit un dictionnaire \texttt{lettre} $\rightarrow$ \texttt{mot}, et on transmet un texte (un poème par exemple).

        \begin{tabularx}{\linewidth}{YXYX}
            \toprule
            \textbf{A} & dans les cieux & \textbf{N} & en Paradis \\
            \textbf{B} & à tout jamais & \textbf{O} & toujours \\
            \textbf{C} & un monde sans fin & \textbf{P} & dans la divinité \\
            \textbf{D} & en une infinité & \textbf{Q} & dans la déité \\
            \textbf{E} & à perpétuité & \textbf{R} & dans la félicité \\
            \textbf{F} & sempiternel & \textbf{S} & dans son règne \\
            \textbf{G} & durable & \textbf{T} & dans son royaume \\
            \textbf{H} & sans cesse & \textbf{U, V, W} & dans la béatitude \\
            \textbf{I, J} & irrévocablement & \textbf{X} & dans la magnificence \\
            \textbf{K} & éternellement & \textbf{Y} & au trône \\
            \textbf{L} & dans la gloire & \textbf{Z} & en toute éternité \\
            \textbf{M} & dans la lumière & & \\
            \bottomrule
        \end{tabularx}

        \begin{center}
            Sempiternel dans la béatitude, \\
            Au trône à perpétuité, \\
            En toute éternité dans la béatitude, \\
            Oui~! toujours dans la béatitude. \\
            Dans son règne à perpétuité \\
            Et dans son royaume à perpétuité, \\
            Dans son règne dans une infinité. \\
            À perpétuité dans un monde sans fin, \\
            Toujours dans la béatitude, \\
            Oui~! dans la béatitude à perpétuité. \\
            Dans la félicité de son royaume, \\
            Et dans son règne~!
        \end{center}

        \hfill\textcolor{red}{\textbf{<<~Fuyez~! Vous êtes découverts~>>}}

    \paragraph{Grille de Cardan}

        Le texte est caché dans une grille à laquelle il faut donc retirer des lettres pour découvrir le message original.

    \paragraph{L'alphabet bilitère de Francis Bacon}

        Chaque lettre est codée par une suite finie binaires (par exemple \texttt{g}$\rightarrow$\texttt{AABBA}).
        Le mot \texttt{venez} pourra alors par exemple donner \texttt{BAABB AABAA ABBAA AABAA BABBB}. \\
        Il faut ensuite un texte de couverture quelconque mais cinq fois plus long que le message à transmettre (car la longueur de la clé est ici 5) $\rightarrow$ ``Il fait souvent froid en hiver''. \\
        Le texte sera imprimé avec deux types différents de caractères (type A et type B)~:

        \begin{center}
            \textit{I}l f\textit{ai}t s\textit{o}uve\textit{nt} froi\textit{d} en \textit{h}i\textit{ver}
        \end{center}

    \paragraph{Les messages cachés de William Friedman}

        William Friedman a montré qu'il était possible de cacher ce qu'on voulait dans une image, par exemple en jouant sur les ombres des briques d'un château, ou bien la nomenclature d'une plante sur un dessin d'étude biologique.

    \paragraph{Message caché dans une image numérique}

        Une technique de base, appelée LSB pour Least Significant Bit, consiste à modifier les bits de poids faible des pixels codant une image.
        Cette modification sur le bit de poids faible n'aura qu'un faible impact sur les couleurs de l'image.

        La récupération du texte se fait alors de la manière suivante~:

        \begin{enumerate}
            \item récupérer le tableau des pixels décrivant l'image
            \item remplacer un nombre pair par 0 et un nombre impair par 1
            \item grouper les bits par groupes de 8
            \item convertir chaque octet en nombre décimal
            \item écrire les caractères correspondant aux codes ASCII obtenus
        \end{enumerate}

\section{Cryptographie symétrique}

    La clé qui chiffre le message sert aussi à le déchiffrer.
    Ceci pose le problème du partage de clé, car les deux côtés de l'échange doivent posséder la même.
    On va donc échanger la clé via un canal fiable, différent de celui utilisé pour la communication.

    \subsection{Chiffrement par bloc}

        Avec un chiffrement par bloc, on chiffre des blocs de taille fixe.

        \begin{center}
        \begin{tikzpicture}
            \draw[latex-latex] (-4,2) -- (-2,2) node[above,midway]{$b$ bits};
            \node[rectangle,draw,thick,minimum width=2cm] (plain1) at (-3,1.5) {plaintext};
            \node (k1) at (-5.5,0) {clé (K)};
            \node[rectangle,draw,thick,fill=gray!30] (encryption) at (-3,0) {\parbox{2.5cm}{\centering Algorithme de \\ chiffrement}};
            \node[rectangle,draw,thick,minimum width=2cm] (cipher1) at (-3,-1.5) {ciphertext};
            \draw[latex-latex] (-4,-2) -- (-2,-2) node[below,midway]{$b$ bits};
            \draw[-latex] (k1) -- (encryption);
            \draw[-latex] (plain1) -- (encryption);
            \draw[-latex] (encryption) -- (cipher1);

            \draw[latex-latex] (4,2) -- (2,2) node[above,midway]{$b$ bits};
            \node[rectangle,draw,thick,minimum width=2cm] (cipher2) at (3,1.5) {ciphertext};
            \node (k2) at (0.5,0) {clé (K)};
            \node[rectangle,draw,thick,fill=gray!30] (decryption) at (3,0) {\parbox{2.5cm}{\centering Algorithme de \\ déchiffrement}};
            \node[rectangle,draw,thick,minimum width=2cm] (plain2) at (3,-1.5) {plaintext};
            \draw[latex-latex] (4,-2) -- (2,-2) node[below,midway]{$b$ bits};
            \draw[-latex] (k2) -- (decryption);
            \draw[-latex] (cipher2) -- (decryption);
            \draw[-latex] (decryption) -- (plain2);

            \draw[-latex] (cipher1) -- (-0.75,-1.5) -- (-0.75,1.5) -- (cipher2);
        \end{tikzpicture}
        \end{center}

    \subsection{Chiffrement par flot}

        Avec un chiffrement par flot, on chiffre des données de taille quelconque.

        \begin{center}
        \begin{tikzpicture}
            \node[rectangle,draw,thick,fill=gray!30,text height=4cm,minimum width=3cm] (encryption) at (-3,0) {chiffrement};
            \node[rectangle,draw,thick,fill=white] (bitstream1) at (-3,1) {\parbox{2cm}{bit-stream \\ generation}};
            \node (k1) at (-6,1) {clé ($K$)};
            \draw[-latex] (k1) -- (bitstream1);
            \node (plain1) at (-6,-1) {\parbox{2cm}{\centering plaintext\\($p_i$)}};
            \node[circle,draw,thick,fill=white,minimum width=0.5cm] (xor1) at (-3,-1) {};
            \draw[thick] (-3.25,-1) -- (-2.75,-1); \draw[thick] (-3,-1.25) -- (-3,-0.75);
            \draw[-latex] (bitstream1) -- (xor1) node[midway,left]{$k_i$};
            \draw[-latex] (plain1) -- (xor1);

            \node (cipher) at (0,-1) {\parbox{2cm}{\centering ciphertext\\($c_i$)}};

            \node[rectangle,draw,thick,fill=gray!30,text height=4cm,minimum width=3cm] (decryption) at (3,0) {déchiffrement};
            \node[rectangle,draw,thick,fill=white] (bitstream2) at (3,1) {\parbox{2cm}{bit-stream \\ generation}};
            \node (k2) at (0,1) {clé ($K$)};
            \draw[-latex] (k2) -- (bitstream2);
            \node (plain2) at (6,-1) {\parbox{2cm}{\centering plaintext\\($p_i$)}};
            \node[circle,draw,thick,fill=white,minimum width=0.5cm] (xor2) at (3,-1) {};
            \draw[thick] (3.25,-1) -- (2.75,-1); \draw[thick] (3,-1.25) -- (3,-0.75);
            \draw[-latex] (bitstream2) -- (xor2) node[midway,left]{$k_i$};
            \draw[-latex] (xor1) -- (cipher);
            \draw[-latex] (cipher) -- (xor2);
            \draw[-latex] (xor2) -- (plain2);
        \end{tikzpicture}
        \end{center}

    \subsection{Mode opératoire}

        On parle de mode d'opération pour parler de la manière de traiter les blocs de texte clairs et chiffrés au sein d'un algorithme de chiffrement par bloc.
        Chaque mode propage différemment les erreurs lors des différentes étapes de modification de données pendant le chiffrement.
        Historiquement, on cherchait à garantir l'intégrité.
        Aujourd'hui, il existe des mécanismes associant chiffrement et authentification.

        \begin{tabularx}{\linewidth}{XXX}
            \toprule
            \textbf{Mode} & \textbf{Description} & \textbf{Application} \\
            \toprule
            Electronic Code Book (ECB) & Chaque bloc est chiffré indépendemment avec la même clé. & Transmission de valeurs uniques (comme une clé de chiffrement). \\
            \midrule
            Cipher Block Chaining (CBC) & Un XOR du ciphertext du bloc précédent et du plaintext du bloc suivant sert d'entrée à l'algorithme de chiffrement. & Transmission générique orientée par bloc, authentification. \\
            \bottomrule
        \end{tabularx}

        \paragraph{Electronic Code Book (ECB)}

            Le message à chiffrer est subdivisé en plusieurs blocs qui sont chiffrés séparément les uns après les autres.

            L'avantage est qu'on peut paralléliser le chiffrement et le déchiffrement.

            L'inconvénient est que deux blocs identiques seront chiffrés de la même manière.
            On peut donc construire un dictionnaire (\emph{codebook}) associant texte chiffré et texte en clair.
            Cela veut dire un produit non aléatoire et permet donc une attaque par rejeu.

        \paragraph{Cipher Block Chaining (CBC)}

            C'était le mode le plus largement déployé dans le passé.

            Ses défauts~:

            \begin{itemize}
                \item Il nécessite un bourrage (\emph{padding}) pour produire un multiple de la taille du bloc.
                \item Il est vulnérable aux \emph{padding oracle attacks} (comme POODLE sur SSL).
            \end{itemize}

\section{Cryptographie appliquée au WiFi}

    \subsection{Les attaques sur WiFi}

        Le WiFi fonctionne en half-duplex.

        \paragraph{L'espionnage}

            Il est plus facile avec les communications radio, typiquement dans les 30 mètres.

        \paragraph{Wardriving}

            Il s'agit de la découverte des réseaux WiFi.
            Cela nécessite une la bonne carte WiFi, logiciel, GPS, voiture.
            On génère une carte géographique qui recense les réseaux WiFi (voir \url{www.wigle.net} et \url{www.wardriving.com}).

        \paragraph{DoS}

        On peut émettre des ondes radio et envoyer un paquet de \emph{désassociation}, pour déconnecter les utilisateurs et les forcer à se reconnecter quelques instants après.
        Pour cela, on envoie des paquets CTS sans arrêt en se faisant passer pour le point d'accès.

        Il n'y a pas de solution dans le standard 802.11 au problème DoS.
        Il faut donc un mécanisme de détection et réagir dès qu'une attaque a lieu.

        \paragraph{Premières solutions}

            \begin{itemize}
                \item Planification radio pour limiter les débordements.
                \item Éviter les AP pirates (rogue AP)~: par exemple en utilisant des controlleurs WiFi.
                \item Masquer le SSID~: fausse bonne idée, car l'attaque le trouvera de toute façon dans toutes les trames.
                \item Filtrage par adresse MAC~: lourd à mettre en \oe{}uvre, et pas très utile (on peut faire du spoofing).
                \item Créer un réseau WiFi isolé avec des VLANs~: pas productif.
            \end{itemize}

    \subsection{Chronologie}

        \begin{itemize}

            \item 1999, \emph{802.11} d'origine --- authentification 802.11 \emph{native}, chiffrement \emph{WEP statique}.
                L'objectif était de fournir le même niveau de sécurité que le filaire (donc aucune sécurité).
                Aussi, la cryptographie était limitée par la puissance des appareils et par la loi (interdiction d'avoir des clés trop grandes, interdiction d'exporter les algorithmes).

            \item 2001, \emph{802.1X} avec WEP (LEAP) --- authentification \emph{802.1X} avec gestion des clés, protection des données par \emph{WEP}.
                Le protocole 802.1X, au niveau MAC, va contacter un serveur d'authentification.
                Ces serveurs sont appelés AAA (Authentication, Authorisation, Accounting).
                802.1X permet également de changer les clés, contrairement au \emph{WEP statique}.

            \item 2003, \emph{WPA} --- authentification \emph{802.1X} avec une gestion des clés améliorée, protection des données par \emph{TKIP}.
                On a patché le WEP avec TKIP parce que WEP avait été cassé.

            \item 2004, \emph{WPA2} --- \emph{standard IEEE 802.11i}, authentification 802.1X avec une gestion des clés améliorée, protection des données par \emph{AES} et \emph{pré-authentification}.

            \item 2018, \emph{WPA3} --- handshake \emph{dragonfly}, \emph{PFS} (Perfect Forward Secrecy), management frames protection (obligatoire).
                Deux chercheurs ont trouvé une faille dans WPA2 en 2017.
                Le consortium WiFi (des industriels) ont développé WPA3, mais ce n'est pas un organisme de standardisation, donc le standard n'est pas encore sorti.

        \end{itemize}

    \subsection{Résumé}

        \begin{tabularx}{\linewidth}{YYYYY}
            \toprule
            & \textbf{WEP} & \textbf{WPA} & \textbf{WPA2} & \textbf{WPA3} \\
            \toprule
            \textbf{Acronyme} & Wired Equivalent Privacy & WiFi Protected Access & WiFi Protected Access 2 & WiFi Protected Access 3 \\
            \midrule
            \textbf{Année de développement} & 1997 & 2003 & 2004 & 2018 \\
            \midrule
            \textbf{Niveau de sécurité} & Très faible & Faible & Élevé & Très élevé \\
            \midrule
            \textbf{Chiffrement} & RC4 & TKIP et RC4 & AES-CCMP & AES-CCMP et AES-GCMP \\
            \midrule
            \textbf{Taille de clé} & 64bit, 128bit & 128bit & 128bit & 128bit, 256bit \\
            \midrule
            \textbf{Authentification} & Open System et clé partagée & clé pré-partagée et 802.1X avec EAP & clé pré-partagée et 802.1X avec EAP & AES-CCMP et AES-GCMP \\
            \midrule
            \textbf{Intégrité} & CRC-32 & MIC 64bit & CCMP avec AES & SHA-2 \\
            \bottomrule
        \end{tabularx}

    \subsection{WEP}

        Wired Equivalent Privacy~: l'objectif est de rendre le LAN sans fil aussi sécurisé qu'un LAN filaire.

        Fonctionnalités~:

        \begin{itemize}
            \item pas de gestion de clés
            \item pas de protection contre les attaques par rejeu
            \item \emph{confidentialité} (RC4 stream cipher encryption)
            \item \emph{intégrité}~: mécanisme CRC-32
            \item \emph{authentification} par clé utilisateur partagée
        \end{itemize}

        La confidentialité est assurée par un chiffrement grâce à un algorithme à flot continu.

        \begin{center}
        \begin{tikzpicture}
            \node [rectangle,draw,thick,fill=cyan!30] (plain) at (0,1.5) {plaintext};
            \node [rectangle,draw,thick,fill=cyan!30] (key) at (-4,1.5) {secret key};
            \node [circle,draw,thick,fill=purple!30,minimum height=0.5cm,minimum width=0.5cm] (xor) at (0,0) {};
            \node [rectangle,draw,thick,fill=purple!30] (stream) at (-4,0) {stream cipher};
            \draw (0,0.22) -- (0,-0.22);
            \draw (-0.22,0) -- (0.22,0);
            \draw [-latex](key) -- (stream);
            \draw [-latex,thick](stream) -- (xor) node[above,midway]{keystream};
            \node [rectangle,draw,thick,fill=cyan!30] (cipher) at (0,-1.5) {ciphertext};
            \draw [-latex,thick](plain) -- (xor);
            \draw [-latex,thick](xor) -- (cipher);
        \end{tikzpicture}
        \end{center}

        \paragraph{RC4}

            Conçu par Ron Rivest en 1987 pour RSA Labs.
            L'algorithme a été gardé secret jusqu'en 1994, puis a été communiqué sur la liste de diffusion de Cypherpunks.

            Il est \emph{bytes-oriented}~: il génère caractère par caractère (un seul octet à chaque étape).
            Un secret partagé est nécessaire (par mot de passe par exemple), souvent de 40 bits (5 caractères) ou 128 bits (13 caractères).

            Les algorithmes stream cipher n'utilisent que des opérations basiques avec des XOR (pas d'exponentielle, de factorielle, de multiplication\ldots).
            Ils sont donc simples à implémenter et à déchiffrer.
            Par ailleurs, pas besoin de faire de bourrage (rendre la taille des blocs identiques).

            Un vecteur d'initialisation (IV) permet d'éviter la réutilisation du keystream.

        \paragraph{Danger de réutilisation de l'IV}

            Le WEP utilise des IV de 3 octets (24 bits).
            Chaque paquet reçoit un nouvel IV\@.
            La clé RC4 de chaque paquet est alors composé de l'IV, comme préfixe du secret partagé.
            Si la clé et l'IV sont les mêmes, alors le même keystream est utilisé.
            Le problème dans WEP, c'est que les IV sont fréquemment répétés.

            L'IV est souvent un compteur qui commence à zéro.
            Cela veut dire qu'un redémarrage provoque une réutilisation d'IV\@.
            De plus, comme il n'y a que 16 millions d'IV possibles, après avoir intercepté suffisamment de paquets, on est quasiment sûr de les répéter.
            Il y a 50\% de chances de réutilisation des clés après $2^{12}$ paquets.

        \paragraph{Intégrité WEP~: CRC}

            L'intégrité est assurée à l'aide d'un CRC\@.
            Mais le CRC ne vérifie pas l'intégrité cryptographique.
            Il est conçu pour détecter les erreurs aléatoires, pas les changements intelligents.

    \subsection{WPA}

        L'objectif, urgent, était de remplacer WEP\@.
        Le standard est WPA2.

        On a ajouté un compteur pour empêcher les attaques par rejeu.
        Le vecteur d'initialisation a une taille de 48 bits.
        Les clés sont actualisées dynamiquement grâce à TKIP\@.
        Dans WPA2, on utilise AES à la place de RC4 (utilisé dans WEP et WPA).

        \paragraph{WPA Personnel et Entreprise}

            Il y a deux façons d'utiliser WPA\@.

            \begin{enumerate}

                \item Personnel --- Utilise des clés pré-partagées (PSK).
                    Chaque appareil connecté à l'AP utilise le même secret.
                    L'utilisateur doit entrer une clé de 256 bits ou une passphrase utilisée pour générer une clé.
                    La passphrase est hachée conjointement avec le SSID\@.
                    L'authentification est basée sur \texttt{EAP-MD5}.

                \item Entreprise --- Authentification par serveur IEEE 802.1X, qui distribue différentes clés aux utilisateurs.
                    Souvent le serveur utilisé est Radius, ce qui permet de centraliser la gestion des informations d'identification des utilisateurs.

            \end{enumerate}

        \paragraph{Robust Security Network (RSN)}

            \begin{itemize}
                \item Contrôle d'accès~: on se base sur IEEE 802.1.
                    Le contrôle d'accès est basé sur le port.
                    Quand on est branché cela ne veut donc pas dire qu'on est authentifié.
                \item Authentification et génération des clés~: on utilise Extensible Authentication Protocol (EAP).
                \item Confidentialité, authenticité, intégrité et protection anti rejeu~: on utilise TKIP et CCMP\@.
            \end{itemize}

        \paragraph{Phases opérationnelles de 802.11i}

            \begin{enumerate}

                \item \textbf{Politique de sécurité} ---
                    Le probe request (Open System 802.11) renvoie toujours un ``Authentication Success'', pour des raisons de compatibilité des équipements.
                    La véritable authentification se fait dans la phase 2.

                \item \textbf{Authentification} ---
                    Après avoir détecté qu'on est en WPA Entreprise (pas de PSK), on va joindre un client Radius, qui demande une identité, \emph{Request Identity}, à laquelle sera répondue une \emph{Response Identity} (802.1X/EAP).
                    Le client Radius fait alors une \emph{Request Identity} au serveur Radius.
                    Ce serveur Radius va alors dériver la clé maîtresse dans un message EAP spécifique.
                    Puis un \emph{Radius Accept} est envoyé au client Radius, qui renvoie un \emph{802.1X Success} au Supplicant.

                    Le client Radius (AP), ne décapsule pas toute la trame reçue.
                    Il s'arrête à EAP, ce qui le rend plus léger~: il n'a qu'un protocole à implémenter.

                    EAP propose plusieurs méthodes de chiffrement pour permettre une négociation.
                    \texttt{md5} n'est pas utilisé, car il ne génère pas de clé maîtresse.
                    \texttt{TLS} nécessite un certificat.
                    Le plus utilisé est PEAP (Protected EAP).
                    On crée un tunnel SSL avec le certificat du serveur Radius.
                    C'est dans ce tunnel que l'on authentifie le client.

                    On peut aussi utiliser EAP/TTLS (Tunneled TLS), ce qui permet de supporter d'anciennes méthodes non supportées par EAP, car on les encapsule dans un tunnel.
                    On peut alors par exemple utiliser \texttt{MD5}, même s'il ne génère pas de clé maîtresse.

                \item \textbf{Dérivation et distribution des clés} ---
                    Une fois que le client est authentifié, le point d'accès initie un 4-way handshake.
                    Il permet de~:

                    \begin{itemize}
                        \item confirmer la connaissance de la PMK par le client
                        \item dériver une nouvelle PTK
                        \item installer les clés de chiffrement et d'intégrité
                        \item chiffrer le transport de la GTK
                        \item confirmer la suite de chiffrement choisie
                    \end{itemize}

                    \begin{enumerate}
                        \item L'AP envoie un ANonce (Nonce = Number used Once), aléatoire.
                        \item Le client dérive la PTK et envoie un SNonce aléatoire.
                        \item L'AP dérive la PTK, initialise la GMK et calcule la GTK\@.
                            Puis il envoie la GTK chiffrée.
                        \item Les deux entités sont synchronisées avant le chiffrement, puis le client envoie un ACK\@.
                    \end{enumerate}

                    Le port 802.1X est alors ouvert, le client et l'AP installent la PTK et la GTK\@.

                    \begin{itemize}
                        \item MK --- Master Key.
                            C'est une PSK pour WPA Personnel.
                        \item PMK --- Pairwise Master Key.
                        \item PTK --- Pairwise Transient Key (pour l'unicast).
                        \item GTK --- Group Transient Key (pour le multicast).
                    \end{itemize}

                \item \textbf{Confidentialité et intégrité des données} ---
                    Deux algorithmes de chiffrement sont possibles~: TKIP et CCMP\@.
                    TKIP procure des corrections pour chaque faille du WEP~:

                    \begin{itemize}
                        \item intégrité des messages~: un nouveau MIC (Message Integrity Code) peut être implémenté de manière logicielle sur processeurs lents
                        \item IV~: nouvelle méthode de sélection des IV, anti-rejeu et augmentation de la taille de l'IV
                        \item Per Packet Key Mixing~: pour obtenir des clés en apparence non liées
                        \item gestion des clés~: nouveau mécanisme pour la génération et la distribution des clés
                    \end{itemize}

                    CCMP (Counter-Mode/Cipher Block Chaining Message Authentication Code Protocol) est basé sur le chiffrement par bloc AES\@.
                    C'est un algorithme de chiffrement authentifié qui utilise une simple clé pour le chiffrement et l'authentification des données.

            \end{enumerate}

            WPA est un sous-ensemble de 802.11i.
            Le mode point à point (ad-hoc --- IBSS), la pré-authentification (handover), AES, font partie de 802.11i mais pas de WPA\@.

            Pour voir le fonctionnement d'AES~: \url{https://formaestudio.com/rijndaelinspector/archivos/Rijndael_Animation_v4_eng-html5.html}.

\end{document}
