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