web-dev-qa-db-fra.com

Chiffrement avec AES 256, ai-je besoin d'une IV?

Je cherche à chiffrer avec AES en utilisant une clé 256 bits, et je remarque qu'un certain nombre de méthodes dans différentes langues, par exemple http://php.net/manual/en/function.openssl-encrypt.php , et je remarque que le paramètre IV est facultatif. Est-ce à dire que je peux implémenter entièrement le cryptage/décryptage AES avec une seule chaîne de 256 bits comme clé? À quoi sert l'IV et la sécurité sera-t-elle considérablement réduite si je l'oublie?

Toutes mes excuses pour mon ignorance, j'ai été jeté la tête la première dans une tâche qui me désoriente assez, essayant de tout assembler :)

Merci!

21
DanH

Si vous n'utilisez chaque touche qu'une seule fois, ne pas utiliser de IV est très bien. Si vous utilisez une clé plusieurs fois, vous devez utiliser un IV différent à chaque fois, afin qu'une paire (clé, IV) ne soit pas réutilisée.

Les exigences exactes pour l'IV dépendent du mode de chaînage choisi, mais une valeur aléatoire de 128 bits est généralement correcte. Il doit être différent pour chaque message que vous cryptez. Stockez-le à côté du texte chiffré, généralement sous forme de préfixe.

12
CodesInChaos

Supposons que vous chiffriez deux messages avec la même clé et que les deux messages commencent par les mêmes 16 octets de texte en clair. (16 octets est la taille de bloc pour AES, quelle que soit la taille de la clé.) Le premier bloc de texte chiffré sera-t-il le même? Si c'est le cas, vous divulguez déjà des informations à l'attaquant. Que ces informations soient sensibles ou non dépend de votre application, mais c'est déjà un mauvais signe. Si le cryptage fuit plus que le signe des messages, il ne fait pas son travail.

L'idée de base d'un IV est de ajouter un peu de contenu aléatoire à chaque message, d'une manière de principe. La façon dont cela fonctionne dépend précisément du mode. (L'opération AES de base ne fonctionne que sur des blocs de 16 octets. Un mode est un moyen d'étendre cela à des messages plus longs.) Par exemple, avec CBC , le le chiffrement de chaque bloc est calculé à partir de la clé, du bloc de texte en clair et du texte chiffré du bloc précédent; pour le tout premier bloc, le IV est utilisé à la place du texte chiffré du bloc précédent inexistant. Le IV est normalement envoyé en texte clair à côté du texte chiffré, généralement il est envoyé dans les 16 premiers octets du message crypté.

CTR le mode utilise techniquement un compteur et non un IV, mais fonctionnellement ils fonctionnent de manière très similaire: une valeur aléatoire de 16 octets est générée au hasard par l'expéditeur et envoyée au début du message crypté. Avec le mode CTR, la réutilisation de cette valeur pour un autre message est catastrophique, car CTR fonctionne en XORant le texte en clair avec un flux pseudo-aléatoire déduit de la clé et du compteur. Si vous avez deux messages chiffrés qui utilisent la même valeur de compteur, leur XOR est le XOR des deux textes en clair).

Il y a plus d'attaques contre les IV mal choisies que je n'en ai énumérées ici. Générez un IV aléatoire pour chaque message (en utilisant un générateur aléatoire de qualité cryptographique, le même que vous utiliseriez pour générer une clé), et tout ira bien.

Il y a une exception: si vous générez une nouvelle clé pour chaque message, vous pouvez choisir un IV prévisible (tous les bits 0 ou autre). Vous devez toujours utiliser un mode avec un IV (ECB ne va pas bien, par exemple, il expose des répétitions dans le texte en clair car deux blocs d'entrée identiques auront le même cryptage). C'est un cas rare cependant (il se pose pour le stockage, pas pour la communication).

Notez que le chiffrement a priori ne garantit que la confidentialité des données, pas leur intégrité. Selon ce que vous faites des données, cela peut être un problème. En particulier, si un attaquant peut soumettre des textes chiffrés provisoires à déchiffrer ou fournir des textes en clair supplémentaires à chiffrer, cela peut révéler certaines informations. Certains modes tels que EAX et GCM fournissent cryptage authentifié =: un texte chiffré ne sera déchiffré que s'il est authentique. Utilisez-en un si possible.

Notez également que AES-128 est tout aussi sûr en pratique que AES-256 .

Si vous n'êtes pas à l'aise avec ce que vous faites, essayez d'utiliser une bibliothèque de haut niveau plutôt que de vous attaquer directement à la crypto.