En cryptographie, un mode de fonctionnement de chiffrement par bloc est un algorithme qui utilise un chiffrement par bloc pour assurer la sécurité des informations telles que la confidentialité ou l'authenticité.

Un chiffrement par bloc en lui-même ne convient que pour la transformation cryptographique sécurisée (chiffrement ou déchiffrement) d'un groupe de bits de longueur fixe appelé bloc. Un mode d'opération décrit comment appliquer de manière répétée l'opération monobloc d'un chiffrement pour transformer en toute sécurité des quantités de données supérieures à un bloc.

La plupart des modes nécessitent une séquence binaire unique, souvent appelée vecteur d'initialisation (IV), pour chaque opération de chiffrement. L'IV doit être non répétitif et, pour certains modes, aléatoire également. Le vecteur d'initialisation est utilisé pour garantir que des textes chiffrés distincts sont produits même lorsque le même texte en clair est chiffré plusieurs fois indépendamment avec la même clé..

Les chiffrements par blocs peuvent être capables de fonctionner sur plus d'une taille de bloc, mais pendant la transformation, la taille du bloc est toujours fixe. Les modes de chiffrement par bloc fonctionnent sur des blocs entiers et nécessitent que la dernière partie des données soit remplie pour former un bloc complet s'il est inférieur à la taille de bloc actuelle. Il existe cependant des modes qui ne nécessitent pas de remplissage car ils utilisent efficacement un chiffrement par bloc comme chiffrement de flux.

Historiquement, les modes de chiffrement ont été largement étudiés en ce qui concerne leurs propriétés de propagation des erreurs dans divers scénarios de modification des données. Le développement ultérieur a considéré la protection de l'intégrité comme un objectif cryptographique entièrement distinct. Certains modes de fonctionnement modernes combinent la confidentialité et l' authenticité de manière efficace, et sont connus sous le nom de modes de chiffrement authentifié.

Histoire et normalisation

Les premiers modes de fonctionnement, ECB, CBC, OFB et CFB (voir ci-dessous pour tous), remontent à 1981 et ont été spécifiés dans FIPS 81, Modes d'opération DES.

En 2001, le National Institute of Standards and Technology (NIST) a révisé sa liste de modes de fonctionnement approuvés en incluant AES comme chiffrement par bloc et en ajoutant le mode CTR dans SP800-38A, Recommendation for Block Cipher Modes of Operation.

Enfin, en , le NIST a ajouté XTS-AES dans SP800-38E, Recommendation for Block Cipher Modes of Operation: The XTS-AES Mode for Confidentiality on Storage Devices.

Il existe d'autres modes de confidentialité qui n'ont pas été approuvés par le NIST. Par exemple, CTS est un mode de vol de texte chiffré et disponible dans de nombreuses bibliothèques cryptographiques populaires.

Les modes de chiffrement par bloc ECB, CBC, OFB, CFB, CTR et XTS assurent la confidentialité, mais ils ne protègent pas contre les modifications accidentelles ou les falsifications malveillantes. La modification ou la falsification peut être détectée à l'aide d'un code MAC (Message Authentication Code en anglais, ou, code d'authentification de message) distinct, tel que CBC-MAC, ou d'une signature numérique.

La communauté cryptographique a reconnu la nécessité de garanties d'intégrité dédiées et le NIST a répondu avec HMAC, CMAC et GMAC. HMAC a été approuvé en 2002 en tant que FIPS 198, Le Keyed-Hash Message Authentication Code (HMAC), CMAC a été publié en 2005 sous SP800-38B, Recommendation for Block Cipher Modes of Operation: The CMAC Mode for Authentication, et GMAC a été formalisé en 2007 sous SP800-38D, Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC.

La communauté cryptographique a observé que la composition (combinaison) d'un mode de confidentialité avec un mode d'authenticité pouvait être difficile et sujette aux erreurs. Ils ont donc commencé à fournir des modes qui combinaient confidentialité et intégrité des données en une seule primitive cryptographique (un algorithme de chiffrement). Ces modes combinés sont appelés chiffrement authentifié, AE ou « authenc ». Des exemples de modes AE sont CCM (SP800-38C), GCM (SP800-38D), CWC, EAX, IAPM, et OCB.

Les modes de fonctionnement sont définis par un certain nombre d'organismes de normalisation nationaux et internationaux reconnus. Les organismes de normalisation notables comprennent le NIST, l'ISO (avec ISO/IEC 10116), l'IEC, l'IEEE, l'ANSI et l'IETF.

Vecteur d'initialisation (IV)

Un vecteur d'initialisation (IV), ou variable de départ (SV), est un bloc de bits utilisé par plusieurs modes pour randomiser le chiffrement et donc pour produire des textes chiffrés distincts même si le même texte en clair est chiffré plusieurs fois, sans avoir besoin d'un processus de ressaisie plus lent.

Un vecteur d'initialisation a des exigences de sécurité différentes de celles d'une clé, de sorte que l'IV n'a généralement pas besoin d'être secret. Pour la plupart des modes de chiffrement par bloc, il est important qu'un vecteur d'initialisation ne soit jamais réutilisé sous la même clé, c'est-à-dire qu'il doit s'agir d'un nonce cryptographique. De nombreux modes de chiffrement par blocs ont des exigences plus fortes, telles que le IV doit être aléatoire ou pseudo-aléatoire. Certains chiffrements par blocs ont des problèmes particuliers avec certains vecteurs d'initialisation, tels que tous les IV zéro ne générant aucun chiffrement (pour certaines clés).

Il est recommandé d'examiner les exigences IV pertinentes pour le mode de chiffrement par bloc particulier dans les spécifications pertinentes, par exemple SP800-38A.

Pour CBC et CFB, la réutilisation d'un IV divulgue certaines informations sur le premier bloc de texte en clair et sur tout préfixe commun partagé par les deux messages.

Pour OFB et CTR, la réutilisation d'un IV entraîne la réutilisation du flux binaire clé, ce qui brise la sécurité. Cela peut être vu parce que les deux modes créent effectivement un flux binaire XORé avec le texte en clair, et ce flux de bits dépend uniquement de la clé et de l'IV.

En mode CBC, l'IV doit être imprévisible (aléatoire ou pseudo-aléatoire) au moment du chiffrement; en particulier, la pratique (auparavant) courante consistant à réutiliser le dernier bloc de texte chiffré d'un message en tant que IV pour le message suivant n'est pas sécurisée (par exemple, cette méthode a été utilisée par SSL 2.0). Si un attaquant connaît le IV (ou le bloc précédent de texte chiffré) avant que le texte en clair suivant ne soit spécifié, il peut vérifier sa supposition sur le texte en clair d'un bloc qui a été chiffré avec la même clé auparavant (c'est ce qu'on appelle l'attaque TLS CBC IV).

Pour certaines clés, un vecteur d'initialisation tout zéro peut générer des modes de chiffrement par bloc (CFB-8, OFB-8) pour bloquer l'état interne à zéro. Pour CFB-8, un IV tout zéro et un texte clair tout nul, provoque 1/256 des clés pour ne générer aucun chiffrage, le texte en clair est renvoyé sous forme de texte chiffré. Pour OFB-8, l'utilisation de tous les vecteurs d'initialisation zéro ne générera aucun chiffrement pour 1/256 des clés. Le chiffrement OFB-8 renvoie le texte brut non chiffré pour les clés affectées.

Certains modes (tels que AES-SIV et AES-GCM-SIV) sont conçus pour être plus résistants à l'utilisation abusive, c'est-à-dire résilients aux scénarios dans lesquels la génération aléatoire est défectueuse ou sous le contrôle de l'attaquant.

Les vecteurs d'initialisation synthétiques (SIV) synthétisent un IV interne en exécutant une construction de fonction pseudo-aléatoire (PRF) appelée S2V sur l'entrée (données supplémentaires et texte en clair), empêchant toute donnée externe de contrôler directement l'IV. Les nonces externes / IV peuvent être introduits dans S2V en tant que champs de données supplémentaires. Les AES-GCM-SIV synthétisent un IV interne en exécutant le mode d'authentification POLYVAL Galois sur l'entrée (données supplémentaires et texte en clair), suivi d'une opération AES.

Remplissage

Un chiffrement par bloc fonctionne sur des unités d'une taille fixe (appelée taille de bloc), mais les messages sont de différentes longueurs. Ainsi, certains modes (à savoir ECB et CBC) nécessitent que le bloc final soit rempli avant le chiffrement. Plusieurs systèmes de remplissage (padding en anglais) existent. Le plus simple est d'ajouter des octets nuls au texte en clair pour amener sa longueur à un multiple de la taille du bloc, mais il faut veiller à ce que la longueur d'origine du texte en clair puisse être récupérée ; ceci est trivial, par exemple, si le texte en clair est une chaîne en langage C qui ne contient aucun octet nul sauf à la fin. Un peu plus complexe est la méthode DES originale, qui consiste à ajouter un seul bit, suivi de suffisamment de bits zéro pour remplir le bloc ; si le message se termine sur une limite de bloc, un bloc de remplissage entier sera ajouté.

Les plus sophistiqués sont les schémas spécifiques à CBC tels que le vol de texte chiffré ou la terminaison de bloc résiduel, qui ne provoquent aucun texte chiffré supplémentaire, au détriment d'une complexité supplémentaire. Schneier et Ferguson suggèrent deux possibilités, toutes deux simples: ajouter un octet avec la valeur 128 (hexadécimal 80), suivi d'autant d'octets zéro que nécessaire pour remplir le dernier bloc, ou remplir le dernier bloc avec n octets tous avec la valeur n.

Les modes CFB, OFB et CTR ne nécessitent pas de mesures spéciales pour gérer les messages dont les longueurs ne sont pas des multiples de la taille du bloc, car les modes fonctionnent en XORant le texte en clair avec la sortie du chiffrement par bloc. Le dernier bloc partiel de texte clair est XORé avec les premiers octets du dernier bloc de flux de clés, produisant un bloc de texte chiffré final de la même taille que le bloc de texte clair partiel final. Cette caractéristique des chiffrements de flux les rend adaptés aux applications qui nécessitent que les données chiffrées en texte chiffré aient la même taille que les données en texte clair d'origine, et aux applications qui transmettent des données sous forme de streaming où il n'est pas pratique d'ajouter des octets de remplissage. Modes communs AEAD : chiffrement authentifié avec modes de données additionnelles

Un certain nombre de modes d'opération ont été conçus pour combiner secret et authentification dans une seule primitive cryptographique. Des exemples de tels modes sont le chaînage étendu de blocs de chiffrement (XCBC), le chaînage de blocs de chiffrement conscient de l'intégrité (IACBC), le mode parallélisable sensible à l'intégrité (IAPM), OCB, EAX, CWC, CCM et GCM . Les modes de chiffrement authentifiés sont classés en modes monopasse ou en modes double passe. Certains algorithmes de chiffrement authentifiés en un seul passage, tels que le mode OCB, sont grevés de brevets, tandis que d'autres ont été spécifiquement conçus et libérés de manière à éviter une telle charge.

En outre, certains modes permettent également l'authentification de données associées non chiffrées, et ceux-ci sont appelés schémas AEAD (authenticated encryption with associated data). Par exemple, le mode EAX est un schéma AEAD à double passage tandis que le mode OCB est un mode monopasse.

Galois/counter (GCM)

Le mode Galois/compteur ( GCM ) combine le mode de chiffrement de compteur bien connu avec le nouveau mode d'authentification Galois. La caractéristique clé est la facilité de calcul parallèle de la multiplication de champ de Galois utilisée pour l'authentification. Cette fonctionnalité permet un débit plus élevé que les algorithmes de chiffrement.