Lesquels d’entre eux sont préférés dans quelles circonstances?
J'aimerais voir la liste des critères d'évaluation pour les différents modes, et peut-être une discussion sur l'applicabilité de chaque critère.
Par exemple, je pense que l’un des critères est la "taille du code" pour le chiffrement et le déchiffrement, ce qui est important pour les systèmes embarqués à microcode, tels que les cartes réseau 802.11. SI le code requis pour implémenter CBC est beaucoup plus petit que celui requis pour le CTR (je ne sais pas si c'est vrai, ce n'est qu'un exemple), alors je pourrais comprendre pourquoi le mode avec le code plus petit serait préféré. Mais si j'écris une application qui s'exécute sur un serveur et que la bibliothèque AES que j'utilise implémente de toute façon CBC et CTR, alors ce critère n'est pas pertinent.
Voyez ce que je veux dire par "liste de critères d'évaluation et applicabilité de chaque critère" ??
Ce n'est pas vraiment lié à la programmation mais à l'algorithme.
ECB ne doit pas être utilisé lors du cryptage de plusieurs blocs de données avec la même clé.
CBC, OFB et CFB sont similaires, mais OFB/CFB est préférable, car vous avez uniquement besoin d’un chiffrement et non d’un déchiffrement, ce qui peut économiser de l’espace.
Le CTR est utilisé si vous voulez une bonne parallélisation (vitesse) au lieu de CBC/OFB/CFB.
Le mode XTS est le plus courant si vous codez des données accessibles de manière aléatoire (comme un disque dur ou une RAM).
OCB est de loin le meilleur mode, car il permet le cryptage et l’authentification en un seul passage. Cependant, il existe des brevets aux États-Unis.
La seule chose que vous devez vraiment savoir, c'est que la BCE ne doit pas être utilisée à moins que vous ne chiffriez qu'un seul bloc. XTS doit être utilisé si vous chiffrez des données consultées de manière aléatoire et non un flux.
La vérité est que si vous vous posez cette question, vous ne pourrez probablement pas concevoir et mettre en place un système sécurisé.
Permettez-moi d'illustrer mon propos: imaginez que vous construisez une application Web et que vous deviez stocker des données de session. Vous pouvez attribuer à chaque utilisateur un ID de session et stocker les données de session sur le serveur dans un ID de session de mappage de table de hachage avec les données de session. Mais alors vous devez faire face à cet état embêtant sur le serveur et si à un moment donné vous avez besoin de plus d’un serveur, les choses vont devenir compliquées. Vous avez donc l’idée de stocker les données de session dans un cookie côté client. Vous le chiffrerez bien sûr afin que l'utilisateur ne puisse pas lire et manipuler les données. Alors, quel mode devriez-vous utiliser? En venant ici, vous lisez la réponse en haut (désolé de vous avoir choisi myforwik). Le premier sujet couvert - la BCE - n’est pas fait pour vous, vous voulez chiffrer plus d’un bloc, le suivant - le CBC - semble bien et vous n’avez pas besoin du parallélisme du CTR, vous n’avez pas besoin d’un accès aléatoire; XTS et les brevets sont un PITA, donc pas d'OCB. En utilisant votre bibliothèque de chiffrement, vous vous rendez compte que vous avez besoin d'un certain rembourrage, car vous ne pouvez chiffrer que des multiples de la taille du bloc. Vous choisissez PKCS7 car il a été défini dans certaines normes de cryptographie sérieuses. Après avoir lu quelque part que CBC est prouvé que c'est sûr s'il est utilisé avec un IV aléatoire et un chiffrement de bloc sécurisé, vous vous sentez à l'aise même si vous stockez vos données sensibles côté client.
Des années plus tard, après que votre service ait réellement atteint une taille significative, un spécialiste de la sécurité informatique vous contacte pour une divulgation responsable. Elle vous dit qu'elle peut déchiffrer tous vos cookies en utilisant un attaque par un padding Oracle , car votre code produit une page d'erreur si le remplissage est cassé.
Ce n'est pas un scénario hypothétique:Microsoft avait cette faille exacte dans ASP.NET il y a quelques années encore.
Le problème est qu’il existe de nombreux pièges en matière de cryptographie et qu’il est extrêmement facile de construire un système qui semble sûr pour le profane, mais qu’il est facile de casser pour un attaquant averti.
Pour les connexions actives, utilisez TLS (assurez-vous de vérifier le nom d'hôte du certificat et la chaîne de l'émetteur). Si vous ne pouvez pas utiliser TLS, recherchez l'API de plus haut niveau que votre système peut offrir pour votre tâche et assurez-vous de bien comprendre les garanties qu'il offre et surtout ce qu'il ne garantit pas. Pour l'exemple ci-dessus, un cadre tel que Play offre installations de stockage côté client , les données stockées ne seront pas invalidées après un certain temps, cependant, et si vous modifiez l’état côté client, un attaquant peut restaurer un état antérieur sans que vous ne le remarquiez.
S'il n'y a pas d'abstraction de haut niveau disponible, utilisez une bibliothèque de chiffrement de haut niveau. NaCl est un exemple frappant et une implémentation portable comportant de nombreuses liaisons de langage est Sodium . En utilisant une telle bibliothèque, vous n'avez pas à vous soucier des modes de cryptage, etc., mais vous devez faire encore plus attention aux détails d'utilisation qu'avec une abstraction de niveau supérieur, comme si vous n'utilisiez jamais deux fois un nonce.
Si, pour une raison quelconque, vous ne pouvez pas utiliser une bibliothèque de chiffrement de haut niveau, par exemple parce que vous devez interagir avec le système existant de manière spécifique, vous ne pouvez absolument pas vous renseigner de manière approfondie. Je recommande la lecture Ingénierie de cryptographie par Ferguson, Kohno et Schneier . S'il vous plaît ne vous trompez pas en croyant que vous pouvez construire un système sécurisé sans les antécédents nécessaires. La cryptographie est extrêmement subtile et il est presque impossible de tester la sécurité d'un système.
Pour empêcher les attaques Oracle et les modifications apportées au texte chiffré, il est possible de calculer un code d'authentification de message (MAC) sur le texte chiffré et de le déchiffrer uniquement s'il n'a pas été falsifié. Ceci s'appelle encrypt-then-mac and devrait être préféré à tout autre ordre . À l'exception de très peu de cas d'utilisation, l'authenticité est aussi importante que la confidentialité (cette dernière étant le but du cryptage). Les schémas de chiffrement authentifié (avec données associées (AEAD)) combinent le processus en deux parties du chiffrement et de l'authentification en un mode de chiffrement par bloc qui produit également une étiquette d'authentification au cours du processus. Dans la plupart des cas, cela se traduit par une amélioration de la vitesse.
Compte tenu de l'importance de l'authentification, je recommanderais les deux modes de chiffrement par blocs suivants dans la plupart des cas d'utilisation (à l'exception du chiffrement de disque): Si les données sont authentifiées par une signature asymétrique, utilisez CBC, sinon utilisez GCM.
Une analyse formelle a été réalisée par Phil Rogaway en 2011, ici . La section 1.6 donne un résumé que je transcris ici, en ajoutant ma propre accentuation en gras (si vous êtes impatient, sa recommandation est d'utiliser le mode CTR, mais je vous suggère de lire mes paragraphes sur l'intégrité du message par rapport au cryptage ci-dessous).
Notez que la plupart d'entre eux exigent que le vecteur d'initialisation soit aléatoire, ce qui signifie non prévisible et doit donc être généré avec une sécurité cryptographique. Cependant, certains nécessitent uniquement un "nonce", qui n'exige pas cette propriété mais exige seulement qu'elle ne soit pas réutilisée. Par conséquent, les conceptions qui reposent sur un nonce sont moins sujettes aux erreurs que celles qui ne le font pas (et croyez-moi, j'ai vu de nombreux cas où CBC n'est pas implémentée avec une sélection IV appropriée). Ainsi, vous verrez que j'ai ajouté des mots en gras lorsque Rogaway dit quelque chose comme "La confidentialité n'est pas atteinte lorsque l'IV est un nonce", cela signifie que si vous choisissez votre IV de manière cryptographique sécurisée (imprévisible), aucun problème. Mais si vous ne le faites pas, vous perdez les bonnes propriétés de sécurité. Ne réutilisez jamais un IV pour aucun de ces modes.
En outre, il est important de comprendre la différence entre l’intégrité du message et le cryptage. Le chiffrement masque les données, mais un attaquant peut peut-être modifier les données chiffrées. Les résultats peuvent éventuellement être acceptés par votre logiciel si vous ne vérifiez pas l'intégrité du message. Alors que le développeur dira "mais les données modifiées reviendront comme des ordures après le déchiffrement", un bon ingénieur en sécurité trouvera la probabilité que ces ordures causent un comportement indésirable dans le logiciel, puis il transformera cette analyse en une véritable attaque. J'ai vu de nombreux cas d'utilisation du cryptage, mais l'intégrité du message était vraiment plus nécessaire que le cryptage. Comprenez ce dont vous avez besoin.
Je devrais dire que bien que GCM ait à la fois un cryptage et une intégrité de message, sa conception est très fragile: si vous réutilisez un IV, vous êtes foutu - l’attaquant peut récupérer votre clé. Les autres conceptions étant moins fragiles, j'ai personnellement peur de recommander GCM en fonction de la quantité de code de cryptage médiocre que j'ai constaté dans la pratique.
Si vous avez besoin des deux, intégrité des messages et cryptage, vous pouvez combiner deux algorithmes: généralement nous voyons CBC avec HMAC, mais aucune raison de vous lier à CBC. La chose importante à savoir est chiffrez d'abord, puis MAC le contenu chiffré , et non l'inverse. De plus, l'IV doit faire partie du calcul du MAC.
Je ne suis pas au courant des problèmes de propriété intellectuelle.
Passons maintenant aux bonnes choses du professeur Rogaway:
ECB: un chiffrement par bloc, le mode chiffre les messages qui sont un multiple de n bits en chiffrant séparément chaque élément de n bits. Les propriétés de sécurité sont faibles , la méthode fuyant l’égalité des blocs entre les positions et l’heure du bloc. Valeur patrimoniale considérable et valeur essentielle pour d’autres systèmes, mais ce mode n’atteint pas en soi un objectif de sécurité généralement souhaitable et doit être utilisé avec beaucoup de prudence; La BCE ne doit pas être considérée comme un mode de confidentialité "polyvalent" .
CBC: schéma de cryptage basé sur IV, le mode est sécurisé en tant que schéma de cryptage probabiliste, permettant d'obtenir une distinction entre les bits aléatoires, en supposant un IV aléatoire. La confidentialité n'est pas atteinte si le vecteur d'initialisation est simplement un nonce , ni s'il s'agit d'un nonce chiffré sous la même clé que celle utilisée par le schéma, comme le suggère la norme à tort. Les textes chiffrés sont très malléables. Aucune sécurité d'attaque de cryptogramme choisi (CCA). La confidentialité est perdue en présence d'un Oracle de remplissage correct pour de nombreuses méthodes de remplissage. Cryptage inefficace d'être intrinsèquement série. Largement utilisées, les propriétés de sécurité du mode exclusivement liées à la confidentialité du mode résultent en de fréquents abus Peut être utilisé comme bloc de construction pour les algorithmes CBC-MAC. Je ne peux identifier aucun avantage important par rapport au mode CTR.
CFB: schéma de chiffrement basé sur IV, le mode est sécurisé en tant que schéma de chiffrement probabiliste, permettant d'obtenir une distinction entre les bits aléatoires, en supposant un IV aléatoire. La confidentialité n'est pas atteinte si l'IV est prévisible , ni par un nonce chiffré sous la même clé utilisée par le schéma, comme le suggère la norme à tort. Les textes chiffrés sont malléables. Pas de CCA-sécurité. Cryptage inefficace d'être intrinsèquement série. Le schéma dépend d’un paramètre s, 1 ≤ s ≤ n, typiquement s = 1 ou s = 8. Inutile d’avoir besoin d’un seul appel de type chiffré-bloc pour traiter uniquement s bits. Le mode atteint une propriété intéressante d’auto-synchronisation; l'insertion ou la suppression d'un nombre quelconque de caractères sur le cryptogramme ne perturbe que temporairement le déchiffrement correct.
OFB: schéma de cryptage basé sur IV, le mode est sécurisé comme schéma de cryptage probabiliste, permettant d'obtenir une distinction entre les bits aléatoires, en supposant un IV aléatoire. La confidentialité n'est pas atteinte si le IV est un nonce, bien qu'une séquence fixe de IV (par exemple, un compteur) fonctionne correctement. Les textes chiffrés sont très malléables. Aucune sécurité de la CCA. Le chiffrement et le déchiffrement ne sont pas efficaces, car ils sont intrinsèquement série. Crypte en mode natif des chaînes de n'importe quelle longueur en bits (aucun remplissage requis). Je ne peux identifier aucun avantage important par rapport au mode CTR.
CTR: schéma de chiffrement basé sur IV, le mode est indiscernable des bits aléatoires en supposant une nonce IV. En tant que schéma sécurisé basé sur nonce, le mode peut également être utilisé en tant que schéma de chiffrement probabiliste, avec un IV aléatoire. Échec total de la confidentialité si un nonce est réutilisé pour le chiffrement ou le déchiffrement. La parallélisabilité du mode le rend souvent plus rapide, dans certains paramètres, beaucoup plus rapide que d'autres modes de confidentialité. Un bloc de construction important pour les schémas de chiffrement authentifié. Dans l’ensemble, c’est généralement le moyen le plus moderne et le plus performant d’atteindre le cryptage avec confidentialité uniquement.
XTS: schéma de chiffrement basé sur IV, le mode fonctionne en appliquant un blockcipher ajustable (sécurisé en tant que PRP fort) à chaque bloc de n bits. Pour les messages dont la longueur n'est pas divisible par n, les deux derniers blocs font l'objet d'un traitement particulier. Ce mode est uniquement autorisé à chiffrer des données sur un périphérique de stockage structuré en blocs. La faible largeur du PRP sous-jacent et le traitement médiocre des blocs finaux fractionnaires posent problème. Plus efficace, mais moins souhaitable que ne le serait un blockcipher sécurisé par PRP (à bloc large).
ALG1–6 : ensemble de codes MAC, tous basés sur le code CBC-MAC. Trop de régimes. Certains sont sécurisés de manière fiable en tant que PRF VIL, d'autres en tant que PRF FIL, et d'autres n'ont aucune sécurité prouvable. Certains des régimes admettent des attaques dommageables. Certains modes sont datés. La séparation des clés est mal traitée pour les modes qui en sont dotés. Ne devrait pas être adopté en masse, mais il est possible de choisir sélectivement les "meilleurs" régimes. Il serait également bon de n’adopter aucun de ces modes en faveur de CMAC. Certaines des MAC ISO 9797-1 sont largement normalisées et utilisées, en particulier dans le secteur bancaire. Une version révisée de la norme (ISO/IEC FDIS 9797-1: 2010) sera bientôt publiée [93].
CMAC: MAC basé sur le CBC-MAC, le mode est manifestement sécurisé (jusqu'à la date de naissance) en tant que PRF (VIL) (en supposant que le blockcipher sous-jacent est un bon PRP). Frais généraux essentiellement minimaux pour un système basé sur CBCMAC. La nature série inhérente pose un problème dans certains domaines d’application et son utilisation avec un bloc de chiffrement par blocs de 64 bits nécessiterait une nouvelle saisie occasionnelle. Plus propre que la collection de codes MAC ISO 9797-1.
HMAC: un MAC basé sur une fonction de hachage cryptographique plutôt que sur un blockcipher (bien que la plupart des fonctions de hachage cryptographiques soient elles-mêmes basées sur des chiffreurs de blocs). Le mécanisme bénéficie de fortes limites de sécurité prouvables, bien que non fondées sur des hypothèses préférées. Plusieurs variantes étroitement apparentées dans la littérature compliquent l'acquisition d'une compréhension de ce que l'on sait. Aucune attaque dommageable n'a jamais été suggérée. Largement normalisé et utilisé.
GMAC: adresse MAC nonce constituant un cas particulier de GCM. Hérite de nombreuses bonnes et mauvaises caractéristiques de GCM. Mais la non-exigence n'est pas nécessaire pour un MAC, et ici, cela n'apporte que peu d'avantages. Attaques pratiques si les étiquettes sont tronquées à ≤ 64 bits et que l'étendue du déchiffrement n'est pas surveillée ni réduite. Échec complet de non-réutilisation. L'utilisation est de toute façon implicite si GCM est adopté. Non recommandé pour la normalisation séparée.
CCM: schéma AEAD basé sur nonce qui combine le cryptage en mode CTR et le CBC-MAC brut. En série, limite la vitesse dans certains contextes. Sûrement sécurisé, avec de bonnes limites, en supposant que le blockcipher sous-jacent est un bon PRP. Inconvénient de la construction qui fait manifestement le travail. Plus simple à mettre en œuvre que GCM. Peut être utilisé en tant que MAC basé sur nonce. Largement normalisé et utilisé.
GCM: schéma AEAD basé sur nonce qui combine le cryptage en mode CTR et une fonction de hachage universelle basée sur GF (2128). Bonnes caractéristiques d'efficacité pour certains environnements de mise en œuvre. De bons résultats sécurisés en supposant une troncature minimale des balises. Attaques et limites de sécurité prouvables médiocres en présence d'une troncature importante des étiquettes. Peut être utilisé en tant que MAC nonce, appelé ensuite GMAC. Choix discutable d'autoriser des ressources autres que 96 bits. Il est recommandé de limiter les informations à 96 bits et les étiquettes à au moins 96 bits. Largement normalisé et utilisé.
Avez-vous commencé par lire les informations à ce sujet sur Wikipedia - Modes de fonctionnement du chiffrement par blocs ? Suivez ensuite le lien de référence sur Wikipedia vers NIST: Recommandation relative aux modes de fonctionnement avec chiffrement par bloc .
Vous voudrez peut-être choisir en fonction de ce qui est largement disponible. J'avais la même question et voici les résultats de mes recherches limitées.
Limitations matérielles
STM32L (low energy ARM cores) from ST Micro support ECB, CBC,CTR GCM
CC2541 (Bluetooth Low Energy) from TI supports ECB, CBC, CFB, OFB, CTR, and CBC-MAC
Limitations de l'open source
Original rijndael-api source - ECB, CBC, CFB1
OpenSSL - command line CBC, CFB, CFB1, CFB8, ECB, OFB
OpenSSL - C/C++ API CBC, CFB, CFB1, CFB8, ECB, OFB and CTR
EFAES lib [1] - ECB, CBC, PCBC, OFB, CFB, CRT ([sic] CTR mispelled)
OpenAES [2] - ECB, CBC
[1] http://www.codeproject.com/Articles/57478/A-Fast-and-Easy-to-Use-AES-Library