Objectif
Se familiariser avec les services de base de la sécurité : chiffrement symétrique, chiffrement asymétrique, hachage, signature numérique et sa vérification, et certification. Le TP s’appuie sur la suite logicielle OpenSSL, une boîte à outils cryptographiques implémentant les protocoles SSL et TLS.
1. Chiffrement symétrique
Chiffrement avec l’algorithme RC4, sur un fichier fichier_nom_eleve contenant du texte clair :
openssl enc -rc4 -in fichier_nom_eleve -out fichier_chiff_algo
OpenSSL permet de donner un mot de passe en entrée : à partir de ce mot de passe, il dérive une clé de chiffrement. Le fichier chiffré, une fois transmis, se déchiffre et se vérifie ainsi :
openssl enc -rc4 -d -in fichier_chiff_rc -out fichier_dechiff_rc
diff fichier_nom_eleve fichier_dechiff_rc
Chiffrement avec l’algorithme DES, avec une clé explicite :
openssl enc -des -in fichier_nom_eleve -out fichier_chiff_des -k 0123456789ABCDEF
2. Chiffrement asymétrique
Le chiffrement RSA demande une paire de clés publique/privée, générée au préalable. En OpenSSL, les clés RSA sont stockées au format .pem (Privacy Enhanced Mail).
# génération d'une paire de clés RSA de 1024 bits
openssl genrsa -out rsakey.pem 1024
# affichage des clés en hexadécimal
openssl rsa -in rsakey.pem -text -noout
# extraction de la clé publique à partir de la clé privée
openssl rsa -in rsakey.pem -pubout -out rsapubkey.pem
# chiffrement de la clé privée elle-même avec AES256
openssl enc -AES256 -in rsakey.pem -out rsakeyencaes.pem
Chiffrer le fichier qui contient la paire de clés oblige à saisir un mot de passe à chaque utilisation de cette clé.
Chiffrement et déchiffrement de données avec RSA :
# chiffrement avec la clé publique du destinataire
openssl pkeyutl -pubin -inkey rsapubkey.pem -in fichier_nom_eleve -encrypt -out fichier_chiff_rsa
# déchiffrement avec la clé privée
openssl pkeyutl -inkey rsakey.pem -in fichier_chiff_rsa -decrypt -out fichier_dechiff_rsa
3. Signature numérique
Pour signer un document, on calcule d’abord son empreinte :
openssl dgst -md5 -out fichier_nom_eleve.md5 fichier_nom_eleve
openssl dgst -sha1 -out fichier_nom_eleve.sha1 fichier_nom_eleve
Signer un document revient à signer son empreinte, avec la clé privée ; la vérification se fait avec la clé publique correspondante :
# signature de l'empreinte avec la clé privée
openssl rsautl -sign -in fichier_nom_eleve.sha1 -inkey rsaprivkey.pem -out fichier_sig
# vérification de la signature avec la clé publique
openssl rsautl -verify -in fichier_sig -out empreinte2 -pubin -inkey rsapubkey.pem
4. Certificat numérique
# génération d'une paire de clés RSA de 1024 bits pour le serveur
openssl genrsa -out serveur_cle.pem 1024
# création d'une demande de signature de certificat (CSR)
openssl req -new -key serveur_cle.pem -out serveur_cert.pem
Un certificat se signe de deux façons : auto-signature, ou signature par une Autorité de Certification (AC).
Auto-signature, avec une période de validité d’un an :
openssl req -new -x509 -days 365 -key serveur_cle.pem -out serveur_cert.crt
openssl x509 -in serveur_cert.crt -text -noout
Signature par une AC : génération de la clé privée et du certificat auto-signé de l’AC, puis signature de la demande du serveur par cette AC.
# clé privée RSA de l'AC, 2048 bits
openssl genrsa -out cakey.pem 2048
# certificat auto-signé de l'AC, valide 730 jours
openssl req -new -x509 -days 730 -key cakey.pem -out ca_crt
# signature de la demande du serveur (server.csr) par l'AC
openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey cakey.pem -CAcreateserial -CAserial ca.srl