Archives Wild Code School
Cybersecurity

Le chiffrement symétrique

Quête 8 sur 13 · 1 image archivée

Introduction

La cryptographie moderne distingue 2 grandes familles de chiffrements : le chiffrement symétrique et le chiffrement asymétrique.

Cette quête s'attache à décrire le chiffrement symétrique, son fonctionnement, ses usages et ses implémentations.

spacer-small

Encryption écrit sur fond noir avec des caractères bleus

spacer-small

🤓 Objectifs :

✅ Comprendre le principe du chiffrement symétrique. ✅ Savoir pourquoi et comment l'utiliser avec pertinence. ✅ Découvrir les différents types de chiffrement symétrique et les modes opératoires. ✅ Utiliser openssl pour chiffrer des messages avec AES.

Sommaire


📚 Qu'est-ce que le chiffrement symétrique ?

Le chiffrement est un procédé qui consiste à construire, à partir d'un message en clair, un message chiffré.

Si le message en clair est compréhensible par quiconque parvient à la lire, le message chiffré lui est incompréhensible sauf pour qui possède une information secrète qu'on appelle clé.

↗
Cryptographie

La consultation de cette page WikipediA sur la cryptographie permet d'en apprendre plus sur le sujet et notamment de préciser les termes consacrés et leur définition.

fr.wikipedia.org

Dans la cryptographie moderne pour laquelle ce sont des ordinateurs qui réalisent les opérations, un message est en général une séquence binaire quelconque. Il peut s'agir d'un fichier, d'un paquet transmis sur un réseau, ou au final de n'importe quel type d'information informatiquement manipulable.

Les messages chiffrés, peuvent donc être stockés ou transmis sur n'importe quel support (y compris sur des supports susceptibles d'être espionnés ou volés) sans danger à condition que la clé soit bien secrète, c'est à dire connue uniquement par les personnes autorisées à lire le message. En ce sens, les chiffrements permettent la confidentialité qui est un des objectifs classiques qu'on cherche à atteindre en cybersécurité.

Un mécanisme de chiffrement se compose principalement de 2 opérations :

  • Une opération (ou fonction) de chiffrement pour fabriquer le message chiffré à partir du clair.
  • Une opération de déchiffrement qui elle permet de récupérer le message clair d'origine à partir du message chiffré correspondant.

Dans un chiffrement symétrique, la même clé est nécessaire pour les 2 opérations, c'est à dire à la fois pour chiffrer et pour déchiffrer.

Le schéma suivant résume le mécanisme du chiffrement symétrique et de ses deux opérations qui fonctionnent avec la même clé.

Clé
Message en clair
Chiffrement
Message chiffré
Clé
Message chiffré
Déchiffrement
Message déchiffré

Il existe aujourd'hui de nombreux algorithmes symétriques pour chiffrer et déchiffrer. Pour ces algorithmes, une clé est une séquence binaire quelconque.

Cette clé est d'ailleurs la seule information qui nécessite d'être secrète (avec bien sûr les messages en clair).

Le consensus en cryptographie est aujourd'hui que la meilleure stratégie pour obtenir de bons systèmes de chiffrement est de s'appuyer sur des algorithmes publiques à clé secrète. Ainsi toute la communauté des cryptographes peut étudier et éprouver la robustesse de ces algorithmes et ceux pour lesquels personne n'a encore publié de failles sont donc considérés comme sûrs, en tout cas jusqu'au moment ou quelqu'un en trouve une !

↗
Principe de Kerckhoffs

Tu peux consulter la page WikipediA consacrée au principe de Kerckhoffs pour plus d'information sur l'idée d'algorithmes cryptographique public à clé secrète.

fr.wikipedia.org

Pour mettre en place un mécanisme de chiffrement symétrique, il n'y a donc aucun besoin de concevoir un nouvel algorithme à chaque fois, mais plutôt d'en choisir un ayant fait ses preuves et de fabriquer une nouvelle clé secrète.


📚 Robustesse et taille de clé

Un algorithme de chiffrement symétrique bien choisi permet d'avoir une confiance forte dans la robustesse de l'algorithme, c'est à dire qu'il est improbable qu'il existe une faille dans l'algorithme lui-même et qu'au pire une faille nouvelle et donc inconnue jusqu'alors, ne pourrait être découverte et exploitée que par des attaquants de très haut niveau de compétence.

Ça ne signifie pas pour autant qu'il n'existe aucune stratégie d'attaque sur un système de chiffrement symétrique.

Même si l'algorithme est sûr, l'implémentation de l'algorithme peut elle comporter des bogues dont certains peuvent être des failles de sécurité.

Pour palier ce problème, l'approche la plus courante est :

  1. Ne pas implémenter soi-même les algorithmes cryptographiques et s'appuyer plutôt sur des implémentations réputées, réalisées par des équipes de spécialistes du domaine.
  2. Suivre attentivement et mettre à jour ces outils pour éliminer au plus vite les vulnérabilités découvertes et publiées. Et si un outil venait à ne plus être maintenu, en changer rapidement.

Il reste néanmoins le point essentiel : le secret de la clé. Et ce secret repose sur :

  1. La génération d'une clé impossible (en pratique) à deviner pour qui n'en dispose pas.
  2. Un stockage robuste ne permettant pas sa récupération.

Pour les algorithmes symétriques, une clé est une séquence binaire quelconque.

Si la clé est choisie par l'utilisateur, on s'expose aux attaques par dictionnaire. Stratégie d'attaque classique sur les mots de passe (qui sont en général choisis), cette méthode d'attaque consiste à faire une étude statistique des choix les plus courants et à essayer ces choix par ordre de probabilité d'apparition descendant. C'est une stratégie très efficace sur les mots de passe. Il n'est d'ailleurs pas nécessaire de faire l'analyse statistique soi-même, ces dictionnaires de mots de passe fréquents existent et sont récupérables en ligne. Donc, pour les algorithmes de chiffrement, on ne choisi jamais sa clé ! Reste donc le tirage au sort. La génération aléatoire de clé est la stratégie recommandée pour créer des clés.

Attention

La génération d'aléatoire en informatique est un problème difficile en soi. Ceux qui souhaitent creuser cette question peuvent commencer par lire la page WikipediA sur les générateurs pseudo-aléatoires en suivant ce lien : Générateur de nombres pseudo-aléatoires.

Pour générer aléatoirement ses clés, l'approche recommandée consiste, là aussi, à utiliser une générateur aléatoire ayant fait ses preuves dans un contexte cryptographique qu'on qualifie de générateur pseudo aléatoire de qualité cryptographique ou CSPRNG/CPRNG/CRNG.

Il reste toujours la possibilité d'une attaque par force brute qui consiste à essayer toutes les clés possibles. Pour s'en prémunir, l'idée est d'avoir un nombre de possibilités de clés tellement grand qu'il est en pratique impossible, car beaucoup trop long, d'essayer. Si l'essai exhaustif de l'ensemble des clés possibles prend des centaines de milliers d'années à un attaquant disposant d'une puissance de calcul colossale, on considère en général que c'est suffisamment dissuasif :smiley:.

Néanmoins, comme au final, un attaquant vraiment motivé finira par découvrir la clé si on lui laisse suffisamment de temps, il est recommandé de changer de clé régulièrement pour qu'au pire, il ne puisse déchiffrer que de vieux messages.

Les clés des algorithmes symétriques étant des séquences binaires quelconque, ce nombre de possibilités est directement proportionnel à leur taille. La recommandation actuelle classique est d'utiliser des clés de 128 bits, soit un nombre de clés possibles (et équiprobables si on utilise un bon générateur aléatoire) de $2^{128}$ soit $3,402823669.10^{38}$ possibilités. Dans les cas de modèle de menace particulier ou pour des clés utilisées longtemps, il est possible de basculer sur des clés de 256 bits.

Info

Attention néanmoins, si des clés plus grandes sont effectivement plus sécurisées, elles rendent aussi les opérations de chiffrement et de déchiffrement plus coûteuses. Ce n'est donc pas forcément la meilleure solution de prendre la plus grande taille de clé disponible.


🔬 Scénarios d'utilisation de la cryptographie symétrique

Étudions maintenant deux cas d'usages de ces algorithmes de chiffrement symétrique.

La confidentialité des fichiers

Supposons dans un premier temps que l'objectif qu'on se fixe est de garantir la confidentialité d'informations sensibles stockées sur un support de stockage (clé usb, disque, etc.) y compris dans le cas où la lecture des informations sur ce support est rendue possible à un attaquant. Par exemple parce que le support de stockage (ou l'ordinateur ou il se trouve) a été volé ou parce que le système d'exploitation qui est censé contrôler l'accès à ces information a été compromis.

Ces informations prennent la forme de fichiers.

Pour assurer leur confidentialité, il convient donc de chiffrer avec un algorithme symétrique les fichiers avant de les stocker sur le support, et de les déchiffrer à la volée à chaque fois qu'on souhaite y accéder.

La clé nécessaire à ces 2 opérations est à construire à la mise en place du système est à conserver précieusement dans un endroit sûr. Il est relativement simple d'assurer le secret de cette clé puisqu'une seule personne a besoin la connaître.

Ce type de fonctionnement est très couramment utilisé soit pour chiffrer des supports de stockage complet, comme c'est le cas avec LUKS, Bitlocker ou VeraCrypt, soit pour chiffrer des fichiers en particuliers comme des archives (par exemple : 7-zip) ou des bases de mots de passe (par exemple KeePass).

Info

Parce que les clés cryptographiques sont longues et aléatoires, il n'est pas envisageable de considéré qu'elle soit mémorisées par les utilisateurs. Elles prennent donc en général la forme de fichiers qu'il faut stocker sur un support adapté. Dans l'éventualité où aucune stratégie de stockage de clé n'est pertinente, il arrive qu'on veuille remplacer la clé par un mot ou une phrase de passe (qui elle est mémorisée par l'utilisateur). Pour obtenir une clé cryptographique à partir d'un mot ou d'une phrase de passe, on utilise des fonctions de dérivation de clé. Évidemment, dans ces cas là, il convient de choisir un mot ou mieux une phrase de passe robuste c'est à dire longue, absente des dictionnaires et le plus difficile possible à prévoir.

Confidentialité des communications

Supposons maintenant qu'on souhaite garantir la confidentialité d'information envoyées sur un réseau. Ce réseau est non sûr dans la plupart des cas, c'est à dire que nous n'avons aucune garantie qu'il n'y a pas d'écoute clandestine (en anglais, on parle d'eavesdropping) du canal de communication.

Si Alice souhaite envoyer un message à Bob, elle doit donc générer une clé et chiffrer le message avant de l'envoyer. Bob doit disposer de cette clé pour pouvoir déchiffrer le message.

Évidemment, Alice ne peut pas envoyer la clé à Bob en utilisant le réseau car l'hypothèse de départ est justement que ce réseau n'est pas sûr et si la clé est compromise (c'est à dire connue par une autre personne) la sécurité de l'algorithme n'est plus assurée.

Ce problème de partage de clé est l'un des principaux problèmes de mise en place de la cryptographie symétrique. Soit Alice et Bob dispose d'un canal de communication sûr pour se transmettre la clé, par exemple en se l'échangeant de la main à la main dans ce cas, la communication devient possible. Soit ce n'est pas le cas est il faut trouver une autre astuce pour réussir à se passer une clé secrète sur un canal non sûr.

Pour répondre à Alice, Bob peut utiliser cette même clé qu'il partage avec Alice pour chiffrer ses messages.

Si maintenant Cheikh souhaite lui aussi communiquer avec Alice, et avec Bob. Il semble préférable d'avoir une clé par paire d'interlocuteurs. En effet, les messages que Cheikh envoie à Alice devraient pouvoir être lus par Alice uniquement et pas par Bob et vice versa.

Ainsi, dans le cas de communications avec un grands nombres d'interlocuteurs, la cryptographie symétrique impose la gestion par chaque interlocuteur d'un grand nombre de clés.

Bravo

La cryptographie symétrique peut ainsi être utilisée pour assurer la confidentialité d'informations stockées ou de messages en transit. Elle est même particulièrement indiquée en raison de son efficacité.

En effet, au delà d'assurer un niveau de sécurité très élevé, les mécanismes de cryptographie symétrique ont un autre point fort : ils sont très rapides. Il est donc parfaitement envisageable (et réalisé dans la pratique) de chiffrer de gros volumes de données à la volée avec un faible surcoût lié au opérations de chiffrement et de déchiffrement.


📚 Messages, bloc, flux et modes opératoires

Comme vu précédemment, les algorithmes de chiffrement symétrique acceptent en entrée, en guise de message en clair, des séquences binaires quelconques.

Pour pouvoir traiter des messages de n'importe quelle taille, il existe 2 méthodes différentes créant ainsi 2 familles d'algorithmes : Les chiffrements par bloc et les chiffrements de flux.

Chiffrement par bloc

La plupart des algorithmes de chiffrement symétrique sont en fait uniquement capable de traiter des blocs binaires de taille fixe. Cette taille de bloc est un paramètre de l'algorithme qui impose une taille de bloc ou permet un choix parmi des tailles de bloc possibles. Aujourd'hui, cette taille est en général comprise entre 128 et 256 bits.

Pour que le message puisse être traité (chiffré ou déchiffré), il faut donc le découper en blocs de taille donnée puis traiter chaque bloc. Dans l'éventualité ou la taille du message ne serait pas un multiple exact de la taille des blocs, on ajoute du bourrage (padding en anglais) pour avoir un nombre de blocs entier.

↗
Remplissage

La question du bourrage n'est pas une question aussi simple qu'il y paraît. Cet page WikipediA est une porte d'entrée pour découvrir de quoi il s'agit et quels sont les enjeux.

fr.wikipedia.org

Une fois le message découpé en bloc, on pourrait chiffrer chaque bloc du message en clair avec la clé, puis concaténer les blocs chiffrés pour obtenir le message chiffré... Cette méthode, appelée ECB pour Electronic Code Book, n'est pas recommandée. En effet, elle est susceptible de faire apparaître des récurrences dans le message chiffré qui donnent des informations sur le message en clair : Des blocs identiques dans le clair correspondent toujours à des blocs identiques dans le message chiffré. C'est contraire à l'objectif de diffusion recommandé par Claude Shannon.

↗
Confusion et diffusion

Découvre les notions de confusion et de diffusion décrites par Claude Shannon dans cet article.

fr.wikipedia.org

Il existe donc d'autres modes opératoires permettant d'assurer une meilleure diffusion tels que :

  • CBC pour Cipher Block Chaining
  • CFB pour Cipher Feedback Block
  • CTR (de counter) : mode opératoire basé sur un compteur
  • OFB pour Output Feedback
  • CTS pour CipherText Stealing
  • ...

Dans l'ensemble, ces différents modes opératoires consistent à ne pas faire dépendre le chiffrement d'un bloc uniquement du bloc correspondant dans le message clair et de la clé, mais de rajouter d'autres informations permettant de ne pas avoir toujours le même bloc chiffré pour un bloc clair donné.

↗
Modes d'opérations

Cette page WikipediA permet d'en apprendre plus sur les différents modes opératoires.

fr.wikipedia.org

Ces modes opératoires impliquent le besoin d'un vecteur d'initialisation (en général abrégé IV pour Initialization Vector) en entrée de l'algorithme en plus de la clé et du message clair. C'est ce vecteur qui permet d'obtenir des messages chiffrés différents, même si on venait à chiffrer le même message clair avec la même clé. Un vecteur d'initialisation n'a pas besoin d'être secret, mais il doit être aléatoire. Le vecteur d'initialisation utilisé pour chiffrer un message est nécessaire pour pouvoir déchiffrer. Comme il n'est pas secret, il peut être envoyé (ou stocké) en même temps que le message chiffré. En revanche, il doit être imprévisible et donc généré aléatoirement au moment du chiffrement, avec génération d'un nouveau vecteur d'initialisation pour chaque nouveau message.

Le vecteur d'initialisation a une taille donnée, imposée là aussi par l'algorithme (souvent la taille d'un bloc).

↗
Chiffrement par bloc (WikipediA)

Pour plus d'information sur le chiffrement par bloc.

fr.wikipedia.org

Chiffrement de flux

Le chiffrement de flux (Stream cipher en anglais) est quand à lui conçu pour traiter à la volée une entrée de taille quelconque.

Il repose en général sur un générateur pseudo aléatoire (CSPRNG) initialisé par une clé et une opération binaire (par exemple XOR) combinant chaque bit du flux d'entrée en clair avec un bit du flux du générateur pseudo aléatoire.

↗
Chiffrement de flux

Creuse la question du chiffrement de flux en commençant par la page WikipediA qui lui est consacrée.

fr.wikipedia.org

📚 Exemples et recommandations

Il existe de nombreux algorithmes de chiffrement symétrique. Le plus courant et certainement le plus largement utilisé est AES qui est un chiffrement par bloc et donc se décline en différents modes opératoires. AES est aujourd'hui une recommandation classique à la fois pour des considérations de sécurité mais aussi pour des questions de performances. À noter que des instructions spécifiques permettant d’accélérer encore AES sont disponibles sur de nombreux processeurs actuels (voir : Jeu d'instructions AES)

D'autres chiffrements par bloc moins courants sont aussi utilisables, comme :

Les chiffrements par flux sont un peu moins courant, le plus fréquent est sans doute Chacha20.

Certains algorithmes encore disponibles (souvent pour des questions de compatibilité) sont aujourd'hui considéré comme obsolètes et pour obtenir un niveau de sécurité raisonnable, il ne faut pas les utiliser. Par exemple :

  • DES (chiffrement par bloc)
  • RC4 (chiffrement de flux)

On peut aussi citer le cas particulier du 3DES qui, s'il n'est pas clairement obsolète comme les 2 précédents est probablement en passe de le devenir, parce qu'il ne permet pas d'avoir plus de 112 bits de sécurité et qu'il est fondé sur DES sur lequel des attaques permettant de réduire la taille de la recherche exhastive.

↗
Mécanismes cryptographiques

L'ANSSI (Agence Nationale de la Sécurité des Systèmes d'Information) publie des recommandations sur l'usage de la cryptographie et notamment un guide de sélection d'algorithmes cryptographiques et des Règles et recommandations concernant le choix et le dimensionnement de mécanismes cryptographiques qui sont consultables sur le site de l'agence en suivant ce lien.

ssi.gouv.fr

⚙️ Chiffrer avec openssl

L'objectif de cette mise en pratique est de chiffrer un message avec un algorithme symétrique, puis de déchiffrer le message chiffré obtenu en utilisant openssl.

Openssl est un logiciel libre qui fournit une interface de programmation (API) ainsi qu'un outil en ligne de commande permettant de réaliser l'essentiel des opérations cryptographiques classiques à l'aide d'une large sélection d'algorithmes. Il est couramment recommandé et utilisé dans de très nombreux logiciels.

Il est en général installé par défaut sur la plupart des distribution Linux et peut être installé sur un grand nombre de plateforme (Windows, Android, etc...)

L'exercice qui suit a été réalisé sur une distribution ubuntu 22.04.

Choix de l'algorithme

Il est possible de récupérer la liste des cryptosystèmes symétriques supportés par openssl avec la commande suivante :

sh
wilder@host:~$ openssl enc -list
Supported ciphers:
-aes-128-cbc               -aes-128-cfb               -aes-128-cfb1             
-aes-128-cfb8              -aes-128-ctr               -aes-128-ecb              
-aes-128-ofb               -aes-192-cbc               -aes-192-cfb              
-aes-192-cfb1              -aes-192-cfb8              -aes-192-ctr              
-aes-192-ecb               -aes-192-ofb               -aes-256-cbc              
-aes-256-cfb               -aes-256-cfb1              -aes-256-cfb8             
-aes-256-ctr               -aes-256-ecb               -aes-256-ofb              
-aes128                    -aes128-wrap               -aes192                   
-aes192-wrap               -aes256                    -aes256-wrap              
-aria-128-cbc              -aria-128-cfb              -aria-128-cfb1            
-aria-128-cfb8             -aria-128-ctr              -aria-128-ecb             
-aria-128-ofb              -aria-192-cbc              -aria-192-cfb             
-aria-192-cfb1             -aria-192-cfb8             -aria-192-ctr             
-aria-192-ecb              -aria-192-ofb              -aria-256-cbc             
-aria-256-cfb              -aria-256-cfb1             -aria-256-cfb8            
-aria-256-ctr              -aria-256-ecb              -aria-256-ofb             
-aria128                   -aria192                   -aria256                  
-bf                        -bf-cbc                    -bf-cfb                   
-bf-ecb                    -bf-ofb                    -blowfish                 
-camellia-128-cbc          -camellia-128-cfb          -camellia-128-cfb1        
-camellia-128-cfb8         -camellia-128-ctr          -camellia-128-ecb         
-camellia-128-ofb          -camellia-192-cbc          -camellia-192-cfb         
-camellia-192-cfb1         -camellia-192-cfb8         -camellia-192-ctr         
-camellia-192-ecb          -camellia-192-ofb          -camellia-256-cbc         
-camellia-256-cfb          -camellia-256-cfb1         -camellia-256-cfb8        
-camellia-256-ctr          -camellia-256-ecb          -camellia-256-ofb         
-camellia128               -camellia192               -camellia256              
-cast                      -cast-cbc                  -cast5-cbc                
-cast5-cfb                 -cast5-ecb                 -cast5-ofb                
-chacha20                  -des                       -des-cbc                  
-des-cfb                   -des-cfb1                  -des-cfb8                 
-des-ecb                   -des-ede                   -des-ede-cbc              
-des-ede-cfb               -des-ede-ecb               -des-ede-ofb              
-des-ede3                  -des-ede3-cbc              -des-ede3-cfb             
-des-ede3-cfb1             -des-ede3-cfb8             -des-ede3-ecb             
-des-ede3-ofb              -des-ofb                   -des3                     
-des3-wrap                 -desx                      -desx-cbc                 
-id-aes128-wrap            -id-aes128-wrap-pad        -id-aes192-wrap           
-id-aes192-wrap-pad        -id-aes256-wrap            -id-aes256-wrap-pad       
-id-smime-alg-CMS3DESwrap  -rc2                       -rc2-128                  
-rc2-40                    -rc2-40-cbc                -rc2-64                   
-rc2-64-cbc                -rc2-cbc                   -rc2-cfb                  
-rc2-ecb                   -rc2-ofb                   -rc4                      
-rc4-40                    -seed                      -seed-cbc                 
-seed-cfb                  -seed-ecb                  -seed-ofb                 
-sm4                       -sm4-cbc                   -sm4-cfb                  
-sm4-ctr                   -sm4-ecb                   -sm4-ofb                  

Tu peux constater la présence d'algorithmes recommandés comme AES avec différentes taille de clé et différents modes opératoires, mais aussi, pour raison de compatibilité, d'algorithmes obsolètes comme DES ou RC4.

Pour la suite, on utilise aes-128-cbc soit : l'algorithme AES avec une clé de 128 bits et le mode opératoire CBC.

Examine maintenant la syntaxe de la commande pour chiffrer et déchiffrer :

sh
wilder@host:~$ openssl enc -h
Usage: enc [options]

General options:
 -help               Display this summary
 -list               List ciphers
 -ciphers            Alias for -list
 -e                  Encrypt
 -d                  Decrypt
 -p                  Print the iv/key
 -P                  Print the iv/key and exit
 -engine val         Use engine, possibly a hardware device

Input options:
 -in infile          Input file
 -k val              Passphrase
 -kfile infile       Read passphrase from file

Output options:
 -out outfile        Output file
 -pass val           Passphrase source
 -v                  Verbose output
 -a                  Base64 encode/decode, depending on encryption flag
 -base64             Same as option -a
 -A                  Used with -[base64|a] to specify base64 buffer as a single line

Encryption options:
 -nopad              Disable standard block padding
 -salt               Use salt in the KDF (default)
 -nosalt             Do not use salt in the KDF
 -debug              Print debug info
 -bufsize val        Buffer size
 -K val              Raw key, in hex
 -S val              Salt, in hex
 -iv val             IV in hex
 -md val             Use specified digest to create a key from the passphrase
 -iter +int          Specify the iteration count and force use of PBKDF2
 -pbkdf2             Use password-based key derivation function 2
 -none               Don't encrypt
 -*                  Any supported cipher

Random state options:
 -rand val           Load the given file(s) into the random number generator
 -writerand outfile  Write random data to the specified file

Provider options:
 -provider-path val  Provider load path (must be before 'provider' argument if required)
 -provider val       Provider to load (can be specified multiple times)
 -propquery val      Property query used when fetching algorithms

On utilise donc :

  • les options -e ou -d pour chiffrer ou déchiffrer.
  • -aes-128-cbc pour préciser l'algorithme à utiliser
  • -in et -out pour préciser les fichiers à chiffrer/déchiffrer et l'emplacement où stocker le résultat de l'opération
  • -K permet de préciser la clé qu'on souhaite. Il est possible de l'indiquer en hexadécimal.
  • iv permet de préciser le vecteur d'initialisation en hexadécimal
Info

Tu as sans doute noté que l'option -k permet d'entrer une passphrase. En effet, openssl permet de ne pas utiliser une clé directement mais plutôt une passphrase qu'il utilise pour construire une clé et un vecteur d'initialisation à l'aide d'une fonction de dérivation de clé. Il n'est donc pas nécessaire avec l'option -k d'avoir les options -K et -iv. Le résultat de cette fonction de dérivation de clé est rendu unique même si on utilise la même passphrase par l'utilisation d'un sel. Ce sel est ajouté en prefixe dans le message chiffré.

Seule la passphrase est alors nécessaire pour déchiffrer.

Générer la clé

Avant de chiffrer un message tu as besoin d'une clé de 128 bits.

Openssl est en mesure de générer correctement cette clé avec la commande openssl rand.

Commence par jeter un coup d’œil à l'aide proposée pour cette commande :

sh
wilder@host:~$ openssl rand -help
Usage: rand [options] num

General options:
 -help               Display this summary
 -engine val         Use engine, possibly a hardware device

Output options:
 -out outfile        Output file
 -base64             Base64 encode output
 -hex                Hex encode output

Random state options:
 -rand val           Load the given file(s) into the random number generator
 -writerand outfile  Write random data to the specified file

Provider options:
 -provider-path val  Provider load path (must be before 'provider' argument if required)
 -provider val       Provider to load (can be specified multiple times)
 -propquery val      Property query used when fetching algorithms

Parameters:
 num                 Number of bytes to generate

Le seul paramètre obligatoire est le nombre d'octets a générer.

Essaye (rappel : 128 bits = 16 octets) :

sh
wilder@host:~$ openssl rand 16
���R�W8АW�����wilder@host:~$

Premier constat : l'affichage de séquences binaires dans le terminal n'est pas des plus pratiques :smiley:

En fouillant un peu dans les options, tu peux voir qu'il est possible de :

  • Stocker directement le résultat dans un fichier : -out
  • Encoder la clé en base64 base64 ou en hexadécimal -hex ce qui peut rendre la clé plus facile à manipuler dans des flux de texte

Crée une clé encodée en hexadécimal et stocke la dans un fichier avec la commande suivante :

sh
wilder@host:~$ openssl rand -hex -out keyfile 16

Pour pouvoir chiffrer un message en aes-128-cbc, un vecteur d'initialisation aléatoire, de 128 bits lui aussi, est nécessaire. Contrairement à la clé qui peut être utilisée pour chiffrer un ensemble de messages, un nouveau vecteur d'initialisation doit être généré pour chaque nouveau message. Il est nécessaire de le connaître pour déchiffrer.

Chiffrer un message

Il ne te reste plus qu'a chiffrer ton message.

sh
wilder@host:~$ openssl enc -e -aes-128-cbc -in message.txt -out encrypted -K $(cat keyfile) -iv $(cat iv)

Le fichier encrypted contient maintenant ton message chiffré.

Déchiffrer un message

Pour déchiffrer le message, tu as besoin de la clé, du vecteur d'initialisation qui a été utilisée pour chiffrer ce message en particulier, et bien sûr, du message chiffré.

sh
wilder@host:~$ openssl enc -d -aes-128-cbc -in encrypted -out decrypted.txt -K $(cat keyfile) -iv $(cat iv)

Te voilà fin prêt pour échanger des messages confidentiels et protéger tes données sensibles en utilisant les capacités de cryptographie symétrique d'openssl.


☝️ Résumé

La cryptographie symétrique permet de chiffrer et déchiffrer des messages quelconque de manière fiable, sécurisée et rapide.

Elle repose sur un clé cryptographique aléatoires secrète qui sert à la fois à chiffrer et à déchiffrer.


📝 Quiz

quiz
true|||true||||false
# Que signifie symétrique en cryptographie ?
[] C'est la même fonction pour chiffrer et déchiffrer.
[x] C'est la même clé qui sert à chiffrer et à déchiffrer.
[] Il est possible de fabriquer le message en clair à partir du message chiffré et vice versa.
# Quelles sont les caractéristiques d'une bonne clé cryptographique ?
[x] Aléatoire
[] Facile à mémoriser
[] Courte
[x] Suit un format permettant de nombreuses combinaisons
# AES est
[x] Un algorithme de cryptographie symétrique
[] Obsolète
[x] Recommandé
[] Lent
[x] Un chiffrement par bloc
# Parmi ces mécanismes, lesquels sont à éviter :
[x] DES
[] Mode opératoire CBC
[x] RC4
[x] Mode opératoire ECB
[] Twofish
# Quelle taille de clé est recommandée ?
[] 64 bits
[x] 128 bits
[x] 256 bits
[x] 16 octets
[] 16 bits 

💪Challenge

Télécharge ce fichier chiffré. Il a été chiffré avec aes-128-cbc en utilisant :

  • Cette clé (en hexa) : 31326b9c060d1c2850b3d24250bb62c9
  • Ce vecteur d'initialisation : d377a0a2f140dc334c6394ba52edc5e4

Déchiffre le et copie le message en clair obtenu dans la réponse.

🧐 Critères d'acceptation

Le contenu du message déchiffré est correcte.