Cryptographie - Gabriel RISTERUCCI
Transcription
Cryptographie - Gabriel RISTERUCCI
Cryptographie TP 6 Applications pratique L'objectif est de manipuler quelques outils en ligne de commande pour mettre en œuvre des schémas simples de chiffrement et de signature. Les exercices sont à réaliser sous Linux, depuis une invite de commande (un terminal). Se placer dans un répertoire vide pour commencer... OpenSSL : OpenSSL est une bibliothèque de cryptographie opensource permettant de réaliser l'ensemble des fonctions courantes. Il existe également un outil utilisable en ligne de commande permettant d'accéder à ces fonctions. Gestion des certificats RSA - Génération d'un certificat auto-signé Commande : openssl req -x509 -days 365 -newkey rsa:1024 -keyout private.key -out certificate.pem Le champ important ici est « Common Name ». Dans le cas d'un site internet, il s'agit du nom d'hôte utilisé par les clients. Avec cette commande, la clé privée est chiffrée par une passphrase. Dans le cas d'une clé utilisée par un système automatisé, on peut éviter ce chiffrement en ajoutant le paramètre -nodes. Cela génère un certificat auto-signé ( certificate.pem) et la clé privée associée (private.key). - Vérification du certificat Pour afficher les informations du certificat : openssl x509 -text -in certificate.pem On y retrouve les informations saisies précédemment. Chercher le champ émetteur, et détenteur... - Test : récupération d'un certificat SSL La commande suivante permet de récupérer un certificat depuis un serveur SSL : (taper les 3 lignes) echo |\ openssl s_client -connect <host>:443 2>&1 |\ sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > server.pem Cette commande établit une connexion avec le serveur <host>, et en récupère le certificat. Il est enregistré dans le fichier server.pem. On peut ensuite en afficher les informations avec la commande précédente. Essayer avec le nom d'hôte « sango.cleyfaye.net ». On constate que l'émetteur et le détenteur du certificat ne sont pas les mêmes... Signature d'un message - Signer un message openssl smime -sign -signer certificate.pem \ -inkey private.key > message.signed Cela génère un message signé (format S/MIME) normalement utilisé pour les emails dans le fichier message.signed. Il est normalement possible d'envoyer ce fichier tel quel comme un e-mail avec la commande sendmail... Ce qu'on ne fera pas ici. - Vérification d'une signature Vous pouvez normalement vérifier la signature via la commande : openssl smime -verify -in message.signed Si vous essayez, vous verrez que la vérification échoue. Pour résoudre le problème utiliser la commande : openssl smime -verify -CAfile certificate.pem -in message.signed La commande -CAfile permet de spécifier un CA à utiliser. Pourquoi cette commande fonctionne ici, alors qu'il n'y a pas de CA ? Pour pouvoir échanger des messages signé, il faudrait faire parvenir le message signé, ainsi que la clé publique (certificate.pem). Chiffrement symétrique - Chiffrer un fichier Créer un message dans un fichier texte, appelé par exemple message.txt. OpenSSL permet de faire du chiffrement simple, basé sur mot de passe. Pour afficher la liste des algorithmes disponibles, utiliser : openssl list-cipher-commands Cette commande liste toutes les fonctions de chiffrement présente dans la version courante de OpenSSL, y comprit certaines méthodes qui ne sont pas de la cryptographie (par exemple, base64). On utilisera AES en mode CBC ici, on peut donc réduire la liste : openssl list-cipher-commands |grep aes |grep cbc Une fois l'algorithme choisi, on peut chiffrer ainsi : openssl enc -aes-256-cbc -in message.txt -out message.cipher Pour l'exemple, chiffrer deux fois le message dans deux fichiers différents (message.cipher1 et message.cipher2) avec le même mot de passe. Vérifier alors si les chiffrés sont différents avec : diff message.cipher1 message.cipher2 Pourquoi les deux fichiers sont différents ? Essayer en ajoutant le paramètre -nosalt … - Déchiffrer un fichier Aussi simplement : openssl enc -d -aes-256-cbc -in message.cipher -out message.decipher Normalement, on obtient en sortie le même fichier que l'entrée, ce que l'on peut vérifier avec la commande : diff message.txt message.decipher Si les deux fichiers sont identiques, rien n'est affiché. Autres commandes utiles Empreintes : openssl dgst -sha256 message.txt Extraite la clé pub. : Signer empreinte : openssl x509 -in certificate.pem -pubkey -noout > public.key openssl dgst -sha256 -sign private.key message.txt > hash.sign Vérifier : openssl dgst -sha256 -verify public.key -signature hash.sign message.txt Base64 : openssl enc -base64 -in message.txt OpenSSL en ligne de commande permet d'intégrer toutes ces fonctions dans des scripts complexes, et la bibliothèque de programmation est utilisé dans de nombreux programmes (par exemple navigateur web...) GnuPG : GnuPG/GPG est un outil permettant de faire du chiffrement et de la signature asymétrique. Son utilisation commence généralement par générer sa propre paire de clé. On diffuse ensuite sa clé, et on peut utiliser le système. - Génération de la clé gpg --gen-key On peut laisser la plupart des choix par défaut (clé RSA/RSA, taille 2048, sans expiration...). Noter/retenir l'identifiant de la clé utilisé : en face de la ligne « pub » pour la clé publique, « sub » pour la clé privée. - Chiffrement gpg -e -r <nom cible> message.txt (Pour tester, chiffrez pour vous dans un premier temps...) Cela produit un chiffré en ajoutant modifié). .gpg à la fin du nom du fichier original (non- - Déchiffrement gpg --output message.out -d message.txt.gpg Cela déchiffre avec la clé privée associée automatiquement. Si vous vous êtes mis comme destinataire, votre clé privé est stockée dans la liste des clés de votre compte, et le programme vous demande la passphrase associée. - Gestion des clés Pour que les autres puissent utiliser votre clé publique, il faut qu'ils la connaissent. Vous pouvez l'envoyer de cette façon : Il faut d'abord l'enregistrer dans un fichier : gpg --export -a <nom> > public.gpg Vous pouvez ensuite envoyer ce fichier (par exemple par mail) qui peut être intégré aux clés par la commande suivante : gpg --import public.gpg par le destinataire. Cette méthode n'apporte aucune garantie ; il faut s'assurer par d'autres moyens (par exemple, vérification de l'empreinte de la clé) que celle ci est bien intègre et authentique... Pour lister les clés présentes dans votre trousseau : gpg --list-keys - Application Enregistrez votre clé publique dans un fichier avec votre nom, et envoyez là au groupe de travail. Ajoutez les clés des autres dans votre list. Vous pouvez maintenant chiffrer un message avec la commande précédente, en mettant le nom de quelqu'un d'autre en destinataire (ce qui utilise la clé publique pour chiffrer). Faites le, et envoyez le message au groupe (par pièce jointe...). Mettez quand même de quoi savoir à qui il est réellement destiné pour gagner du temps... Vous pouvez essayer de déchiffrer les messages ; seul ceux qui vous sont destinés seront visible, et pourront être déchiffré avec votre clé privée. - Signatures On utilise la commande suivante : gpg --sign --local-user <nom signataire> message.txt Cela créera comme précédemment un fichier avec l'extension .gpg, contenant le message et sa signature. L'option --local-user peut être omise pour signer avec la clé par défaut (la première créé en général). Si vous ouvrez le fichier .gpg avec un éditeur de texte, vous pourrez y voir le message en clair. Il est possible de chiffrer en même temps, en combinant les commandes : gpg --sign -e -r <nom destinataire> message.txt - Vérification Commande de vérification : gpg --verify message.txt.gpg et dans le cas d'une version chiffrée : gpg -d message.txt.gpg On utilise la commande de déchiffrement. Si elle détecte une signature, cette dernière sera alors vérifiée. Si il reste du temps, essayez maintenant d'envoyer des messages signés aux autres...