Le protocole SSL (Secure Socket Layer) a été développé par la société Netscape Communications Corporation pour permettre aux applications client/serveur de communiquer de façon sécurisée. TLS (Transport Layer Security) est une évolution de SSL réalisée par l’IETF.
La version 3 de SSL est utilisée par tous les navigateurs depuis le début des années 2000.
SSL est un protocole qui s’intercale entre TCP/IP et les applications qui s’appuient sur TCP. Une session SSL se déroule en deux temps
L’identification durant la poignée de mains est assurée à l’aide de certificats X509.
openSSL est une boîte à outils cryptographiques implémentant les protocoles SSL et TLS qui offre
Pour connaître toutes les fonctionnalités de openSSL : man openssl.
La syntaxe générale de la commande openssl est
$ openssl <commande> <options> |
(le $ est le prompt du shell)
Dans le texte qui suit, les commandes invoquant openssl supposent que cette commande est dans votre PATH.
C’est la commande enc qui permet de chiffrer/déchiffrer avec openssl :
$ openssl enc <options> |
Parmi les options, on doit indiquer le système de chiffrement à choisir dans la liste
aes-128-cbc AES 128 bis in CBC mode aes-128-ecb AES 128 bis in ECB mode aes-192-cbc AES 192 bis in CBC mode aes-192-ecb AES 192 bis in ECB mode aes-256-cbc AES 256 bis in CBC mode aes-256-ecb AES 256 bis in ECB mode base64 Base 64 bf-cbc Blowfish in CBC mode bf Alias for bf-cbc bf-cfb Blowfish in CFB mode bf-ecb Blowfish in ECB mode bf-ofb Blowfish in OFB mode cast-cbc CAST in CBC mode cast Alias for cast-cbc cast5-cbc CAST5 in CBC mode cast5-cfb CAST5 in CFB mode cast5-ecb CAST5 in ECB mode cast5-ofb CAST5 in OFB mode des-cbc DES in CBC mode des Alias for des-cbc des-cfb DES in CBC mode des-ofb DES in OFB mode des-ecb DES in ECB mode des-ede-cbc Two key triple DES EDE in CBC mode des-ede Alias for des-ede des-ede-cfb Two key triple DES EDE in CFB mode des-ede-ofb Two key triple DES EDE in OFB mode des-ede3-cbc Three key triple DES EDE in CBC mode des-ede3 Alias for des-ede3-cbc des3 Alias for des-ede3-cbc des-ede3-cfb Three key triple DES EDE CFB mode des-ede3-ofb Three key triple DES EDE in OFB mode desx DESX algorithm. idea-cbc IDEA algorithm in CBC mode idea same as idea-cbc idea-cfb IDEA in CFB mode idea-ecb IDEA in ECB mode idea-ofb IDEA in OFB mode rc2-cbc 128 bit RC2 in CBC mode rc2 Alias for rc2-cbc rc2-cfb 128 bit RC2 in CBC mode rc2-ecb 128 bit RC2 in CBC mode rc2-ofb 128 bit RC2 in CBC mode rc2-64-cbc 64 bit RC2 in CBC mode rc2-40-cbc 40 bit RC2 in CBC mode rc4 128 bit RC4 rc4-64 64 bit RC4 rc4-40 40 bit RC4 rc5-cbc RC5 cipher in CBC mode rc5 Alias for rc5-cbc rc5-cfb RC5 cipher in CBC mode rc5-ecb RC5 cipher in CBC mode rc5-ofb RC5 cipher in CBC mode
base64 n’est pas un système de chiffrement, mais un codage des fichiers binaires avec 64 caractères ASCII. Ce codage est utilisé en particulier pour la transmission de fichiers binaires par courrier électronique.
Pour chiffrer le fichier toto avec le système Blowfish en mode CBC, avec une clé générée par mot de passe, le chiffré étant stocké dans le fichier toto.chiffre, on utilise la commande :
$ openssl enc -bf-cbc -in toto -out toto.chiffre |
Pour déchiffrer le même message, on utilise la commande :
$ openssl enc -bf-cbc -d -in toto.chiffre -out toto.dechiffre |
Vérification
$ diff toto toto.dechiffre |
Exercice 1.
Question 1.
Chiffrez le fichier de votre choix avec le système de votre choix dans le mode de votre choix, puis déchiffrez-le.
Question 2.
Comparez les tailles des fichiers clairs et chiffrés. Donnez une explication sur la différence de ces tailles.
Question 3.
Tentez de déchiffrer un cryptogramme en utilisant un mauvais mot de passe. Comment réagit openSSL ?
Exercice 2. Le fichier cryptogramme1 a été chiffré avec le système AES en mode CBC, la clé de 128 bits ayant été obtenue par mot de passe.
Question 1.
Le mot de passe codé en base 64 est Q29tVGVzc2U=
. À
l’aide de la commande openssl appropriée, décodez le mot de
passe.
Question 2.
Déchiffrez ensuite le cryptogramme1.
Pour chiffrer le fichier toto avec une clé explicite, il faut utiliser les options -K et -iv
L’exemple qui suit montre la commande pour chiffrer toto avec Blowfish en mode CBC avec un vecteur d’initialisation de 64 bits exprimé par 16 chiffres hexa, et une clé de 128 bits exprimée par 32 chiffres hexa.
$ openssl enc -bf-cbc -in toto -out toto.chiffre -iv 0123456789ABCDEF -K 0123456789ABCDEF0123456789ABCDEF |
Exercice 3.
Question 1.
Chiffrez le fichier clair1 avec le
système Blowfish en mode OFB, en utilisant le vecteur d’initialisation
(option -iv) et la clé (option -K) de votre choix.
Question 2.
Chiffrez le fichier clair correspondant au
cryptogramme1 avec le même système, la même clé et
le même vecteur d’initialisation que dans la question qui précède.
On peut générer une paire de clés RSA avec la commande genrsa de openSSL.
$ openssl genrsa -out <fichier> <taille> |
où fichier
est un nom de fichier de sauvegarde de la clé, et taille
et la taille souhaitée (exprimée en bits) du modulus de la clé.
Par exemple, pour générer une paire de clés de 1024 bits, stockée dans le fichier maCle.pem, on tape la commande
$ openssl genrsa -out maCle.pem 1024 |
Le fichier obtenu est un fichier au format PEM (Privacy Enhanced Mail, format en base 64), dont voici un exemple
$ cat maCle.pem -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCveVjLltevTC5kSAiTYjHMVuAR80DHMLWCp3BOVZ49eXwraXxO 7AfKWpA5g0wFZgZNERIfFYaCnvaQDQA+9BRIfsSSr3oSw0My5SD6eg15v0VmJmvP d8LgBypJHbr6f5MXWqntvzp0Qvg6ddeNpUIrqkkh4uDfHFDWqyrkQUCvKwIDAQAB AoGANchUrfnq28DWy0fE0R+cscvC292Z8jN8vrIBWxEk8iSlKU0om6v+a0g8wlP6 3gC6V66uxjY7xxdf7SD+/UykVl4PGFymhLtywSdGlgec3tLgBtV3ytJFilAVDBij LzQwUegCO4zt1JWYc6vvaVdNyQSaGIIeYGsNDWEYlOtDSlkCQQDVRn9JS15G8p+H 4Z0PbU9ZQg2L1u9/SD/kELVe3Kx1fdHulxH0v8V2AgPdXA29Nhi+TxUtC+V8CMc2 KXmAvFsHAkEA0qBDmjHMDPwcGaqbQ2lymYQIGlZ5TLQFA98Dey2uE+CB6pmS/e/Z ilu1IaasuE3vBzXfB/JU7DUkV++JQ7TtvQJBAL2s5dUch2sXqlOhjhpDP/eE7CE6 9WLAsbm2Nmd4YJRZYtQLXPfLeeSapC9BCCMHsnfGQ3H9i4mFEQ6VUi7w1Q8CQAQa pVaS09QI8Y86eM4GdvowzWud9b0d4N8jcFDtIfA3NrDYjzmte8KraMsgEUuCET9F uHPSL/9uRagE/dq44s0CQCMQU4PMqkMtwzCFsV8ZqLmkDPn1binIAwRLYFcsQRDt gTi6rycz3Pk1hCVzBfyMd8zwqpwKmR5FoOXuJEv+mVg= -----END RSA PRIVATE KEY----- |
La commande rsa permet de visualiser le contenu d’un fichier au format PEM contenant une paire de clés RSA.
$ openssl rsa -in <fichier> -text -noout |
L’option -text demande l’affichage décodé de la paire de clés. L’option -noout supprime la sortie normalement produite par la commande rsa.
Par exemple
$ openssl rsa -in maCle.pem -text -noout
Private-Key: (1024 bit)
modulus: 00:af:79:58:cb:96:d7:af:4c:2e:64:48:08:93:62: 31:cc:56:e0:11:f3:40:c7:30:b5:82:a7:70:4e:55: 9e:3d:79:7c:2b:69:7c:4e:ec:07:ca:5a:90:39:83: 4c:05:66:06:4d:11:12:1f:15:86:82:9e:f6:90:0d: 00:3e:f4:14:48:7e:c4:92:af:7a:12:c3:43:32:e5: 20:fa:7a:0d:79:bf:45:66:26:6b:cf:77:c2:e0:07: 2a:49:1d:ba:fa:7f:93:17:5a:a9:ed:bf:3a:74:42: f8:3a:75:d7:8d:a5:42:2b:aa:49:21:e2:e0:df:1c: 50:d6:ab:2a:e4:41:40:af:2b publicExponent: 65537 (0x10001)
privateExponent:
prime1:
prime2:
exponent1:
exponent2:
coefficient: |
Les différents éléments de la clé sont affichés en hexadécimal (hormis l’exposant public). On peut distinguer le modulus, l’exposant public qui par défaut est toujours 65537 (openssl n’autorise que deux exposants publics : 65537 (valeur par défaut) ou 3 obtenu avec l’option -3), l’exposant privé, les nombres premiers facteurs du modulus, plus trois autres nombres qui servent à optimiser l’algorithme de déchiffrement.
Exercice 4. Donnez une explication du choix de la valeur 65537 pour exposant public par défaut.
Il n’est pas prudent de laisser une paire de clés en clair (surtout la partie privée). Avec la commande rsa, il est possible de chiffrer une paire de clés (Il est possible de chiffrer le fichier lors de sa génération. Il suffit de mettre l’une des trois options -des, -des3, -idea dans la ligne de commande genrsa). Pour cela trois options sont possibles qui précisent l’algorithme de chiffrement symétrique à utiliser : -des, -des3 et -idea.
$ openssl rsa -in maCle.pem -des3 -out maCle.pem
writing RSA key Enter PEM pass phrase: Verifying - Enter PEM pass phrase: |
Une phrase de passe est demandée deux fois pour générer une clé symétrique protégeant l’accès à la clé.
Exercice 5. Avec la commande cat observez le contenu du fichier maCle.pem. Utilisez à nouveau la commande rsa pour visualiser le contenu de la clé.
La partie publique d’une paire de clés RSA est publique, et à ce titre peut être communiquée à n’importe qui. Le fichier maCle.pem contient la partie privée de la clé, et ne peut donc pas être communiqué tel quel (même s’il est chiffré). Avec l’option -pubout on peut exporter la partie publique d’une clé.
$ openssl rsa -in maCle.pem -pubout -out maClePublique.pem |
Exercice 6.
Question 1.
Notez le contenu du fichier maClePublique.pem. Remarquez les marqueurs de début et de fin.
Question 2.
Avec la commande rsa visualisez la clé publique. Attention vous devez préciser l’option -pubin, puisque seule la partie publique figure dans le fichier maClePublique.pem.
On peut chiffrer des données avec une clé RSA. Pour cela on utilise la commande rsautl
$ openssl rsautl -encrypt -in <fichier_entree> -inkey <cle> -out <fichier_sortie> |
où
fichier_entree
est le fichier des données à chiffrer. Attention, le fichier des données à chiffrer ne doit pas avoir une taille excessive (ne doit pas dépasser 116 octets pour une clé de 1024 bits). cle
est le fichier contenant la clé RSA. Si ce fichier ne contient que la parte publique de la clé, il faut rajouter l’option -pubin.
fichier_sortie
est le fichier de données chiffré.
Pour déchiffrer on remplace l’option -encrypt par -decrypt. Le fichier contenant la clé doit évidemment contenir la partie privée.
Exercice 7. Chiffrez le fichier de votre choix avec le système symétrique de votre choix. Chiffrez la clé ou le mot de passe utilisé(e) avec la clé publique de votre destinataire (demandez-lui sa clé publique si vous ne l’avez pas). Envoyez-lui le mot de passe chiffré ainsi que le fichier chiffré.
Exercice 8. Il s’agit de déchiffrer le fichier cryptogramme2. Pour cela vous devez récupérer les fichiers suivants (attention la plupart de ces fichiers sont des fichiers binaires)
Il n’est possible de signer que de petits documents. Pour signer un gros document on calcule d’abord une empreinte de ce document. La commande dgst permet de le faire.
$ openssl dgst <hachage> -out <empreinte> <fichier_entree> |
où hachage
est une
fonction de hachage. Avec openssl, plusieurs fonctions de
hachage sont proposées dont
Signer un document revient à signer son empreinte. Pour cela, on utilise l’option -sign de la commande rsautl
$ openssl dgst -sign <clef_privee.pem> -keyform PEM -sha256 -binary <fichier_entree> -out <signature> |
et pour vérifier la signature
$ openssl dgst -verify <clef_publique.pem> -keyform PEM -signature <signature> -binary <fichier_entree> |
il reste ensuite à vérifier que l’empreinte ainsi produite est la même que celle que l’on peut calculer. L’option -pubin indique que la clé utilisée pour la vérification est la partie publique de la clé utilisée pour la signature.
Exercice 9.
Signez le fichier de votre choix, puis vérifiez la signature.
Exercice 10. Récupérez l’archive signatures.tar qui contient deux fichiers accompagnés d’une signature
ainsi que la partie publique de la clé RSA ayant produit la signature : key.pub.
De ces deux fichiers, lequel a bien été signé ?