{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# RSA au quotidien\n",
    "\n",
    "## HTTPS et TLS\n",
    "\n",
    "Les connections sécurisées, par exemple à une banque ou à un site de commerce en ligne, utilisent le protocole HTTPS, une version chiffrée du protocole HTTP, qui repose sur le protocole TLS (*Transport Layer Security*), successeur de SSL (*Secure Socket Layer*).\n",
    "\n",
    "Le pricipe général est d'utiliser la cryptographie asymétrique pour négocier des clefs de session (*TLS handshake*), et la cryptographie symétrique pour chiffrer les données échangées pendant la session. \n",
    " \n",
    "Le serveur et le client négocient les détails des algorithmes de chiffrement utilisés et les clefs avant de transmettre aucune donnée.\n",
    "\n",
    "La cryptographie à clef publique permet  aux deux parties de s'authentifier. Ce n'est pas obligatoire, mais dans le cas d'HTTPS, il faut au moins que le serveur soit authentifié.\n",
    "\n",
    "Chaque message contient un code d'authentification de message (MAC) qui assure l'intégrité des données transmises.\n",
    "\n",
    "\n",
    "HTTPS peut chiffrer entièrement les données transmise par HTTP, en particulier l'URL demandée, les paramètres des requètes, les en-têtes el les cookies. Toutefois, les adresse IP du client et du serveur ne peuvent évidemment pas être protégées, non plus que le volume des données transférées.\n",
    "\n",
    "Les connections TLS utilisent des [certificats](https://en.wikipedia.org/wiki/Public_key_certificate) basés sur des [autorités\n",
    "de certification](https://en.wikipedia.org/wiki/Certificate_authority), et respectant le standard [X.509](https://en.wikipedia.org/wiki/X.509).\n",
    "\n",
    "Ces certificats sont pré-installés sur les navigateur, de sorte qu'un utilisateur pourra faire confiance à un site sécurisé seulement si :\n",
    "\n",
    "- Le navigateur implémente correctement le protocole HTTPS et les certificats sont correctement installés\n",
    "- L'utilisateur fait confiance aux autorités de certification\n",
    "- Le site consulté produit un certificat valide\n",
    "- Le certificat identifie correctement le site\n",
    "- L'utilisateur fait confiance au protocole TLS\n",
    "\n",
    "\n",
    "Ces conditions ne sont pas toujours réunies, voir par exemple [ici](https://www.theregister.co.uk/2015/06/03/compromised_ssh_keys_used_to_access_uk_govt_spotify_github_repos/) ou [là](https://news.netcraft.com/archives/2016/03/17/95-of-https-servers-vulnerable-to-trivial-mitm-attacks.html) pour quelques exemples édifiants.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Certificats X.509\n",
    "\n",
    "Un certificat se compose essentiellement d'une clef publique, signée par un autorité de certification, possédant elle même un certificat autosigné (certificat racine).\n",
    "\n",
    "On peut voir les certificats de firefox en allant dans préférences/avancé/certificats :\n",
    "\n",
    "<img src=\"screen7.png\" width=\"960\" height=\"540\" />\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On clique sur \"exporter\", et on obtient (par défaut) un fichier au format pem."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----BEGIN CERTIFICATE-----\r",
      "\r\n",
      "MIIESTCCAzGgAwIBAgITBn+UV4WH6Kx33rJTMlu8mYtWDTANBgkqhkiG9w0BAQsF\r",
      "\r\n",
      "ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\r",
      "\r\n",
      "b24gUm9vdCBDQSAxMB4XDTE1MTAyMjAwMDAwMFoXDTI1MTAxOTAwMDAwMFowRjEL\r",
      "\r\n",
      "MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEVMBMGA1UECxMMU2VydmVyIENB\r",
      "\r\n",
      "IDFCMQ8wDQYDVQQDEwZBbWF6b24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\r",
      "\r\n",
      "AoIBAQDCThZn3c68asg3Wuw6MLAd5tES6BIoSMzoKcG5blPVo+sDORrMd4f2AbnZ\r",
      "\r\n",
      "cMzPa43j4wNxhplty6aUKk4T1qe9BOwKFjwK6zmxxLVYo7bHViXsPlJ6qOMpFge5\r",
      "\r\n",
      "blDP+18x+B26A0piiQOuPkfyDyeR4xQghfj66Yo19V+emU3nazfvpFA+ROz6WoVm\r",
      "\r\n",
      "B5x+F2pV8xeKNR7u6azDdU5YVX1TawprmxRC1+WsAYmz6qP+z8ArDITC2FMVy2fw\r",
      "\r\n",
      "0IjKOtEXc/VfmtTFch5+AfGYMGMqqvJ6LcXiAhqG5TI+Dr0RtM88k+8XUBCeQ8IG\r",
      "\r\n",
      "KuANaL7TiItKZYxK1MMuTJtV9IblAgMBAAGjggE7MIIBNzASBgNVHRMBAf8ECDAG\r",
      "\r\n",
      "AQH/AgEAMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUWaRmBlKge5WSPKOUByeW\r",
      "\r\n",
      "dFv5PdAwHwYDVR0jBBgwFoAUhBjMhTTsvAyUlC4IWZzHshBOCggwewYIKwYBBQUH\r",
      "\r\n",
      "AQEEbzBtMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5yb290Y2ExLmFtYXpvbnRy\r",
      "\r\n",
      "dXN0LmNvbTA6BggrBgEFBQcwAoYuaHR0cDovL2NydC5yb290Y2ExLmFtYXpvbnRy\r",
      "\r\n",
      "dXN0LmNvbS9yb290Y2ExLmNlcjA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3Js\r",
      "\r\n",
      "LnJvb3RjYTEuYW1hem9udHJ1c3QuY29tL3Jvb3RjYTEuY3JsMBMGA1UdIAQMMAow\r",
      "\r\n",
      "CAYGZ4EMAQIBMA0GCSqGSIb3DQEBCwUAA4IBAQCFkr41u3nPo4FCHOTjY3NTOVI1\r",
      "\r\n",
      "59Gt/a6ZiqyJEi+752+a1U5y6iAwYfmXss2lJwJFqMp2PphKg5625kXg8kP2CN5t\r",
      "\r\n",
      "6G7bMQcT8C8xDZNtYTd7WPD8UZiRKAJPBXa30/AbwuZe0GaFEQ8ugcYQgSn+IGBI\r",
      "\r\n",
      "8/LwhBNTZTUVEWuCUUBVV18YtbAiPq3yXqMB48Oz+ctBWuZSkbvkNodPLamkB2g1\r",
      "\r\n",
      "upRyzQ7qDn1X8nn8N8V7YJ6y68AtkHcNSRAnpTitxBKjtKPISLMVCx7i4hncxHZS\r",
      "\r\n",
      "yLyKQXhw2W2Xs0qLeC1etA+jTGDK4UfLeC0SF7FSi8o5LL21L8IzApar2pR/\r",
      "\r\n",
      "-----END CERTIFICATE-----\r",
      "\r\n"
     ]
    }
   ],
   "source": [
    "!cat Amazon"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On reconnait un encodage en base 64. Comme pour les clefs ssh, on pourrait décoder le base 64 et continuer avec pyasn1.\n",
    "Pour cela, il faut connaître la structure du certificat, définie dans la [RFC2459](https://tools.ietf.org/html/rfc2459)\n",
    "\n",
    "\n",
    "La partie authentifiée contient les champs suivants :\n",
    "<pre>\n",
    "    Version\n",
    "    Numéro de série\n",
    "    Algorithme de signature du certificat\n",
    "    DN (Distinguished Name) du délivreur (autorité de certification)\n",
    "    Validité (dates limites)\n",
    "        Pas avant\n",
    "        Pas après\n",
    "    DN de l'objet du certificat\n",
    "    Informations sur la clé publique\n",
    "        Algorithme de la clé publique\n",
    "        Clé publique proprement dite\n",
    "    Identifiant unique du signataire (optionnel, X.509v2)\n",
    "    Identifiant unique du détenteur du certificat (optionnel, X.509v2)\n",
    "    Extensions (optionnel, à partir de X.509v3)\n",
    "        Liste des extensions\n",
    "    Signature des informations ci-dessus par l'autorité de certification\n",
    " </pre>\n",
    "Les noms de l'émetteur (également signataire) comme du titulaire sont des noms X.501, que l'on retrouve également dans les annuaires ISO et LDAP. Le contenu ci-dessus est suivi par une répétition de l'algorithme de signature et de la signature proprement dite.\n",
    "\n",
    "Pour décoder les certificats, il est plus simple d'utiliser openssl :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Certificate:\r\n",
      "    Data:\r\n",
      "        Version: 3 (0x2)\r\n",
      "        Serial Number:\r\n",
      "            06:7f:94:57:85:87:e8:ac:77:de:b2:53:32:5b:bc:99:8b:56:0d\r\n",
      "    Signature Algorithm: sha256WithRSAEncryption\r\n",
      "        Issuer: C=US, O=Amazon, CN=Amazon Root CA 1\r\n",
      "        Validity\r\n",
      "            Not Before: Oct 22 00:00:00 2015 GMT\r\n",
      "            Not After : Oct 19 00:00:00 2025 GMT\r\n",
      "        Subject: C=US, O=Amazon, OU=Server CA 1B, CN=Amazon\r\n",
      "        Subject Public Key Info:\r\n",
      "            Public Key Algorithm: rsaEncryption\r\n",
      "                Public-Key: (2048 bit)\r\n",
      "                Modulus:\r\n",
      "                    00:c2:4e:16:67:dd:ce:bc:6a:c8:37:5a:ec:3a:30:\r\n",
      "                    b0:1d:e6:d1:12:e8:12:28:48:cc:e8:29:c1:b9:6e:\r\n",
      "                    53:d5:a3:eb:03:39:1a:cc:77:87:f6:01:b9:d9:70:\r\n",
      "                    cc:cf:6b:8d:e3:e3:03:71:86:99:6d:cb:a6:94:2a:\r\n",
      "                    4e:13:d6:a7:bd:04:ec:0a:16:3c:0a:eb:39:b1:c4:\r\n",
      "                    b5:58:a3:b6:c7:56:25:ec:3e:52:7a:a8:e3:29:16:\r\n",
      "                    07:b9:6e:50:cf:fb:5f:31:f8:1d:ba:03:4a:62:89:\r\n",
      "                    03:ae:3e:47:f2:0f:27:91:e3:14:20:85:f8:fa:e9:\r\n",
      "                    8a:35:f5:5f:9e:99:4d:e7:6b:37:ef:a4:50:3e:44:\r\n",
      "                    ec:fa:5a:85:66:07:9c:7e:17:6a:55:f3:17:8a:35:\r\n",
      "                    1e:ee:e9:ac:c3:75:4e:58:55:7d:53:6b:0a:6b:9b:\r\n",
      "                    14:42:d7:e5:ac:01:89:b3:ea:a3:fe:cf:c0:2b:0c:\r\n",
      "                    84:c2:d8:53:15:cb:67:f0:d0:88:ca:3a:d1:17:73:\r\n",
      "                    f5:5f:9a:d4:c5:72:1e:7e:01:f1:98:30:63:2a:aa:\r\n",
      "                    f2:7a:2d:c5:e2:02:1a:86:e5:32:3e:0e:bd:11:b4:\r\n",
      "                    cf:3c:93:ef:17:50:10:9e:43:c2:06:2a:e0:0d:68:\r\n",
      "                    be:d3:88:8b:4a:65:8c:4a:d4:c3:2e:4c:9b:55:f4:\r\n",
      "                    86:e5\r\n",
      "                Exponent: 65537 (0x10001)\r\n",
      "        X509v3 extensions:\r\n",
      "            X509v3 Basic Constraints: critical\r\n",
      "                CA:TRUE, pathlen:0\r\n",
      "            X509v3 Key Usage: critical\r\n",
      "                Digital Signature, Certificate Sign, CRL Sign\r\n",
      "            X509v3 Subject Key Identifier: \r\n",
      "                59:A4:66:06:52:A0:7B:95:92:3C:A3:94:07:27:96:74:5B:F9:3D:D0\r\n",
      "            X509v3 Authority Key Identifier: \r\n",
      "                keyid:84:18:CC:85:34:EC:BC:0C:94:94:2E:08:59:9C:C7:B2:10:4E:0A:08\r\n",
      "\r\n",
      "            Authority Information Access: \r\n",
      "                OCSP - URI:http://ocsp.rootca1.amazontrust.com\r\n",
      "                CA Issuers - URI:http://crt.rootca1.amazontrust.com/rootca1.cer\r\n",
      "\r\n",
      "            X509v3 CRL Distribution Points: \r\n",
      "\r\n",
      "                Full Name:\r\n",
      "                  URI:http://crl.rootca1.amazontrust.com/rootca1.crl\r\n",
      "\r\n",
      "            X509v3 Certificate Policies: \r\n",
      "                Policy: 2.23.140.1.2.1\r\n",
      "\r\n",
      "    Signature Algorithm: sha256WithRSAEncryption\r\n",
      "         85:92:be:35:bb:79:cf:a3:81:42:1c:e4:e3:63:73:53:39:52:\r\n",
      "         35:e7:d1:ad:fd:ae:99:8a:ac:89:12:2f:bb:e7:6f:9a:d5:4e:\r\n",
      "         72:ea:20:30:61:f9:97:b2:cd:a5:27:02:45:a8:ca:76:3e:98:\r\n",
      "         4a:83:9e:b6:e6:45:e0:f2:43:f6:08:de:6d:e8:6e:db:31:07:\r\n",
      "         13:f0:2f:31:0d:93:6d:61:37:7b:58:f0:fc:51:98:91:28:02:\r\n",
      "         4f:05:76:b7:d3:f0:1b:c2:e6:5e:d0:66:85:11:0f:2e:81:c6:\r\n",
      "         10:81:29:fe:20:60:48:f3:f2:f0:84:13:53:65:35:15:11:6b:\r\n",
      "         82:51:40:55:57:5f:18:b5:b0:22:3e:ad:f2:5e:a3:01:e3:c3:\r\n",
      "         b3:f9:cb:41:5a:e6:52:91:bb:e4:36:87:4f:2d:a9:a4:07:68:\r\n",
      "         35:ba:94:72:cd:0e:ea:0e:7d:57:f2:79:fc:37:c5:7b:60:9e:\r\n",
      "         b2:eb:c0:2d:90:77:0d:49:10:27:a5:38:ad:c4:12:a3:b4:a3:\r\n",
      "         c8:48:b3:15:0b:1e:e2:e2:19:dc:c4:76:52:c8:bc:8a:41:78:\r\n",
      "         70:d9:6d:97:b3:4a:8b:78:2d:5e:b4:0f:a3:4c:60:ca:e1:47:\r\n",
      "         cb:78:2d:12:17:b1:52:8b:ca:39:2c:bd:b5:2f:c2:33:02:96:\r\n",
      "         ab:da:94:7f\r\n",
      "-----BEGIN CERTIFICATE-----\r\n",
      "MIIESTCCAzGgAwIBAgITBn+UV4WH6Kx33rJTMlu8mYtWDTANBgkqhkiG9w0BAQsF\r\n",
      "ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\r\n",
      "b24gUm9vdCBDQSAxMB4XDTE1MTAyMjAwMDAwMFoXDTI1MTAxOTAwMDAwMFowRjEL\r\n",
      "MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEVMBMGA1UECxMMU2VydmVyIENB\r\n",
      "IDFCMQ8wDQYDVQQDEwZBbWF6b24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\r\n",
      "AoIBAQDCThZn3c68asg3Wuw6MLAd5tES6BIoSMzoKcG5blPVo+sDORrMd4f2AbnZ\r\n",
      "cMzPa43j4wNxhplty6aUKk4T1qe9BOwKFjwK6zmxxLVYo7bHViXsPlJ6qOMpFge5\r\n",
      "blDP+18x+B26A0piiQOuPkfyDyeR4xQghfj66Yo19V+emU3nazfvpFA+ROz6WoVm\r\n",
      "B5x+F2pV8xeKNR7u6azDdU5YVX1TawprmxRC1+WsAYmz6qP+z8ArDITC2FMVy2fw\r\n",
      "0IjKOtEXc/VfmtTFch5+AfGYMGMqqvJ6LcXiAhqG5TI+Dr0RtM88k+8XUBCeQ8IG\r\n",
      "KuANaL7TiItKZYxK1MMuTJtV9IblAgMBAAGjggE7MIIBNzASBgNVHRMBAf8ECDAG\r\n",
      "AQH/AgEAMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUWaRmBlKge5WSPKOUByeW\r\n",
      "dFv5PdAwHwYDVR0jBBgwFoAUhBjMhTTsvAyUlC4IWZzHshBOCggwewYIKwYBBQUH\r\n",
      "AQEEbzBtMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5yb290Y2ExLmFtYXpvbnRy\r\n",
      "dXN0LmNvbTA6BggrBgEFBQcwAoYuaHR0cDovL2NydC5yb290Y2ExLmFtYXpvbnRy\r\n",
      "dXN0LmNvbS9yb290Y2ExLmNlcjA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3Js\r\n",
      "LnJvb3RjYTEuYW1hem9udHJ1c3QuY29tL3Jvb3RjYTEuY3JsMBMGA1UdIAQMMAow\r\n",
      "CAYGZ4EMAQIBMA0GCSqGSIb3DQEBCwUAA4IBAQCFkr41u3nPo4FCHOTjY3NTOVI1\r\n",
      "59Gt/a6ZiqyJEi+752+a1U5y6iAwYfmXss2lJwJFqMp2PphKg5625kXg8kP2CN5t\r\n",
      "6G7bMQcT8C8xDZNtYTd7WPD8UZiRKAJPBXa30/AbwuZe0GaFEQ8ugcYQgSn+IGBI\r\n",
      "8/LwhBNTZTUVEWuCUUBVV18YtbAiPq3yXqMB48Oz+ctBWuZSkbvkNodPLamkB2g1\r\n",
      "upRyzQ7qDn1X8nn8N8V7YJ6y68AtkHcNSRAnpTitxBKjtKPISLMVCx7i4hncxHZS\r\n",
      "yLyKQXhw2W2Xs0qLeC1etA+jTGDK4UfLeC0SF7FSi8o5LL21L8IzApar2pR/\r\n",
      "-----END CERTIFICATE-----\r\n"
     ]
    }
   ],
   "source": [
    "!openssl x509 -in Amazon -text"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On voit donc que les serveurs d'Amazon utilisent une clef RSA de 2048 bits, et une signture RSA d'un hachage SHA256.\n",
    "\n",
    "Il existe un module tiers, [pyopenssl](https://pyopenssl.readthedocs.io/en/latest/) permettant d'utiliser openssl avec Python."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Les cartes bancaires\n",
    "\n",
    "Jusqu'à une époque récente, le paiement par cartes bancaires était authentifié à l'aide d'une simple signature RSA.\n",
    "\n",
    "La mémoire de la carte est divisée en deux zones, une accessible avec n'importe quel lecteur, et une autre (zone secrète) qui n'est accessible qu'au processeur de la carte, et illisible autrement. La zone publique contient une valeur d'authentification, qui est obtenue en chiffrant des données publiques (comme le numéro de la carte et sa date d'expiration) avec une clé RSA secrète. Les terminaux de paiement et les distributeurs de billets connaissent la clé publique, et l'utilisent pour vérifier la valeur d'authentification, qui est précisément une signature numérique RSA, sans hachage vu le petit nombre de données.\n",
    "\n",
    "Si la signature est correcte, la carte est considérée comme authentique, et le code est demandé au client. Le terminal envoie le code à la carte qui le compare avec celui contenu dans sa zone secrète, et répond « oui » ou »non ». Si la réponse est « oui », le paiement est accepté.\n",
    "\n",
    "Vous pourrez au prochain TD déchiffrer les données d'une authentique carte bancaire de l'époque, et en observant leur structure,  forger les données d'une fausse carte à l'aide de la clef factorisée.\n",
    "\n",
    "Les processeurs des cartes a puces interprètent des instructions appelées APDU (Application Protocol Data Unit) composées de deux octets obligatoires CLA (Class) et INS (Instruction) et de paramètres, par exemple une adresse (en quartets) et le nombre d'octets à lire.\n",
    "\n",
    "Le résultat se compose des données demandées et de deux octets SW1, SW2 indiquant si tout s'est bien passé. \n",
    "\n",
    "Sur un système Linux disposant d'un lecteur de cartes à puce,\n",
    "il faut installer [pcsc-lite](https://pcsclite.alioth.debian.org/) et activer le démon pcscd.\n",
    "Il est interfacé avec Python (module [pyscard](https://pyscard.sourceforge.io/). On peut aussi utiliser [gscriptor](https://apps.ubuntu.com/cat/applications/precise/pcsc-tools/), un petite interface graphique pour envoyer des instructions à la carte.\n",
    "\n",
    "Voici les données à exploiter dans le prochain TD. \n",
    "\n",
    "<img src=\"gscript.png\" width=\"960\" height=\"540\" />\n",
    "\n",
    "On peut trouver des explications détaillées dans cette [archive](cb.pdf) d'un site disparu."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
