{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# \n",
        "\n",
        "<img src=\"data:image/png;base64,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GRThCmArK6n/07KSrSxnapER1Yj5OD39Th0AXBsAX0XT01P7pqe/HkKavQdAR+aMLpcYFtHvB3ASusZQ0AL/Yv8AzygF6bJ+DZEAAAGeaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjEyMTU8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Civ/7UsAAEAASURBVHgB7L0FnJzXee//s5aZGcUrZrDYIMtsy2zLlp2kmP7btI3btElumqQpJOn9F5IUchuQbMmxjDHIKNkii3HFsFpm5lmQ7/MceXsNknZ2d+DMzO/ks1l5Z+Z9z/s9Z973nAd+z3UfSwMbCZAACZAACZAACZAACZAACZAACZAACZAACfghgVF+eE28JBIgARIgARIgARIgARIgARIgARIgARIgARIwBGj84kQgARIgARIgARIgARIgARIgARIgARIgARLwWwI0fvnt0PLCSIAESIAESIAESIAESIAESIAESIAESIAEaPziHCABEiABEiABEiABEiABEiABEiABEiABEvBbAjR++e3Q8sJIgARIgARIgARIgARIgARIgARIgARIgARo/OIcIAESIAESIAESIAESIAESIAESIAESIAES8FsCNH757dDywkiABEiABEiABEiABEiABEiABEiABEiABGj84hwgARIgARIgARIgARIgARIgARIgARIgARLwWwI0fvnt0PLCSIAE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\" width=\"100%\" alt=\"Cryptographie et sécurité\" />"
      ],
      "id": "c9168a74-c0b3-4d5a-8b22-3ce1564ecaaf"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# TP2. Chiffrement symétrique, oracles et cryptanalyse\n",
        "\n",
        "Dans ce TP nous travaillerons en Python 3, directement à l’intérieur de\n",
        "ce notebook jupyter.\n",
        "\n",
        "L’objectif de cette fiche est double :\n",
        "\n",
        "1.  d’une part découvrir l’utilisation en pratique d’AES, des modes\n",
        "    opératoires et du padding ;\n",
        "2.  d’autre part comprendre pourquoi la brique de chiffrement symétrique\n",
        "    ne suffit pas à assurer la confidentialité d’un protocole de\n",
        "    communication.\n",
        "\n",
        "Pour illustrer le second point, nous revisitons l’attaque du *padding\n",
        "CBC* vue en cours ainsi que l’attaque *chopchop* contre le protocole WEP\n",
        "de chiffrement de réseau sans fil.\n",
        "\n",
        "Nous avons choisi d’utiliser la bibliothèque\n",
        "[PyCryptodome](http://www.pycryptodome.org/). Pour rejouer cette fiche\n",
        "en dehors du TP, il convient d’installer une version récente de\n",
        "[PyCryptodome](http://www.pycryptodome.org/) sur votre système."
      ],
      "id": "aef587a8-18c7-46ba-8d14-3c769a5b4f06"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 1. Échauffement : bytes, XOR, AES, CBC/CTR et padding"
      ],
      "id": "9da26e96-4b7b-4bbf-bbbb-a4b9379add71"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "<div class=\"alert alert-block alert-info\">\n",
        "  <b>Objectifs — Partie 1 (≈ 30 min)</b>\n",
        "  <ul>\n",
        "    <li>écrire du code qui transforme un message texte en <code>bytes</code> et inversement ;</li>\n",
        "    <li>implémenter un XOR “octet à octet” pour chiffrer/déchiffrer un message simple ;</li>\n",
        "    <li>chiffrer puis déchiffrer un message avec AES en <b>CBC</b> et en <b>CTR</b> via PyCryptodome, en manipulant correctement <b>IV / nonce</b> et <b>padding</b>.</li>\n",
        "  </ul>\n",
        "</div>"
      ],
      "id": "b7624384-5612-496e-b878-bafe8b8057f4"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "En Python 3, les séquences d’octets sont représentées par le type\n",
        "`bytes` lorsqu’elles ne sont pas modifiables (comme des chaînes de\n",
        "caractères) et par le type `bytearray` lorsqu’elles sont modifiables\n",
        "(comme des listes). Le passage d’une chaîne de caractère à une séquence\n",
        "d’octets prend en compte le codage des caractères (par défaut on suppose\n",
        "que vous utilisez UTF-8 mais des arguments optionnels permettent de\n",
        "préciser autre chose)."
      ],
      "id": "eeb427fe-91b4-404e-8ca2-29fa26d59b76"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "s = \"L'éléphant se dandine sur le toit.\" 34\n",
            "b = b\"L'\\xc3\\xa9l\\xc3\\xa9phant se dandine sur le toit.\" 36\n",
            "x = b'\\x00\\x00\\x00\\x00\\x00'\n",
            "y = b'ABCD'\n",
            "z = bytearray(b'AbCD')\n",
            "t = 'AbCD'\n",
            "[65, 98, 67, 68]"
          ]
        }
      ],
      "source": [
        "s = \"L'éléphant se dandine sur le toit.\"\n",
        "print(\"s =\", repr(s), len(s))\n",
        "b = s.encode()\n",
        "print(\"b =\", repr(b), len(b))\n",
        "x = bytes(5)\n",
        "print(\"x =\", repr(x))\n",
        "y = bytes([65, 66, 67, 68])\n",
        "print(\"y =\", repr(y))\n",
        "z = bytearray(y)\n",
        "z[1] += 32\n",
        "print(\"z =\", repr(z))\n",
        "t = z.decode()\n",
        "print(\"t =\", repr(t))\n",
        "l = list(z)\n",
        "print(l)"
      ],
      "id": "3f4fc87a"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "La bibliothèque `Crypto` fourni une fonction très pratique pour\n",
        "appliquer un masque sur une séquence d’octets."
      ],
      "id": "df8bbe0b-de7f-450c-b63a-7d3e222f1b56"
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "b'lapin' ⊕ b'poule' = b'\\x1c\\x0e\\x05\\x05\\x0b'\n",
            "b'\\x1c\\x0e\\x05\\x05\\x0b' ⊕ b'poule' = b'lapin'"
          ]
        }
      ],
      "source": [
        "from Crypto.Util.strxor import strxor\n",
        "\n",
        "m = b\"lapin\"\n",
        "k = b\"poule\"\n",
        "c = strxor(m, k)\n",
        "print(m, \"⊕\", k, \"=\", c)\n",
        "s = strxor(c, k)\n",
        "print(c, \"⊕\", k, \"=\", s)"
      ],
      "id": "5f30a0c5"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "✏️✏️✏️ **Question 1.** Déchiffrer le message `l` ci-dessous qui a été\n",
        "chiffré par le chiffrement du XOR avec la clé `CAKE`."
      ],
      "id": "26090fdc-7d19-4184-9f3b-e504bf90cf4e"
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {},
      "outputs": [],
      "source": [
        "l = [1, 51, 42, 51, 44, 109, 107, 51, 44, 52, 56, 101, 48, 32, 61, 32, 57, 97, 62, 49, 42, 45, 34, 54, 38, 51, 107, 41, 38, 97, 40, 45, 42, 39, 45, 55, 38, 44, 46, 43, 55, 97, 59, 36, 49, 97, 51, 42, 49, 97, 46, 43, 99, 17, 50, 49, 43, 46, 37, 101, 98]"
      ],
      "id": "af40968c"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Il est temps de lire un peu de documentation avant de chiffrer des\n",
        "messages :\n",
        "\n",
        "1.  [Crypto.Cipher](https://www.pycryptodome.org/src/cipher/cipher)\n",
        "    permet de manipuler les briques de chiffrement symétrique comme\n",
        "    `AES` en précisant le mode opératoire ;\n",
        "2.  [Crypto.Util.Padding](https://www.pycryptodome.org/src/util/util.html#crypto-util-padding-module)\n",
        "    permet le bourrage réversible des séquences d’octet pour obtenir des\n",
        "    séquences de longueur multiple de la taille d’un bloc ;\n",
        "3.  [Crypto.Random](https://www.pycryptodome.org/src/random/random.html)\n",
        "    permet de générer des séquences pseudo-aléatoires de qualité\n",
        "    cryptographique.\n",
        "\n",
        "Voici comment chiffrer un message avec une clé et un IV aléatoire :"
      ],
      "id": "22afe7e0-f232-418a-9e72-1f2f71b089e0"
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "c = b'\\xf6\\xad\\xa9\\x91!\\xc2=\\xf8&\\xc3\\x0e\\x01AD:>\\xa2\\xd1\\x92\\x11q\"6\\xcb\\x1f\\xfc\\\\\\xdf%\\x1d\\xfdG\\x08\\xbe\\x16\\x1c\\x01\\xfd\\xd2\\x8dD\\x9f\\x9f<Q\\x82\\xab\\xd7'\n",
            "k = b'\\xdf\\xe3\\xe9\\x84\\xdd\\xc2\\xf0\\xf2\\x0b\\rT\\xa3\\xfa\\xbb\\xa2\\xc9\\xdb\\x88\\xd2\\xca\\xff\\x16\\xb8\\xbf\\x8al\\xdcZ\\x99\\xc0RK'\n",
            "iv = b'\\xac\\x93\\x0e\\xab\\x85O\\x90\\xbb\\\\\\x1b\\xfd=K$\\xd7\\xee'"
          ]
        }
      ],
      "source": [
        "from Crypto.Cipher import AES\n",
        "from Crypto.Util.Padding import pad, unpad\n",
        "from Crypto.Random import get_random_bytes\n",
        "\n",
        "k = get_random_bytes(32)\n",
        "m = b\"Je code en Python et c'est ma joie.\"\n",
        "p = pad(m, 16)\n",
        "cipher = AES.new(k, AES.MODE_CBC)\n",
        "c = cipher.encrypt(p)\n",
        "iv = cipher.iv\n",
        "\n",
        "print(\"c =\", repr(c))\n",
        "print(\"k =\", repr(k))\n",
        "print(\"iv =\", repr(iv))"
      ],
      "id": "968d12f0"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "✏️✏️✏️ **Question 2.** Déchiffrer le message `c` ci-dessous, chiffré en\n",
        "mode CBC avec la clé `k` et l’IV `iv`, à l’aide de `Crypto.Cipher.AES` !"
      ],
      "id": "e6cc70fc-f75b-4a5d-bf21-1c2cfe33c2e3"
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {},
      "outputs": [],
      "source": [
        "c = b\"\\xcf\\xbcs\\xe4\\xa3\\xeb\\x96\\xa6\\xe9\\xa9\\xd5\\xf5Ob\\x91\\x8f\\x8d9\\xa2\\x1f\\x16\\xcft\\xcf\\xcf\\xc7\\xe3\\x1d\\xd9'.\\x81'U\\xf6(\\x96\\xe4&\\x166n3\\xc5d\\x94]\\xf3\\xb0\\x98\\x88\\xd9\\x1ew\\xde\\x06\\xa6\\x91,\\x82\\xd7\\x06,.hJc\\xd2\\xe2\\x1cA\\xc6g\\xc5IM\\xd5\\x059%\\xa1=\\xfct\\x03\\xdf\\xc3[r\\n/\\xcf9\\xd9\\xaa\\xb0\"\n",
        "iv = b'\\x14\\xb0\\x8b\\x0c\\xc0\\xe1\\xa3Duj|\\x0e\\xf5T\\xebv'\n",
        "k = b\"There is no cake\""
      ],
      "id": "76e7e34c"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "✏️✏️✏️ **Question 3.** Les deux messages `c` et `d` ci-dessous ont été\n",
        "chiffrés avec AES en mode CTR avec une clé inconnue. Ils sont préfixés\n",
        "par leur *nonce* (l’équivalent de l’IV en mode CTR, codé ici sur 8\n",
        "octets). Un indice : l’un des message commence par `Bravo`."
      ],
      "id": "895feb0c-fd57-4322-9661-8c9fc44bf705"
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x07\\n\\x02\\x13\\x03LDN7\\x07\\x11\\x01\\x15V\\x03\\x00\\tN\\x0f'"
          ]
        }
      ],
      "source": [
        "c = b\"\\xe7\\xa5\\xfd\\xe9\\xd9B*\\xa5iI\\xc9\\xbc\\x9d\\xe1\\x85\\x00'\\x91/\\xd2\\xd8\\x0b\\xa3lho\\xfd\"\n",
        "d = b\"\\xe7\\xa5\\xfd\\xe9\\xd9B*\\xa5nC\\xcb\\xaf\\x9e\\xad\\xc1N\\x10\\x96>\\xd3\\xcd]\\xa0la!\\xf2\"\n",
        "e = strxor(c, d)\n",
        "print(repr(e))"
      ],
      "id": "3ecc28a9"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 2. Attaque padding CBC"
      ],
      "id": "8728f9b9-2401-4013-8194-8a21c9dc0817"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "<div class=\"alert alert-block alert-info\">\n",
        "  <b>Objectifs — Partie 2 (≈ 1 h)</b>\n",
        "  <ul>\n",
        "    <li>expliquer pourquoi <b>AES-CBC seul ne garantit pas l’intégrité</b> (absence d’authentification) et comment cela peut mener à un <b>oracle de padding</b> ;</li>\n",
        "    <li>interagir avec un oracle (fonction/boîte noire) qui révèle si un déchiffrement est <b>correctement paddé</b> ;</li>\n",
        "    <li>mettre en œuvre l’<b>attaque CBC padding</b> pour retrouver le <b>texte en clair</b> d’un ciphertext, bloc par bloc, sans connaître la clé ;</li>\n",
        "    <li>valider votre attaque sur plusieurs messages/tests, et interpréter vos résultats (nombre de requêtes, erreurs possibles, cas limites).</li>\n",
        "  </ul>\n",
        "</div>"
      ],
      "id": "7d6b75ce-89d9-42e4-8702-dcef80161e03"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Le code ci-dessous reproduit le protocole étudié en cours (l’envoi du\n",
        "message en moins) :\n",
        "\n",
        "-   `alice` chiffre le message à envoyer à l’aide d’AES-256-CBC après\n",
        "    avoir appliqué le bourrage et retourne la concaténation de l’IV et\n",
        "    du message ainsi chiffré ;\n",
        "-   `bob` déchiffre le message reçu grâce à l’IV, applique le débourrage\n",
        "    et retourne le message déchiffré ou `None` si le bourrage est\n",
        "    incorrect ;\n",
        "-   `oracle` permet de savoir si `bob` serait capable ou non de\n",
        "    déchiffrer le message (c’est l’équivalent du message ACK/NACK du\n",
        "    cours).\n",
        "\n",
        "Le but de l’exercice est d’écrire une fonction `attaque(c)` capable de\n",
        "déchiffrer tout message `c` obtenu en appelant `alice(m)` pour un\n",
        "certain `m`. Cette fonction `attaque` n’a pas le droit d’utiliser la clé\n",
        "`k` mais elle peut appeler la fonction `oracle` autant de fois qu’elle\n",
        "le souhaite."
      ],
      "id": "f477966d-b844-4af4-8421-95a882bf388e"
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {},
      "outputs": [],
      "source": [
        "key = get_random_bytes(32)\n",
        "\n",
        "\n",
        "def alice(m):\n",
        "    p = pad(m, 16)\n",
        "    cipher = AES.new(key, AES.MODE_CBC)\n",
        "    c = cipher.iv + cipher.encrypt(p)\n",
        "    return c\n",
        "\n",
        "\n",
        "def bob(m):\n",
        "    iv = m[:16]\n",
        "    c = m[16:]\n",
        "    cipher = AES.new(key, AES.MODE_CBC, iv=iv)\n",
        "    p = cipher.decrypt(c)\n",
        "    try:\n",
        "        m = unpad(p, 16)\n",
        "        return m\n",
        "    except ValueError:\n",
        "        return None\n",
        "\n",
        "\n",
        "def oracle(m):\n",
        "    return bob(m) is not None"
      ],
      "id": "4486e21f"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Voici un exemple d’utilisation des fonctions `alice`, `bob` et `oracle`\n",
        ":"
      ],
      "id": "36711f83-fa1f-498f-86c7-6aff8718c12a"
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "pad(m) = b\"Coucou c'est moi !\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\\x0e\"\n",
            "c = b'I\\x92c\\xbe\\xca\\xf4\\xcb\\x85\\xdb\\xb7s\\xa6\\x13B\\xc4\\xd4\\xba\\xa5\\xa5b\\xd1\\x15\\x89G\\x99\\x1f\\xb8N\\xfb\\x91\\xd9wR\\x90\\xfa\\x8fF\\xae\\x15a\\xc6\\xd7\\x08\\xc3Ps|\\x13' (longueur : 3 blocs dont IV)\n",
            "oracle(c) = True\n",
            "bob(c) = b\"Coucou c'est moi !\"\n",
            "oracle(d) = False\n",
            "bob(d) = None"
          ]
        }
      ],
      "source": [
        "m = b\"Coucou c'est moi !\"\n",
        "print(\"pad(m) =\", pad(m, 16))\n",
        "c = alice(m)\n",
        "print(\"c =\", c, \"(longueur :\", len(c) // 16, \"blocs dont IV)\")\n",
        "print(\"oracle(c) =\", oracle(c))\n",
        "print(\"bob(c) =\", bob(c))\n",
        "d = strxor(c, bytes(len(c) - 3) + b\"XXX\")\n",
        "print(\"oracle(d) =\", oracle(d))\n",
        "print(\"bob(d) =\", bob(d))"
      ],
      "id": "b6df1afb"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "En mode CBC, le déchiffrement du ième bloc $C_i$ chiffré d’un message en\n",
        "clair $M_i$ nécessite de connaître uniquement la clé $K$ et le (i-1)ème\n",
        "bloc chiffré $C_{i-1}$ (avec la convention $C_0=\\operatorname{IV}$) : $$\n",
        "M_i = D_K(C_i) \\oplus C_{i-1}\n",
        "$$\n",
        "\n",
        "Dans la suite on se concentre donc sur le déchiffrement d’un unique bloc\n",
        "$C$ à partir de son IV $I$ (la méthode se généralise ensuite à tout bloc\n",
        "$C_i$ avec l’IV $C_{i-1}$).\n",
        "\n",
        "Si, au lieu de transmettre $I\\cdot C$ à l’oracle, on lui transmet\n",
        "$(I\\oplus\\Delta)\\cdot C$, l’oracle va tester si $M\\oplus\\Delta$ possède\n",
        "un bourrage valide. En effet : $$\n",
        "M \\oplus \\Delta = (D_K(C) \\oplus I) \\oplus \\Delta = D_K(C) \\oplus (I \\oplus \\Delta)\n",
        "$$\n",
        "\n",
        "Un message possède un bourrage valide si et seulement si il termine par\n",
        "la séquence $k k \\cdots k$ qui répète $k$ fois une certaine valeur $k$.\n",
        "\n",
        "En particulier lorsque $I\\oplus \\Delta$ termine par la valeur 1,\n",
        "l’oracle valide le message. Il suffit pour cela de modifier uniquement\n",
        "le dernier octet de $I$ en trouvant le bon élément parmi les 256\n",
        "possible.\n",
        "\n",
        "✏️✏️✏️ **Question 4.** Écrire une fonction `flip(iv,j)` qui retourne le\n",
        "bloc `iv` reçu en entrée dans lequel le dernier octet a été remplacé par\n",
        "son XOR avec l’entier `j` (c’est à dire par `iv[-1] ^ j`). Utiliser\n",
        "cette fonction pour afficher parmi les 256 valeurs possibles pour `j`\n",
        "celles pour lesquels l’oracle valide `flip(iv,j) + b`. En déduire le\n",
        "dernier caractère du déchiffrement de `b`."
      ],
      "id": "0b933fc7-5e34-4bf1-9418-845da9b3ff39"
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {},
      "outputs": [],
      "source": [
        "iv = c[:16]\n",
        "b = c[16:32]\n",
        "\n",
        "\n",
        "def flip(c, j):\n",
        "    # TODO\n",
        "    pass\n",
        "\n",
        "\n",
        "for j in range(256):\n",
        "    # TODO\n",
        "    pass"
      ],
      "id": "c1cd2f3a"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Une fois qu’on a trouvé le dernier caractère en clair de $M$, on sait\n",
        "comment modifier le dernier octet de $I$ pour que $I\\oplus\\Delta$\n",
        "termine par la valeur $2$. Il suffit d’utiliser l’oracle pour trouver la\n",
        "modification (parmi 256) à appliquer à l’avant-dernier octet de $I$ pour\n",
        "que $I\\oplus\\Delta$ termine par le padding valide $22$. Et on itère !\n",
        "\n",
        "✏️✏️✏️ **Question 5.** Écrire une fonction `gnapgnap(iv,b)` qui\n",
        "déchiffre le bloc `b` à l’aide de l’oracle. En déduire une fonction\n",
        "`attaque(c)` qui déchiffre complétement un message `c` produit par un\n",
        "certain `alice(m)` sans utiliser la clé."
      ],
      "id": "05905911-d0ea-4018-9943-dc4f3ab53ac9"
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "None"
          ]
        }
      ],
      "source": [
        "def gnapgnap(iv, b):\n",
        "    # TODO\n",
        "    pass\n",
        "\n",
        "\n",
        "print(gnapgnap(iv, b))"
      ],
      "id": "40e992c6"
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "None"
          ]
        }
      ],
      "source": [
        "def attaque(c):\n",
        "    # TODO\n",
        "    pass\n",
        "\n",
        "\n",
        "print(attaque(c))"
      ],
      "id": "2fe6ae22"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 3. Attaque ChopChop contre WEP"
      ],
      "id": "6a0b4a8d-b70d-4bc1-816b-55cf7c0ec14d"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "<div class=\"alert alert-block alert-warning\">\n",
        "  <b>Objectifs — Partie 3 (Bonus)</b><br/>\n",
        "  <b>Cette partie est optionnelle.</b> Ne la commencez qu’une fois la partie 1 et la partie 2 terminées.\n",
        "  <ul>\n",
        "    <li>découvrir un exemple historique d’erreur de conception liée à la <b>réutilisation de flux / keystream</b> (WEP / RC4) ;</li>\n",
        "    <li>appliquer un raisonnement “type XOR/flux” pour extraire de l’information à partir de trames chiffrées ;</li>\n",
        "    <li>(selon l’énoncé) reconstituer un message ou une clé dans un scénario simplifié.</li>\n",
        "  </ul>\n",
        "</div>"
      ],
      "id": "419e2047-cbbf-46b4-82f0-93efe790bd22"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Le (désuet) protocole WEP chiffre les trames Wifi (IEEE 802.11) à l’aide\n",
        "de l’algorithme de chiffrement par flot RC4. Le contrôle d’intégrité est\n",
        "assuré par l’utilisation d’un checksum CRC32. Pour transmettre un\n",
        "message $M$ avec la clé secrète $K$ de 40 ou 104 bits, un IV aléatoire\n",
        "de 24 bits $\\mbox{IV}$ est généré, le CRC32 $\\operatorname{icv}(M)$ est\n",
        "concaténé au message $M$ et l’ensemble est masqué avec le flot RC4\n",
        "généré par la concaténation de $\\mbox{IV}$ et $K$ : $$\n",
        "C = (M \\cdot \\operatorname{icv}(M)) \\oplus \\operatorname{RC4}(\\mbox{IV} \\cdot K)\n",
        "$$ La paire $\\mbox{IV}\\cdot C$ est alors transmise sur le réseau sans\n",
        "fil.\n",
        "\n",
        "À la réception d’un message $\\mbox{IV}\\cdot C$ on calcule : $$\n",
        "M' \\cdot J = C \\oplus \\operatorname{RC4}(\\mbox{IV} \\cdot K)\n",
        "$$ Si $J = \\operatorname{icv}(M')$ alors le message $M'$ est accepté.\n",
        "Sinon le message est rejetté silencieusement (pas d’acquittement\n",
        "négatif).\n",
        "\n",
        "Ce protocole a de nombreux défauts et il est possible aujourd’hui de\n",
        "trouver la clé d’un réseau WEP en moins de 60s en utilisant des\n",
        "faiblesses statistiques de l’algorithme RC4. Nous allons nous intéresser\n",
        "ici à une attaque apparue à partir de 2004 et connue sous le nom\n",
        "*ChopChop*. Cette attaque utilise les propriétés de linéarité de CRC32\n",
        "pour s’en servir comme oracle pour déchiffrer un message (et donc\n",
        "obtenir la séquence $\\operatorname{RC4}(\\mbox{IV}\\cdot K)$ de longueur\n",
        "$|M|+4$).\n",
        "\n",
        "Le code ci-dessous met en œuvre le calcul d’$\\operatorname{icv}(M)$ :"
      ],
      "id": "0c1ad9d4-5559-4fec-9581-2e2190b304ae"
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "metadata": {},
      "outputs": [],
      "source": [
        "crc_tab = [0] * 256\n",
        "for i in range(256):\n",
        "    r = i\n",
        "    for j in range(8):\n",
        "        if r & 1:\n",
        "            r = (r >> 1) ^ 0xEDB88320\n",
        "        else:\n",
        "            r >>= 1\n",
        "    crc_tab[i ^ 0xFF] = r ^ 0xFF000000\n",
        "\n",
        "\n",
        "def crc32(buf, crc=0):\n",
        "    for k in buf:\n",
        "        crc = (crc >> 8) ^ crc_tab[(crc & 0xFF) ^ k]\n",
        "    return crc\n",
        "\n",
        "\n",
        "def lsb(x, k=4):\n",
        "    r = []\n",
        "    for i in range(k):\n",
        "        r.append(x & 0xFF)\n",
        "        x >>= 8\n",
        "    return bytes(r)\n",
        "\n",
        "\n",
        "def icv(buf):\n",
        "    return lsb(crc32(buf))"
      ],
      "id": "d0f6b491"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Nous allons reproduire la même attaque en remplaçant RC4 par\n",
        "AES-256-CTR, qui est aussi un chiffrement par flot. Le code ci-dessous\n",
        "met en œuvre ce protocole sous la forme de deux fonctions `alice` et\n",
        "`bob` et une fonction `oracle`."
      ],
      "id": "41a2293b-0f08-4838-8506-9321f85b64b1"
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "metadata": {},
      "outputs": [],
      "source": [
        "def nonce():\n",
        "    return get_random_bytes(8)\n",
        "\n",
        "\n",
        "def alice(m):\n",
        "    no = nonce()\n",
        "    mc = m + icv(m)\n",
        "    ci = AES.new(key, AES.MODE_CTR, nonce=no)\n",
        "    return no + ci.encrypt(mc)\n",
        "\n",
        "\n",
        "def bob(c):\n",
        "    no = c[:8]\n",
        "    ci = AES.new(key, AES.MODE_CTR, nonce=no)\n",
        "    mc = ci.decrypt(c[8:])\n",
        "    ic = mc[-4:]\n",
        "    m = mc[:-4]\n",
        "    if icv(m) == ic:\n",
        "        return m\n",
        "    else:\n",
        "        return None\n",
        "\n",
        "\n",
        "def oracle(c):\n",
        "    return bob(c) is not None"
      ],
      "id": "5c1ededa"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Voici un exemple d’utilisation des fonctions `alice`, `bob` et `oracle`\n",
        ":"
      ],
      "id": "acee0ac1-cc86-4a2d-a2d9-25913ab82eca"
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "c = b'\"Y\\x83\\xe7\\x83\\xd4z\\x8e\\xca\\x83\\xdd\\xc6\\x0e\\xe8\\x9e\"\\x16\\xb3\\xe0\\x03,g7\\xda\\xc9\\xf0\\x80@\\xb7w*<\\xcf\\xb2\\xf9'\n",
            "oracle(c) = True\n",
            "bob(c) = b'Tranchez leur la tete !'\n",
            "oracle(d) = False\n",
            "bob(d) = None"
          ]
        }
      ],
      "source": [
        "m = b\"Tranchez leur la tete !\"\n",
        "c = alice(m)\n",
        "print(\"c =\", c)\n",
        "print(\"oracle(c) =\", oracle(c))\n",
        "print(\"bob(c) =\", bob(c))\n",
        "d = strxor(c, b\"XXX\" + bytes(len(c) - 3))\n",
        "print(\"oracle(d) =\", oracle(d))\n",
        "print(\"bob(d) =\", bob(d))"
      ],
      "id": "4f916e23"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "L’attaque consiste à transformer le chiffrement\n",
        "$C = C_1 C_2 \\cdots C_{n+4}$ d’un message $M = M_1 M_2 \\cdots M_n$ en un\n",
        "chiffré valide $D = D_1 D_2 \\cdots D_{n+3}$ du message tronqué\n",
        "$M' = M_1 M_2 \\cdots M_{n-1}$ en utilisant l’oracle pour faire un choix\n",
        "parmi 256 (comme dans l’attaque de l’exercice précédent).\n",
        "\n",
        "Notons $K = K_1 K_2 \\cdots K_{n+4}$ le masque,\n",
        "$I = \\operatorname{icv}(M)$ et $J = \\operatorname{icv}(M')$. Alors on a\n",
        "les égalités suivantes : $$\n",
        "\\begin{array}{cccccccccc}\n",
        "& M_1 & M_2 & \\cdots & M_{n-1} & M_n & I_1 & I_2 & I_3 & I_4\\\\\n",
        "\\oplus & K_1 & K_2 & \\cdots & K_{n-1} & K_n & K_{n+1} & K_{n+2} & K_{n+3} & K_{n+4}\\\\\\hline\n",
        "& C_1 & C_2 & \\cdots & C_{n-1} & C_n & C_{n+1} & C_{n+2} & C_{n+3} & C_{n+4}\n",
        "\\end{array}\n",
        "$$ et $$\n",
        "\\begin{array}{ccccccccccc}\n",
        "& M_1 & M_2 & \\cdots & M_{n-1} & J_1 & J_2 & J_3 & J_4 & \\phantom{I_4}\\\\\n",
        "\\oplus & K_1 & K_2 & \\cdots & K_{n-1} & K_n & K_{n+1} & K_{n+2} & K_{n+3} & \\phantom{K_{n+4}}\\\\\\hline\n",
        "& D_1 & D_2 & \\cdots & D_{n-1} & D_n & D_{n+1} & D_{n+2} & D_{n+3} & \\phantom{D_{n+4}}\n",
        "\\end{array}\n",
        "$$\n",
        "\n",
        "Les $n-1$ premières valeurs de $D_i$ sont égales aux $C_i$. Notons $X$\n",
        "la modification à apporter à $C_n$ pour obtenir $D_n$, *i.e.*\n",
        "$X = C_n \\oplus D_n = M_n \\oplus J_1$.\n",
        "\n",
        "✏️✏️✏️ **Question 6.** En étudiant le code de CRC32, montrer comment\n",
        "calculer $D_{n+1}$, $D_{n+2}$, $D_{n+3}$ et $K_{n+4}$ à partir de $X$.\n",
        "On pourra commencer par chercher comment calculer $I$ à partir de $J$.\n",
        "\n",
        "✏️✏️✏️ **Question 7.** Écrire une fonction `chop(c)` qui à partir d’un\n",
        "message chiffré $C$ retourne une paire `(d,x)` où `d` est le chiffré du\n",
        "message tronqué $D$ et `k` le dernier octet du masque $K_{n+4}$."
      ],
      "id": "bb1ab3a3-a14e-45ae-aa02-f610058c1417"
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "None"
          ]
        }
      ],
      "source": [
        "def chop(c):\n",
        "    # TODO\n",
        "    pass\n",
        "\n",
        "\n",
        "print(chop(c))"
      ],
      "id": "ca5d93e4"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "✏️✏️✏️ **Question 8.** En déduire une fonction `chopchop(c)` qui\n",
        "déchiffre un message chiffré généré par `alice(m)` sans utiliser la clé\n",
        "secrète mais en utilisant l’oracle."
      ],
      "id": "ada6a9cb-2bdf-45b5-b639-6a63d5ed9484"
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "metadata": {},
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "None"
          ]
        }
      ],
      "source": [
        "def chopchop(c):\n",
        "    # TODO\n",
        "    pass\n",
        "\n",
        "\n",
        "print(chopchop(c))"
      ],
      "id": "85692df2"
    }
  ],
  "nbformat": 4,
  "nbformat_minor": 5,
  "metadata": {
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3 (ipykernel)",
      "language": "python"
    }
  }
}