Chiffrement symétrique
Chiffrement par bloc
Un mécanisme de chiffrement par bloc est la combinaison d’une primitive de chiffrement par bloc et d’un mode opératoire de chiffrement. Il permet de chiffrer des données de taille quelconque en les traitant par blocs de taille fixe. Selon le contexte, le terme chiffrement par bloc peut désigner un mécanisme de chiffrement par bloc ou une primitive de chiffrement par bloc.
Primitive de chiffrement par bloc. Une primitive de chiffrement par bloc est une fonction inversible paramétrée par une clé secrète qui à un bloc de clair de bits associe un bloc de chiffré de bits. Les deux caractéristiques principales d’une primitive de chiffrement par bloc sont la taille effective de la clé ainsi que la taille des blocs traités (voir annexe A.1.1). Les règles et recommandations concernant la taille effective de la clé ont été présentées dans la section précédente.
Les primitives de chiffrement par bloc sont utilisées par des modes opératoires pour chiffrer des messages de taille quelconque ou pour calculer des codes d’authentification de message. La taille du bloc intervient dans l’estimation de la sécurité des mécanismes résultants de chiffrement ou d’authentification de message. La principale menace est la présence d’attaques exploitant le paradoxe des anniversaires, ayant une probabilité de succès non négligeable dès qu’un nombre de blocs de l’ordre de sont traités, où désigne la taille en bits du bloc (voir annexe A.1). Dans le cas de blocs de 64 bits, cette limite de sécurité correspond au traitement de quelques gigaoctets de données, ce qui peut être très rapidement atteint pour certaines applications. Utiliser des blocs de 128 bits permet de se prémunir contre de telles attaques dans la plupart des cas.
Les primitives de chiffrement par bloc AES-128, AES-192 et AES-256 sont conformes à la règle RègleTailleBlocSym.
Les primitives de chiffrement par bloc Triple-DES deux clés et Triple-DES trois clés ne respectent pas la règle RègleTailleBlocSym puisqu’elles opèrent sur une taille de bloc de 64 bits.
Le choix d’une primitive de chiffrement par bloc repose sur la prise en compte des règles et recommandations liées à la taille de la clé ainsi qu’à la taille du bloc. Au-delà de la simple considération de ces deux dimensions, il faut surtout prendre en compte la sécurité intrinsèque apportée par la primitive face à des attaques plus évoluées que la simple recherche exhaustive sur la clé (cryptanalyse linéaire, différentielle, etc.). Ces attaques ont pour but de retrouver la clé ou, plus modestement, de distinguer le chiffrement par bloc d’une permutation aléatoire. Pour ce faire, un attaquant peut par exemple observer des chiffrés de blocs de clair connus, ou plus généralement obtenir le chiffrement ou le déchiffrement de blocs de son choix.
Dans une attaque classique (respectivement quantique), on désigne par opération de calcul un équivalent de la complexité temporelle du chiffrement d’un bloc au moyen d’un circuit classique (respectivement quantique). On considère généralement qu’une attaque est qualifiée par :
- le nombre d’opérations de calcul hors-ligne ;1
- le nombre de paires de blocs clair/chiffré utilisées ;
- la quantité de mémoire ;
- dans le cas d’une attaque quantique, la profondeur du calcul. Cette quantité est définie comme le nombre maximal d’opérations de calcul séquentielles effectuées lors de l’attaque.
- Les règles et recommandations précédentes ne mentionnent ni ni . Ceci tient essentiellement à la volonté de ne pas trop compliquer leur énoncé.
- La règle RèglePrimChiffBloc ignore les attaques basées sur des stratégies de recherche exhaustive sur la clé complète.
- La primitive de chiffrement par bloc AES-128 est conforme aux règles RèglePrimChiffBloc, RèglePQPrimChiffBloc, mais elle ne respecte pas la recommandation RecoPQPrimChiffBloc.
- Les primitives de chiffrement par bloc AES-192 et AES-256 sont conformes aux règles RèglePrimChiffBloc et RèglePQPrimChiffBloc. Elles respectent de plus la recommandation RecoPQPrimChiffBloc.
La primitive de chiffrement par bloc Triple-DES trois clés est non conforme à la règle RèglePrimChiffBloc puisqu’elle est vulnérable à une attaque en opérations.
Modes opératoires de chiffrement. L’utilisation d’un mode opératoire de chiffrement permet d’assurer la confidentialité de messages de taille quelconque à partir d’une primitive de chiffrement par bloc. Comme expliqué dans l’annexe A.1.1.1, une simple primitive de chiffrement par bloc ne permet pas d’assurer une telle fonction, en particulier à cause de sa nature fondamentalement déterministe et de la taille imposée des blocs de données traités.
Le choix d’un mode opératoire de chiffrement est très dépendant de la nature des données traitées et du modèle de sécurité envisagé pour ce mécanisme. Les règles et recommandations se veulent malgré tout relativement génériques.
Dans le modèle de sécurité pertinent pour l’usage du mode opératoire de chiffrement, il ne doit exister aucune attaque de complexité inférieure à celle de la recherche exhaustive exploitant un nombre de blocs chiffrés sous une même clé significativement inférieur à appels de la primitive de chiffrement par bloc sous-jacente, où est la taille en bits du bloc.
- Il est recommandé d’employer un mode opératoire de chiffrement non déterministe.
- Il est recommandé d’employer un mode opératoire de chiffrement disposant d’une preuve de sécurité dans un modèle d’adversaire pertinent vis-à-vis du contexte d’utilisation.
- Il est recommandé de ne pas employer isolément un mode opératoire de chiffrement n’offrant pas d’intégrité.
- De nombreux modes, tels que le mode CBC (voir annexe A.1.1.1), ne sont sûrs que si l’on traite significativement moins de blocs de messages avec la même clé, où désigne la taille en bits du bloc.
- Pour garantir la confidentialité des informations, un mode opératoire de chiffrement ne doit pas être déterministe. Cela permet notamment d’éviter que le chiffrement d’un même message fournisse le même chiffré. L’emploi d’un vecteur d’initialisation (IV2) et d’un mode opératoire adapté permet de résoudre ce problème. Le guide de sélection d’algorithmes cryptographiques [3] fournit des exemples de tels modes opératoires.
- Le besoin de confidentialité est souvent associé à un besoin d’intégrité, même si ce dernier semble parfois moins évident à première vue. En particulier, aucun des modes opératoires de chiffrement classiques (CBC, OFB, CFB, CTR) n’apporte la moindre protection en intégrité (voir annexe A.1.2). Il existe essentiellement deux manières d’obtenir conjointement des propriétés de confidentialité et d’intégrité : soit par une combinaison de mécanismes de chiffrement et d’intégrité utilisés avec des clés différentes, soit par un mode opératoire de chiffrement authentifié paramétré par une seule clé.3
- Il existe des modes garantissant une sécurité même lorsque dépasse la limite de : ces modes sont dit beyond birthday-bound car ils sont sûrs malgré un dépassement de la borne du paradoxe des anniversaires ().
- Le mode opératoire de chiffrement CBC utilisant une primitive de chiffrement conforme au référentiel comme l’AES et des IV aléatoirement choisis pour chaque message et transmis en clair est un mécanisme de chiffrement par bloc conforme à la règle RègleModeChiff et aux recommandations RecoModeChiff.1 et RecoModeChiff.2. Ce mécanisme est rappelé en annexe A.1.1.1. Il est particulièrement important de garantir que les IV sont générés dans le périmètre de sécurité du chiffrement – par exemple dans le composant sécurisé où le mode opératoire de chiffrement et la primitive sous-jacente sont implémentés et non hors de ce composant – et avec un générateur d’aléa sûr. Ces IV ne doivent en aucun cas pouvoir être contrôlés ou prédits par un attaquant.
- Le mécanisme de chiffrement authentifié AES-GCM est conforme à la règle et aux recommandations précédentes. Il est particulièrement important de garantir qu’un même IV n’est jamais réutilisé sous une même clé.
Chiffrement par flot
Les mécanismes de chiffrement par flot4 constituent l’autre grande famille de mécanismes de chiffrement symétrique. Un mécanisme de chiffrement par flot associe à une clé et un IV une suite chiffrante de même longueur que la donnée en clair, additionnée bit par bit avec cette dernière pour produire le chiffré. Le modèle de sécurité généralement retenu pour l’évaluation d’un tel mécanisme est l’indistinguabilité pour l’attaquant des suites chiffrantes produites sous des IV choisis distincts de suites binaires parfaitement aléatoires indépendantes.
Il convient de différencier les mécanismes de chiffrement par flot « dédiés » conçus spécialement pour cet usage de certains mécanismes de chiffrement par bloc employant des modes opératoires de chiffrement produisant une suite chiffrante (CTR, OFB, etc.). Les règles et recommandations suivantes ne concernent que les mécanismes de chiffrement par flot dédiés.
Les chiffrés produits par un mécanisme de chiffrement par flot sont facilement malléables, en ce sens qu’inverser un bit de chiffré induit une inversion de bit correspondant du clair. Sans mécanisme d’intégrité complémentaire, cette malléabilité peut être exploitée par un attaquant pour modifier le clair de manière contrôlée.
Le mécanisme de chiffrement par flot Chacha20 est conforme aux règles RègleChiffFlot, RèglePQChiffFlot et à la recommandation RecoChiffFlot.1, mais son emploi est non conforme à la recommandation RecoChiffFlot.2 s’il n’est pas complété par l’utilisation d’un mécanisme d’intégrité.
-
Dans le cas où une attaque quantique fait à la fois appel à des calculs quantiques et classiques, on conviendra, afin de simplifier les raisonnements, qu’une opération de calcul classique et quantique contribuent de la même manière à . ↩
-
De l’anglais « Initialisation Vector ». ↩
-
On peut indifféremment parler de « chiffrement authentifié » ou de « chiffrement intègre ». ↩
-
« Stream cipher » en anglais. ↩