Tutoriel : Utilisation de base de OpenSSL

1 – Introduction

OpenSSL est une boite à outils qui comporte deux bibliothèques « libcrypto » et « libssl ». Elles implémentent respectivement une variété d’algorithmes de la cryptographie (Chiffrement symétrique/asymétrique, hachage, signature numérique, certificats, …) et le protocole de communication SSL/TLS. Elle offre également une interface ligne de commande qui s’appelle « openssl ».

Elle est développée en langage C, et est sortie en 1998 pour la première fois.

2 – Qu’est ce que OpenSSL

La bibliothèque OpenSSL est une implémentation libre des protocoles SSL et TSL. Elle donne accès à :

  • Une bibliothèque de fonctionnalité écrite en C permettant de réaliser des applications client/serveur sécurisées s’appuyant sur SSL/TSL,
  • Un ensemble d’exécutables en ligne de commande permettant :
    • La création de clés RSA, DSA (pour les signatures)
    • La création de certificat X509 (identification)
    • Le calcul d’empreinte (MD5, SHA, RIPEMD160, …)
    • Le chiffrement et le déchiffrement (RSA, DES, IDEA, RC2, RC4, Blowfish, …)
    • La réalisation de de tests de clients et serveurs SSL/TSL
    • La signature et le chiffrement de courriers (S/MIME).

Généralement, OpenSSL est installée par défaut sur les système d’exploitation Linux. Pour avoir l’aide sur les fonctionnalités et l’utilisation en général de la bibliothèque OpenSSL, il faut taper la commande :

$ man openssl

La syntaxe générale pour l’utilisation en mode shell des fonctionnalités OpenSSL est la suivante :

$ openssl <commande> <options>

3 – Utilisation

3.1 – Chiffrement symétrique

Le chiffrement symétrique ou crypto-système à clé privée, utilise la même clé pour le chiffrement et le déchiffrement. Ceci nécessite que l’émetteur et le récepteur du message partagent la même clé privée. La figure suivante illustre bien le principe du chiffrement symétrique :

Parmi les crypto-systèmes à clé privée, on trouve AES, BlowFish, … etc. 
Dans la suite, on va considérer le crypto-système AES. Pour utiliser AES, on a besoin d’un mot de passe avec lequel on génère une clé de chiffrement/déchiffrement. Pour cela, on peut choisir n’importe quel chaîne de caractères, ou on peut également générer aléatoirement une chaîne en utilisant la commande « rand » d’OpenSSL :

$ openssl rand 32 > aes.key 

Cette commande va générer aléatoirement une chaîne de « 32 » caractères et la stocke dans un fichier qui s’appelle « aes.key ».

Pour chiffrer un fichier « file.txt » par exemple avec le chiffrement AES et la clé « aes.key », on va utiliser la commande « enc » de « OpenSSL » :

$ openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -salt -in file.txt -out file.aes - kfile aes.key

Quelques remarques :

  • -aes-256-cbc : Cette option indique que AES 256 avec le mode CDC qui est utilisé pour le chiffrement.
  • -pbkdf2 : Cette option d’indique l’utilisation de l’algorithme PBKDF2 avec un nombre d’itération (par défaut ou précisé par « -iter »), dans le but d’augmenter la résistance aux attaques par force brute.
  • -iter 100000 : Cette option sert à indiquer un nombre d’itérations différent de celui par défaut.
  • -salt : Cette option indique l’utilisation d’un salt lors du chiffrement.

Pour déchiffrer le message on utilise la même commande précédente à qui on ajoute l’option « -d » :

$ openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 -salt -in file.aes -out dec_file.txt - kfile aes.key

Cette commande va déchiffrer le fichier « file.aes » et mettre le résultat dans le fichier « dec_file.txt ».

3.2 – Chiffrement asymétrique

Les crypto-systèmes asymétriques utilisent une paire de clés (publique et privée). La clé publique est connue par tout le monde, et est utilisée pour chiffrer les messages destinés au propriétaire de la clé. La clé privée est utilisée, quant-à-elle, pour déchiffrer les messages reçus. La figure suivante illustre le principe de ce crypto-système :

3.2.1 – Génération de clés RSA

Avant de pouvoir chiffrer et déchiffrer des messages en utilisant RSA, il faudra d’abord créer une paire de clés. Pour cela, on utilise la commande « genrsa » de « OpenSSL » :

$ openssl genrsa -out key.pem 512

A la fin, on aura une clé privée RSA de 512 bits dans un fichier « key.pem ». 
Il est souvent recommander de protéger cette clé (fichier) par un mot de passe. Pour cela, l’algorithme DES3 est utilisé pour chiffrer ce fichier :

$ openssl rsa -in key.pem -des3 -out key.pem

A ce stade, on a un fichier « key.pem » qui contient une clé privée RSA chiffrer en utilisant un mot de passe et l’algorithme DES3. Ce fichier tel qu’il est ne sert pas à grand chose. En effet, on a besoin d’en extraire la clé publique et la partager avec les autres. Ceci va leur permettre de nous envoyer des messages chiffrés. Pour cela, il faut taper la commande suivante :

$ openssl rsa -in key.pem -pubout -out key.pub

Puisque, la clé privée « key.pem » est protéger par mot de passe, cette commande demande de taper le mot de passe, puis extrait la clé publique et la met dans un fichier « key.pub ». Ce dernier, peut être partagé avec les personnes qui veulent nous envoyer un message de manière confidentielle.

3.2.2 – Chiffrement avec RSA

Pour chiffrer un message avec RSA, on utilise la commande « rsault » avec l’option « -encrypt ». On lui donne la clé publique du destinataire « key.pub ». La commande pour faire le chiffrement est la suivante :

$ openssl rsautl -encrypt -pubin -inkey key.pub -in file.txt -out file.enc  

3.2.3 – Déchiffrement avec RSA

Pour déchiffrer un message avec RSA, on utilise la commande « rsault » avec l’option « -decrypt ». Il faut lui donner la clé privée comme paramètre :

$ openssl rsautl -decrypt -inkey key.pem -in file.enc -out file.dec

3.3 – Chiffrement hybride

Généralement le chiffrement asymétrique n’est pas utilisé tout seul, même s’il a des avantages. En effet, il est très souvent combiné avec le chiffrement symétrique Pour les raisons suivantes :

  •  Le chiffrement asymétrique (exemple RSA) ne permet pas de chiffrer de gros volumes de données. La taille des données qu’on peut chiffrer est limitée à quelques centaines d’octets.
  • Le chiffrement asymétrique est très gourmand en puissance de calcul contrairement au chiffrement symétrique.

Le chiffrement hybride profite des avantages des deux types de chiffrement (symétrique et asymétrique). En effet, le principe consiste à chiffrer les données avec une clé symétrique (AES par exemple) puis chiffrer la clé symétrique avec l’algortihme asymétrique. Ensuite il faudra envoyer les deux résultats (données chiffrées et clé chiffrée) au destinataire.

La figure suivante illustre ce principe :

3.4 – Signature numérique

La signature numérique sert à prouver qu’un message à été bel et bien envoyé par l’émetteur et que personne d’autre ne s’est fait passer pour lui. Pour cela, l’émetteur signe numériquement le message avant de l’envoyer. Et à la réception du message, le destinataire vérifie la signature numérique pour confirmer l’authenticité de l’émetteur. La figure suivante illustre ce principe :

Les crypto-systèmes à clé publique offrent le mécanisme de signature numérique contrairement aux crypto-systèmes à clé privée.

La signature numérique ne peut pas s’appliquer sur un gros volume de données (messages longs, fichiers volumineux, …), c’est pour cela qu’on signe le hash du message ou du fichier à envoyer. Les étapes à suivre sont :

  1. Calculer l’empreinte (ou le hash) du message :
    $ openssl dgst -sha256 file.aes > file.aes.hash
  2. Signer ce hash en utilisant le crypto-système à clé publique
    $ openssl rsautl -sign -inkey key.pem -in file.aes.hash -out file.signature
  3. Vérification de la signature : retrouver le hash à partir de la signature
    $ openssl rsautl -verify -pubin -inkey key.pub -in file.signature -out hash

4 – Conclusion

Dans cet article, on a présenté une introduction à la boite à outils OpenSSL et son utilisation pour faire du chiffrement symétrique et asymétrique. On a vu également la signature numérique avec un crypto-système à clé publique.

Les crypto-systèmes choisis sont RSA pour le chiffrement asymétrique et la signature numérique, et AES pour le chiffrement symétrique.

On a vu également un exemple d’utilisation de fonction de hashage : SHA256 pour la réalisation de la signature numérique.

Tutoriel : Utilisation de CP-ABE avec docker

1 – Introduction

Ciphertext-Policy Attibute-Based Encryption (CP-ABE) est une technique cryptographique très puissante, elle permet d’implémenter du contrôle d’accès basé sur des rôles (RBAC). Dans cet article, on va présenter le fonctionnement le CP-ABE en général, puis, on va utiliser la librairie openABE (Une bibliothèque qui implémente CP-ABE) pour tester CP-ABE.

Afin d’éviter d’installer OpenABE, on va utiliser une image docker toute prête pour ça.

2 – C’est quoi CP-ABE ?

CP-ABE pour « Ciphertext Policy Attibute-Based Encryption », est une technique cryptographique qui permet d’implémenter le contrôle d’accès basé sur les rôles. Les rôles sont appelés ici des attributs.

La figure 1 montre les phases d’initialisation et de génération de clés. Elles concernent toutes les deux l’autorité des attributs. Cette dernière initialise les paramètres du système en générant les clés maîtresse publique et secrète. Ces mêmes clés sont utilisées pour générer les clés utilisateurs en utilisant la liste des attributs de chaque utilisateur. 

La figure 2, quant à elle, illustre les phases de chiffrement de déchiffrement. Pour chiffrer un fichier, un utilisateur a besoin de la clé maîtresse publique, le fichier en question, et un politique d’accès (Elle est montrée sous forme d’arbre logique sur la figure). En suite, vient l’étape de déchiffrement, où l’utilisateur « bob » utilise sa propre clé secrète, qui contient des attributs satisfaisant la politique d’accès, pour retrouver le contenu du fichier original.

3 – Préparation du terrain

Nous allons préparer le terrain pour pouvoir utiliser la technique cryptographique CP-ABE.

3.1 – Installation Docker

Pour pouvoir continuer ce tutoriel, il faut installer docker. En effet, dans la suite, on va utiliser des containers docker pour lancer l’exécution des primitives CP-ABE. Ceci facilite énormément la tâche, puisqu’il n’est pas nécessaire d’installer OpenABE directement sur le système.

3.2 – Télécharger l’image docker

Pour télécharger l’image docker qui intègre la librairie OpenABE, il faut taper la commande :

$ docker pull touatily/openabe

L’image fait un peu plus de 2GB, donc ça prend un peu de temps pour qu’elle soit téléchargée. Vous pouvez vérifier que le téléchargement s’est bien passé :

$ docker images

Et là, vous devriez voir apparaître la ligne qui correspond à cette image docker :


touatily/openabe             latest        662030668539          33 hours ago       2.11GB

4 – Utilisation de CP-ABE

Il y a quatre commandes principales de la technique cryptographique CP-ABE : Initialisation, génération des clés utilisateurs, chiffrement, et déchiffrement.

4.1 – Initialisation

La phase d’initialisation sert à initialiser les paramètres du systèmes; plus exactement, les clés maîtresse secrète et publique de l’autorité des attributs sont créées. Pour cela on tape la commande :

$ docker run -it --rm -w /root -v$(pwd):/root touatily/openabe oabe_setup -s CP -p exemple

Cette commande crée deux fichiers dans le répertoire courant via le container docker (qui sera supprimé juste après l’exécution de la commande). Les deux fichiers correspondent aux clés maîtresse (secrète et publique).

$ ls
exemple.mpk.cpabe exemple.msk.cpabe

L’option « -p » permet juste d’ajouter un préfixe (« exemple » dans ce cas) aux deux fichiers qui stockent les clés secrète et publique de l’autorité d’attributs.

4.2 – Génération de clés utilisateurs

Une fois la phase d’initialisation terminée, on va utiliser les clés de l’autorité d’attributs pour créer les clés privées des utilisateurs.

Chaque utilisateur se voit accorder des attributs qui correspondent à ses rôles/privilèges dans l’organisation/institution. Par exemple, un étudiant « Bob » en 5ème année, en spécialité cyber-sécurité, dans un école d’ingénieur qui s’appelle ESME, aura la liste des attributs : « year=5 », « cybersecurite », « ESME ». Et si par exemple, l’étudiant fait partie d’une association de l’école qui s’appelle « BDE », on ajoute ce nom à sa liste d’attributs.

$ docker run -it --rm -w /root -v$(pwd):/root touatily/openabe oabe_keygen -s CP -p exemple -i "year=5|cybersecurite|ESME|BDE" -o bob.key

La commande génère la clé privée CP-ABE de « Bob » qui est liée à sa liste d’attributs « year=5, cyber-sécurité, ESME, BDE ». Cette clé est stockée dans le fichier « bob.key ».

Considérons un autre étudiant qui s’appelle « Alice ». Elle fait ses études dans la même école « ESME », elle est en 4ème année spécialité intelligence artificielle « IA ». Elle fait également partie de l’association « BDE ». Par conséquent, la liste des attributs de Alice est « year=4, IA, ESME, BDE ».

$ docker run -it --rm -w /root -v$(pwd):/root touatily/openabe oabe_keygen -s CP -p exemple -i "year=4|IA|ESME|BDE" -o alice.key

La commande génère un fichier « alice.key » qui contient la clé privée de l’étudiante « Alice ». Cette clé possède des informations sur la liste des attributs d’Alice.

4.3 – Chiffrement de fichiers

Dans cette étape, on va chiffrer trois fichiers différents avec trois politique d’accès différents. Il faut noter ici, que la politique d’accès est choisie selon le contenu du fichier, plus précisément, en se basant sur la liste des personnes autorisées à lire le fichier.

Ce tableau résume la situation :

DescriptionsPolitiques d’accès
fichier1Ce fichier est destinés aux étudiants de l’ESME en spécialité Cyber-sécurité« ESME AND cybersecurite »
fichier2C’est un fichier destiné aux étudiants de l’ESME qui sont en 4ème année.« ESME AND year==4 »
fichier3C’est un fichier destinié aux étudiants de l’ESME qui font partie de l’assciation BDE. Ces étudiants doivent être en 4ème année ou une classe supérieure.« ESME AND BDE AND year>=4 »

Pour chiffrer les trois fichiers précédents, il faut tapper les commandes :

$ docker run -i --rm -w /root -v$(pwd):/root touatily/openabe oabe_enc -s CP -e "ESME AND cybersecurite" -i fichier1 -o encrypted_fichier1 -p exemple

$ docker run -i --rm -w /root -v$(pwd):/root touatily/openabe oabe_enc -s CP -e "ESME AND year==4" -i fichier2 -o encrypted_fichier2 -p exemple

$ docker run -i --rm -w /root -v$(pwd):/root touatily/openabe oabe_enc -s CP -e "ESME AND BDE AND year>=4" -i fichier3 -o encrypted_fichier3 -p exemple

Ces trois commandes génèrent trois fichiers : « encrypted_fichier1.cpabe », « encrypted_fichier2.cpabe », et « encrypted_fichier3.cpabe » qui correspondent aux résultats de chiffrement des fichiers « fichier1 », « fichier2 », et « fichier3 » respectivement. Comme indiqué précédemment, chacun des trois fichiers est chiffré selon une politique d’accès propre à lui.

4.4 – Déchiffrement

Dans cette étape, les deux étudiants « Alice » et « Bob » vont essayer de déchiffrer les fichiers qui ont été chiffrés durant l’étape précédente.

4.4.1 – Alice

D’après les politiques d’accès utilisées pour chiffrer les trois fichiers, Alice devrait pouvoir déchiffrer seulement « fichier2 » et « fichier3 ».

  • Fichier 1:
$ docker run -it --rm -w /root -v$(pwd):/root touatily/openabe oabe_dec -s CP -k alice.key -i encrypted_fichier1.cpabe -o alice_decrypted_fichier1 -p exemple 

ciphertext: encrypted_fichier1.cpabe
user’s SK file: alice.key
abe/zcontextcca.cpp:decrypt:613: ‘Error occurred during decryption’
caught exception: Error occurred during decryption

Une erreur se produit car la clé d’Alice ne permet pas de déchiffrer le fichier1.

  • Fichier 2:
$ docker run -it --rm -w /root -v$(pwd):/root touatily/openabe oabe_dec -s CP -k alice.key -i encrypted_fichier2.cpabe -o alice_decrypted_fichier2 -p exemple

ciphertext: encrypted_fichier2.cpabe
user’s SK file: alice.key

Cette fois, Alice réussit à déchiffrer le fichier2. Le contenu du fichier « decrypted_fichier2 » est identique à celui du fichier « fichier2 ».

  • Fichier 3:
$ docker run -it --rm -w /root -v$(pwd):/root touatily/openabe oabe_dec -s CP -k alice.key -i encrypted_fichier3.cpabe -o alice_decrypted_fichier3 -p exemple

ciphertext: encrypted_fichier3.cpabe
user’s SK file: alice.key

Là encore, Alice réussit à déchiffrer le fichier et voir son contenu. Ce dernier est identique à celui de « fichier3 ».

4.4.2 – Bob

« Bob » de son côté tente de déchiffrer les trois fichiers. D’après les politiques d’accès et sa liste d’attributs, il devrait pouvoir déchiffrer « fichier1 » et « fichier3 », mais pas « fichier2 ».

  • Fichier 1:
$ docker run -it --rm -w /root -v$(pwd):/root touatily/openabe oabe_dec -s CP -k bob.key -i encrypted_fichier1.cpabe -o bob_decrypted_fichier1 -p exemple 

ciphertext: encrypted_fichier1.cpabe
user’s SK file: bob.key

Ceci va créer un fichier qui s’appelle « bob_decrypted_fichier1 », dont le contenu est identique à celui de « fichier1 ».

  • Fichier 2:
$ docker run -it --rm -w /root -v$(pwd):/root touatily/openabe oabe_dec -s CP -k bob.key -i encrypted_fichier2.cpabe -o alice_decrypted_fichier2 -p exemple

ciphertext: encrypted_fichier2.cpabe
user’s SK file: bob.key
abe/zcontextcca.cpp:decrypt:613: ‘Error occurred during decryption’
caught exception: Error occurred during decryption

Aucun fichier ne sera généré. Ceci est dû au fait que « bob » n’est pas en 4ème année (il ne possède pas l’attribut « year=4 »).

  • Fichier 3:
$ docker run -it --rm -w /root -v$(pwd):/root touatily/openabe oabe_dec -s CP -k bob.key -i encrypted_fichier3.cpabe -o bob_decrypted_fichier3 -p exemple

ciphertext: encrypted_fichier3.cpabe
user’s SK file: bob.key

Un fichier « bob_decrypted_fichier3 » est généré.

4.4.3 – Récapitulatif

Alice n’a pas pu déchiffrer le fichier « bob_decrypted_fichier3 » car elle n’est pas en spécialité cyber-sécurité (Elle ne possède pas l’attribut « cybersecurite »).
Bob, quant à lui, il n’a pas réussit à déchiffrer le fichier « encrypted_fichier2.cpabe » car il est en 5ème année, et que le fichier est destiné aux étudiant de 4ème année.

Remarques :

Qu’on a chiffré le fichier 3, on a utilisé la condition « year >= 4″ pour préciser que le fichier est destiné à la fois aux étudiants de 4ème et 5ème année. On aurait pu exprimer cette condition de la manière suivante  » year in (4-5) » ou encore « (year == 4) OR (year == 5) ». Ces deux dernière syntaxes sont plus précises que celle utilisée.

La librairie OpenABE ne supporte pas les caractères accentués. C’est pour cela qu’on a utilisé l’attribut « cybersecurite » et non « cybersécurité ».

La librairie OpenABE implémente également les techniques cryptographiques KP-ABE et IBE qui ne sont pas présentées ici.

5 – Conclusion

Dans cet article, nous avons présenté une technique cryptographique très puissante qui est CP-ABE. Elle permet d’implémenter du contrôle d’accès basé sur des rôles. « openABE » est une implémentation de cette technique cryptographique. on a utilisé un image docker pour exécuter les différentes commandes d’initialisation, génération de clés, et chiffrement/déchiffrement de fichiers.