web-dev-qa-db-fra.com

L'AES doit-il toujours donner la même sortie?

J'ai du mal à comprendre AES et j'aimerais savoir si le cryptage du même texte avec la même clé deux fois de suite devrait donner la même sortie.

Y a-t-il du sel ou quelque chose qui changerait la sortie?

S'il ne donne pas la même chose, comment déchiffrer le message (avec la clé) si le sel est aléatoire et qu'il ne le sait pas?

Si cela donne la même chose, des tables Rainbow pourraient-elles être utilisées pour récupérer le message?

22
user31008

Un blockcipher comme AES est une permutation à clé. Dans le cas d'AES, il prend une clé puis transforme un bloc de 16 octets en un autre bloc de 16 octets de façon déterministe.

Pour chiffrer quelque chose avec un chiffrement par bloc, vous devez utiliser un mode de fonctionnement . En règle générale, ces modes prennent un IV (similaire à un sel) qui devrait être différent pour chaque message que vous cryptez. Cette différence dans l'IV conduit à un message crypté totalement différent. Le chiffrement du même message avec le même IV et la même clé renvoie toujours le même texte chiffré. Le chiffrement de plusieurs messages avec le même IV et la même clé affaiblit la sécurité, mais de combien dépend du mode.

Les propriétés requises pour un IV dépendent du mode choisi, parfois il doit être unique (par exemple pour le mode CTR), parfois il doit être aléatoire imprévisible (par exemple pour le mode CBC). Mais il n'a généralement pas besoin d'être secret, vous l'envoyez donc au destinataire avec le texte chiffré, généralement sous forme de préfixe.

Il existe certains modes conçus pour le chiffrement déterministe. En utilisant ces modes, vous perdez toujours si deux messages sont identiques, mais rien de plus. Vous ne devez utiliser ces modes que lorsque vous avez besoin de déterminisme.

28
CodesInChaos

AES est un bloc de chiffrement: il prend en entrée un bloc (16 octets, dans le cas d'AES) et un (16, 24 ou 32 octets, pour AES), et sort un autre bloc (encore une fois, 16 octets). C'est un algorithme entièrement déterministe, entièrement spécifié, et tout le monde devrait obtenir le même bloc de sortie pour le même bloc d'entrée et la même clé.

Cependant, vous ne cryptez pas un bloc, vous cryptez un message. Le chiffrement par blocs n'est qu'un élément de construction; le chiffrement réel utilise un mode de fonctionnement qui invoque le chiffrement de bloc à plusieurs reprises. Il y a de bons modes et il y a de mauvais modes; le but est de garantir la confidentialité du message dans son ensemble et de ne pas divulguer des informations partielles, par exemple si deux parties du message sont égales l'une à l'autre. En particulier, si nous voulons crypter deux messages avec la même clé, nous voulons généralement pas vouloir révéler si les deux messages étaient identiques ou non, donc quelque chose doit changer quelque part entre le deux cryptages.

La plupart des modes de fonctionnement utilisent un vecteur d'initialisation qui est l'endroit où le non-déterminisme est injecté. Certains modes (par exemple GCM ou EAX ) ne nécessitent qu'un IV non répétitif; un compteur peut leur convenir et peut être implicite dans un certain contexte (par exemple, lorsqu'il y a des messages successifs sur un flux de communication donné, le numéro de message peut servir de IV). Certains autres modes, notamment CBC, ne sont sécurisés en général que si l'IV est choisi au hasard, uniformément, avec un fort PRNG , et l'IV suivant à utiliser n'est pas déjà connu lorsque les données en clair sont choisies. le non-respect de toutes ces exigences a été à l'origine de nombreux problèmes, par exemple attaque BEAST sur SSL .


On pourrait donc dire que le cryptage symétrique sécurisé nécessite au moins mémoire (par exemple, pour se souvenir d'une valeur de compteur) ou aléatoire . La "mémoire" peut être un compteur mondial courant (par exemple l'heure actuelle, mais attention aux ajustements d'horloge!).

Si vous êtes prêt à tolérer la petite fuite pour savoir si deux messages d'entrée donnés sont identiques ou non, alors il est possible d'avoir un système de cryptage entièrement déterministe sans mémoire, mais il ne sera pas compatible avec le cryptage en streaming (vous devez garder tout le message en mémoire pendant le processus). Fondamentalement, vous calculez un algorithme MAC déterministe sur le message (tel que HMAC ) et utilisez sa sortie comme IV. Il s'agit d'un algorithme à deux passes, et c'est plutôt inévitable. Si deux messages source sont identiques, ils donneront le même message chiffré, mais s'ils diffèrent n'importe où (même sur leur dernier bit), alors, avec une forte probabilité, les messages chiffrés seront complètement différents.

Malheureusement, les plates-formes pour lesquelles la mémoire et/ou le caractère aléatoire sont des exigences strictes (par exemple, les cartes à puce) sont également des plates-formes où RAM est à une prime, et un système à deux passes peut être trop cher.

12
Tom Leek