RSA au quotidien

HTTPS et TLS

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).

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.

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.

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é.

Chaque message contient un code d'authentification de message (MAC) qui assure l'intégrité des données transmises.

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.

Les connections TLS utilisent des certificats basés sur des autorités de certification, et respectant le standard X.509.

Ces certificats sont pré-installés sur les navigateur, de sorte qu'un utilisateur pourra faire confiance à un site sécurisé seulement si :

  • Le navigateur implémente correctement le protocole HTTPS et les certificats sont correctement installés
  • L'utilisateur fait confiance aux autorités de certification
  • Le site consulté produit un certificat valide
  • Le certificat identifie correctement le site
  • L'utilisateur fait confiance au protocole TLS

Ces conditions ne sont pas toujours réunies, voir par exemple ici ou pour quelques exemples édifiants.

Certificats X.509

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).

On peut voir les certificats de firefox en allant dans préférences/avancé/certificats :

On clique sur "exporter", et on obtient (par défaut) un fichier au format pem.

In [1]:
!cat Amazon
-----BEGIN CERTIFICATE-----
MIIESTCCAzGgAwIBAgITBn+UV4WH6Kx33rJTMlu8mYtWDTANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MTAyMjAwMDAwMFoXDTI1MTAxOTAwMDAwMFowRjEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEVMBMGA1UECxMMU2VydmVyIENB
IDFCMQ8wDQYDVQQDEwZBbWF6b24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDCThZn3c68asg3Wuw6MLAd5tES6BIoSMzoKcG5blPVo+sDORrMd4f2AbnZ
cMzPa43j4wNxhplty6aUKk4T1qe9BOwKFjwK6zmxxLVYo7bHViXsPlJ6qOMpFge5
blDP+18x+B26A0piiQOuPkfyDyeR4xQghfj66Yo19V+emU3nazfvpFA+ROz6WoVm
B5x+F2pV8xeKNR7u6azDdU5YVX1TawprmxRC1+WsAYmz6qP+z8ArDITC2FMVy2fw
0IjKOtEXc/VfmtTFch5+AfGYMGMqqvJ6LcXiAhqG5TI+Dr0RtM88k+8XUBCeQ8IG
KuANaL7TiItKZYxK1MMuTJtV9IblAgMBAAGjggE7MIIBNzASBgNVHRMBAf8ECDAG
AQH/AgEAMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUWaRmBlKge5WSPKOUByeW
dFv5PdAwHwYDVR0jBBgwFoAUhBjMhTTsvAyUlC4IWZzHshBOCggwewYIKwYBBQUH
AQEEbzBtMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5yb290Y2ExLmFtYXpvbnRy
dXN0LmNvbTA6BggrBgEFBQcwAoYuaHR0cDovL2NydC5yb290Y2ExLmFtYXpvbnRy
dXN0LmNvbS9yb290Y2ExLmNlcjA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3Js
LnJvb3RjYTEuYW1hem9udHJ1c3QuY29tL3Jvb3RjYTEuY3JsMBMGA1UdIAQMMAow
CAYGZ4EMAQIBMA0GCSqGSIb3DQEBCwUAA4IBAQCFkr41u3nPo4FCHOTjY3NTOVI1
59Gt/a6ZiqyJEi+752+a1U5y6iAwYfmXss2lJwJFqMp2PphKg5625kXg8kP2CN5t
6G7bMQcT8C8xDZNtYTd7WPD8UZiRKAJPBXa30/AbwuZe0GaFEQ8ugcYQgSn+IGBI
8/LwhBNTZTUVEWuCUUBVV18YtbAiPq3yXqMB48Oz+ctBWuZSkbvkNodPLamkB2g1
upRyzQ7qDn1X8nn8N8V7YJ6y68AtkHcNSRAnpTitxBKjtKPISLMVCx7i4hncxHZS
yLyKQXhw2W2Xs0qLeC1etA+jTGDK4UfLeC0SF7FSi8o5LL21L8IzApar2pR/
-----END CERTIFICATE-----

On reconnait un encodage en base 64. Comme pour les clefs ssh, on pourrait décoder le base 64 et continuer avec pyasn1. Pour cela, il faut connaître la structure du certificat, définie dans la RFC2459

La partie authentifiée contient les champs suivants :

    Version
    Numéro de série
    Algorithme de signature du certificat
    DN (Distinguished Name) du délivreur (autorité de certification)
    Validité (dates limites)
        Pas avant
        Pas après
    DN de l'objet du certificat
    Informations sur la clé publique
        Algorithme de la clé publique
        Clé publique proprement dite
    Identifiant unique du signataire (optionnel, X.509v2)
    Identifiant unique du détenteur du certificat (optionnel, X.509v2)
    Extensions (optionnel, à partir de X.509v3)
        Liste des extensions
    Signature des informations ci-dessus par l'autorité de certification
 
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.

Pour décoder les certificats, il est plus simple d'utiliser openssl :

In [2]:
!openssl x509 -in Amazon -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            06:7f:94:57:85:87:e8:ac:77:de:b2:53:32:5b:bc:99:8b:56:0d
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Amazon, CN=Amazon Root CA 1
        Validity
            Not Before: Oct 22 00:00:00 2015 GMT
            Not After : Oct 19 00:00:00 2025 GMT
        Subject: C=US, O=Amazon, OU=Server CA 1B, CN=Amazon
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:c2:4e:16:67:dd:ce:bc:6a:c8:37:5a:ec:3a:30:
                    b0:1d:e6:d1:12:e8:12:28:48:cc:e8:29:c1:b9:6e:
                    53:d5:a3:eb:03:39:1a:cc:77:87:f6:01:b9:d9:70:
                    cc:cf:6b:8d:e3:e3:03:71:86:99:6d:cb:a6:94:2a:
                    4e:13:d6:a7:bd:04:ec:0a:16:3c:0a:eb:39:b1:c4:
                    b5:58:a3:b6:c7:56:25:ec:3e:52:7a:a8:e3:29:16:
                    07:b9:6e:50:cf:fb:5f:31:f8:1d:ba:03:4a:62:89:
                    03:ae:3e:47:f2:0f:27:91:e3:14:20:85:f8:fa:e9:
                    8a:35:f5:5f:9e:99:4d:e7:6b:37:ef:a4:50:3e:44:
                    ec:fa:5a:85:66:07:9c:7e:17:6a:55:f3:17:8a:35:
                    1e:ee:e9:ac:c3:75:4e:58:55:7d:53:6b:0a:6b:9b:
                    14:42:d7:e5:ac:01:89:b3:ea:a3:fe:cf:c0:2b:0c:
                    84:c2:d8:53:15:cb:67:f0:d0:88:ca:3a:d1:17:73:
                    f5:5f:9a:d4:c5:72:1e:7e:01:f1:98:30:63:2a:aa:
                    f2:7a:2d:c5:e2:02:1a:86:e5:32:3e:0e:bd:11:b4:
                    cf:3c:93:ef:17:50:10:9e:43:c2:06:2a:e0:0d:68:
                    be:d3:88:8b:4a:65:8c:4a:d4:c3:2e:4c:9b:55:f4:
                    86:e5
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE, pathlen:0
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
            X509v3 Subject Key Identifier: 
                59:A4:66:06:52:A0:7B:95:92:3C:A3:94:07:27:96:74:5B:F9:3D:D0
            X509v3 Authority Key Identifier: 
                keyid:84:18:CC:85:34:EC:BC:0C:94:94:2E:08:59:9C:C7:B2:10:4E:0A:08

            Authority Information Access: 
                OCSP - URI:http://ocsp.rootca1.amazontrust.com
                CA Issuers - URI:http://crt.rootca1.amazontrust.com/rootca1.cer

            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://crl.rootca1.amazontrust.com/rootca1.crl

            X509v3 Certificate Policies: 
                Policy: 2.23.140.1.2.1

    Signature Algorithm: sha256WithRSAEncryption
         85:92:be:35:bb:79:cf:a3:81:42:1c:e4:e3:63:73:53:39:52:
         35:e7:d1:ad:fd:ae:99:8a:ac:89:12:2f:bb:e7:6f:9a:d5:4e:
         72:ea:20:30:61:f9:97:b2:cd:a5:27:02:45:a8:ca:76:3e:98:
         4a:83:9e:b6:e6:45:e0:f2:43:f6:08:de:6d:e8:6e:db:31:07:
         13:f0:2f:31:0d:93:6d:61:37:7b:58:f0:fc:51:98:91:28:02:
         4f:05:76:b7:d3:f0:1b:c2:e6:5e:d0:66:85:11:0f:2e:81:c6:
         10:81:29:fe:20:60:48:f3:f2:f0:84:13:53:65:35:15:11:6b:
         82:51:40:55:57:5f:18:b5:b0:22:3e:ad:f2:5e:a3:01:e3:c3:
         b3:f9:cb:41:5a:e6:52:91:bb:e4:36:87:4f:2d:a9:a4:07:68:
         35:ba:94:72:cd:0e:ea:0e:7d:57:f2:79:fc:37:c5:7b:60:9e:
         b2:eb:c0:2d:90:77:0d:49:10:27:a5:38:ad:c4:12:a3:b4:a3:
         c8:48:b3:15:0b:1e:e2:e2:19:dc:c4:76:52:c8:bc:8a:41:78:
         70:d9:6d:97:b3:4a:8b:78:2d:5e:b4:0f:a3:4c:60:ca:e1:47:
         cb:78:2d:12:17:b1:52:8b:ca:39:2c:bd:b5:2f:c2:33:02:96:
         ab:da:94:7f
-----BEGIN CERTIFICATE-----
MIIESTCCAzGgAwIBAgITBn+UV4WH6Kx33rJTMlu8mYtWDTANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MTAyMjAwMDAwMFoXDTI1MTAxOTAwMDAwMFowRjEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEVMBMGA1UECxMMU2VydmVyIENB
IDFCMQ8wDQYDVQQDEwZBbWF6b24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDCThZn3c68asg3Wuw6MLAd5tES6BIoSMzoKcG5blPVo+sDORrMd4f2AbnZ
cMzPa43j4wNxhplty6aUKk4T1qe9BOwKFjwK6zmxxLVYo7bHViXsPlJ6qOMpFge5
blDP+18x+B26A0piiQOuPkfyDyeR4xQghfj66Yo19V+emU3nazfvpFA+ROz6WoVm
B5x+F2pV8xeKNR7u6azDdU5YVX1TawprmxRC1+WsAYmz6qP+z8ArDITC2FMVy2fw
0IjKOtEXc/VfmtTFch5+AfGYMGMqqvJ6LcXiAhqG5TI+Dr0RtM88k+8XUBCeQ8IG
KuANaL7TiItKZYxK1MMuTJtV9IblAgMBAAGjggE7MIIBNzASBgNVHRMBAf8ECDAG
AQH/AgEAMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUWaRmBlKge5WSPKOUByeW
dFv5PdAwHwYDVR0jBBgwFoAUhBjMhTTsvAyUlC4IWZzHshBOCggwewYIKwYBBQUH
AQEEbzBtMC8GCCsGAQUFBzABhiNodHRwOi8vb2NzcC5yb290Y2ExLmFtYXpvbnRy
dXN0LmNvbTA6BggrBgEFBQcwAoYuaHR0cDovL2NydC5yb290Y2ExLmFtYXpvbnRy
dXN0LmNvbS9yb290Y2ExLmNlcjA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3Js
LnJvb3RjYTEuYW1hem9udHJ1c3QuY29tL3Jvb3RjYTEuY3JsMBMGA1UdIAQMMAow
CAYGZ4EMAQIBMA0GCSqGSIb3DQEBCwUAA4IBAQCFkr41u3nPo4FCHOTjY3NTOVI1
59Gt/a6ZiqyJEi+752+a1U5y6iAwYfmXss2lJwJFqMp2PphKg5625kXg8kP2CN5t
6G7bMQcT8C8xDZNtYTd7WPD8UZiRKAJPBXa30/AbwuZe0GaFEQ8ugcYQgSn+IGBI
8/LwhBNTZTUVEWuCUUBVV18YtbAiPq3yXqMB48Oz+ctBWuZSkbvkNodPLamkB2g1
upRyzQ7qDn1X8nn8N8V7YJ6y68AtkHcNSRAnpTitxBKjtKPISLMVCx7i4hncxHZS
yLyKQXhw2W2Xs0qLeC1etA+jTGDK4UfLeC0SF7FSi8o5LL21L8IzApar2pR/
-----END CERTIFICATE-----

On voit donc que les serveurs d'Amazon utilisent une clef RSA de 2048 bits, et une signture RSA d'un hachage SHA256.

Il existe un module tiers, pyopenssl permettant d'utiliser openssl avec Python.

Les cartes bancaires

Jusqu'à une époque récente, le paiement par cartes bancaires était authentifié à l'aide d'une simple signature RSA.

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.

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é.

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.

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.

Le résultat se compose des données demandées et de deux octets SW1, SW2 indiquant si tout s'est bien passé.

Sur un système Linux disposant d'un lecteur de cartes à puce, il faut installer pcsc-lite et activer le démon pcscd. Il est interfacé avec Python (module pyscard. On peut aussi utiliser gscriptor, un petite interface graphique pour envoyer des instructions à la carte.

Voici les données à exploiter dans le prochain TD.

On peut trouver des explications détaillées dans cette archive d'un site disparu.

In [2]: