web-dev-qa-db-fra.com

Quels sont les meilleurs modes de chiffrement et de remplissage pour le chiffrement AES?

Selon l'exigence PCI-DSS 3.4:

Pour stocker les données de carte de crédit , une cryptographie forte doit être utilisée.

J'ai décidé d'utiliser le cryptage AES, qui est un cryptage puissant et principalement recommandé pour crypter les détails de la carte de crédit.

J'ai vu que AES avait le mode de chiffrement et le mode de remplissage.

Lorsque j'ai recherché, j'ai trouvé que selon Publication spéciale NIST 800-38A , il spécifie cinq modes de fonctionnement de confidentialité pour l'algorithme de chiffrement à clé symétrique.

Je suis donc totalement confus si je peux utiliser l'un des cinq modes de chiffrement ou y en a-t-il un parmi les cinq énumérés ci-dessous:

Modes de chiffrement:

  1. BCE
  2. CBC
  3. OFB
  4. CFB
  5. CTR

Quel est le meilleur mode de chiffrement parmi les cinq?

Quel est également le meilleur mode de remplissage pour le chiffrement AES?

26
RajeshKannan

"Meilleur" est plutôt subjectif - cela dépend de vos besoins. Cela dit, je vais vous donner un aperçu général de chaque mode.

[~ # ~] ecb [~ # ~] - Livre de codes électronique. Ce mode est le plus simple et transforme chaque bloc séparément. Il a juste besoin d'une clé et de quelques données, sans extras supplémentaires. Malheureusement, ça craint - pour commencer, les blocs de texte en clair identiques sont chiffrés en blocs de texte chiffré identiques lorsqu'ils sont chiffrés avec la même clé. Wikipédia article a une excellente représentation graphique de cet échec.

Bons points: Très simple, le chiffrement et le déchiffrement peuvent être exécutés en parallèle.

Mauvais points: horriblement précaire.

[~ # ~] cbc [~ # ~] - Cipher Block Chianing. Ce mode est très courant et est considéré comme raisonnablement sûr. Chaque bloc de texte en clair est xoré avec le bloc de texte chiffré précédent avant d'être transformé, ce qui garantit que des blocs de texte brut identiques n'aboutissent pas à des blocs de texte chiffré identiques lorsqu'ils sont en séquence. Pour le premier bloc de texte en clair (qui n'a pas de bloc précédent), nous utilisons un vecteur d'initialisation à la place. Cette valeur doit être unique par message et par clé, pour garantir que des messages identiques n'aboutissent pas à des textes chiffrés identiques. CBC est utilisé dans de nombreuses suites de chiffrement SSL/TLS.

Malheureusement, il y a des attaques contre CBC lorsqu'elle n'est pas mise en œuvre parallèlement à un ensemble de contrôles d'intégrité et d'authenticité solides. Une propriété dont il dispose est la malléabilité au niveau du bloc, ce qui signifie qu'un attaquant peut modifier le texte en clair du message de manière significative sans connaître la clé, s'il peut jouer avec le texte chiffré. En tant que telles, les implémentations incluent généralement un enregistrement d'authenticité basé sur HMAC. C'est un sujet délicat cependant, car même l'ordre dans lequel vous effectuez le HMAC et le cryptage peut entraîner des problèmes - recherchez "MAC puis cryptez" pour des détails sanglants sur le sujet.

Bons points: sécurisé lorsqu'il est utilisé correctement, déchiffrement parallèle.

Mauvais points: Pas de chiffrement parallèle, sensible aux attaques de malléabilité lorsque les contrôles d'authenticité sont mauvais/manquants. Mais quand c'est bien fait, c'est très bien.

[~ # ~] ofb [~ # ~] - Retour de sortie. Dans ce mode, vous créez essentiellement un chiffrement de flux. Le IV (une valeur aléatoire unique) est crypté pour former le premier bloc de flux de clés, puis cette sortie est xor'ed avec le texte en clair pour former le texte chiffré. Pour obtenir le bloc de clés suivant, le bloc de clés précédent est à nouveau chiffré, avec la même clé. Cette opération est répétée jusqu'à ce que suffisamment de flux de clés soit généré pour toute la longueur du message. C'est bien en théorie, mais dans la pratique, il y a des questions sur sa sécurité. Les transformations de bloc sont conçues pour être sécurisées lorsqu'elles sont effectuées une fois, mais rien ne garantit que E (E (m, k), k) est sécurisé pour chaque chiffrement de bloc sécurisé de manière indépendante - il peut y avoir étrange interactions entre primitives internes qui n'ont pas été étudiées correctement. S'il est implémenté d'une manière qui fournit une rétroaction partielle sur le bloc (c'est-à-dire qu'une partie seulement du bloc précédent est achetée à l'avance, avec une valeur statique ou faiblement aléatoire pour l'autre moitié), d'autres problèmes émergent, tels qu'un court cycle de flux de clés. En général, vous devez éviter OFB.

Bons points: Keystream peut être calculé à l'avance, des implémentations matérielles rapides sont disponibles

Mauvais points: le modèle de sécurité est discutable, certaines configurations conduisent à de courts cycles de clés

[~ # ~] cfb [~ # ~] - Commentaires chiffrés. Un autre mode de chiffrement de flux, assez similaire à CBC, a été effectué à l'envers. Son avantage majeur est que vous n'avez besoin que de la transformation de cryptage, pas de la transformation de décryptage, qui économise de l'espace lors de l'écriture de code pour les petits appareils. C'est un peu bizarre et je ne le vois pas mentionné fréquemment.

Bons points: encombrement réduit, décryptage parallèle.

Mauvais points: Pas couramment mis en œuvre ou utilisé.

[~ # ~] ctr [~ # ~] - Mode compteur. Cela implique essentiellement de chiffrer une séquence de nombres incrémentés préfixés avec un nonce ( nombre utilisé une fois) pour produire un flux de clés, et encore une fois un mode de chiffrement de flux. Ce mode élimine les problèmes liés à l'exécution répétée de transformations les unes sur les autres, comme nous l'avons vu en mode OFB. Il est généralement considéré comme un bon mode.

Bons points: sécurisé quand c'est fait correctement, chiffrement et déchiffrement parallèles.

Mauvais points: pas beaucoup. Certains remettent en question la sécurité du modèle de "texte en clair associé" mais il est généralement considéré comme sûr.


Les modes de remplissage peuvent être difficiles, mais en général, je suggère toujours le remplissage PKCS # 7, qui implique l'ajout d'octets qui représentent chacun la longueur du remplissage, par exemple 04 04 04 04 pour quatre octets de remplissage, ou 03 03 03 pour trois. L'avantage par rapport à certains autres mécanismes de remplissage est qu'il est facile de savoir si le remplissage est corrompu - plus le remplissage est long, plus le risque de corruption de données aléatoire est élevé, mais cela augmente également le nombre de copies de la longueur de remplissage que vous avez. Il est également trivial de valider et de supprimer, sans aucune chance réelle de remplissage cassé validant d'une manière ou d'une autre comme correct.


En général, restez avec CBC ou CTR, avec PKCS # 7 si nécessaire (vous n'avez pas besoin de remplissage sur les modes de chiffrement de flux) et utilisez un contrôle d'authenticité (HMAC-SHA256 par exemple) sur le texte chiffré. CBC et CTR sont recommandés par Niels Ferguson et Bruce Schneier, tous deux cryptographes respectés.

Cela étant dit, il existe des modes nouveau! EAX et GCM ont récemment reçu beaucoup d'attention. GCM a été intégré à la suite TLS 1.2 et corrige de nombreux problèmes qui existaient dans CBC et les chiffrements de flux. Le principal avantage est que les deux sont modes authentifiés, en ce sens qu'ils intègrent les contrôles d'authenticité dans le mode de chiffrement lui-même, plutôt que d'avoir à en appliquer un séparément. Cela résout certains problèmes de remplissage des attaques Oracle et diverses autres astuces. Ces modes ne sont pas aussi simples à expliquer (et encore moins à implémenter) mais ils sont considérés comme très puissants.

53
Polynomial