Identifier le mode AES
Disons que j'ai une API qui accepte Plaintext et IV comme paramètre d'entrée et renvoie le texte chiffré. Je sais que l'API utilise le cryptage AES 128, mais je dois maintenant identifier le mode de cryptage (ECB, CBC, OFB, CFB ou CTR) qu'il utilise. Comment identifier le mode de cryptage? Toute suggestion, astuce ou orientation serait très appréciée.
Exemple:
curl "http://dev/api/v1.0/test?iv=00112233445566778899&text=01234567"
Réponse:
7fcb5212d14de7ddcc334ec31acec6ae
Réponses
Vous avez une boîte noire qui crypte les données et vous travaillez sous l'hypothèse que cette boîte noire implémente un mode populaire (ECB, CBC, CTR, OFB ou CFB) de cryptage (non authentifié) sur un chiffrement par bloc. Vous pouvez soumettre des textes en clair d'entrée à crypter, ainsi qu'un IV de votre choix.
Tout d'abord, vous pouvez facilement distinguer les modes de flux et les modes non-flux:
- CTR, OFB et CFB sont des modes de chiffrement de flux. Le texte chiffré a toujours la même longueur que le texte en clair.
- ECB et CBC ne peuvent crypter que des blocs entiers. La longueur du texte chiffré est toujours un multiple de la longueur du bloc (16 octets pour AES, Camellia, ARIA, SM4).
- Il existe des modes sans flux pour lesquels le texte chiffré a la même longueur que le texte brut, par exemple CTS en plus d'un mode tel que CBC ou XEX. Mais je ne les considérerai pas dans cette analyse.
Donc cryptez 1 octet. Si vous obtenez 1 octet de texte chiffré, c'est un mode de diffusion en continu. Si vous obtenez 16 octets, c'est un mode bloc entier avec remplissage. Si vous obtenez une erreur mais que le chiffrement de 16 octets fonctionne, c'est un mode bloc entier sans remplissage.
Modes de remplissage et de bloc
ECB n'utilise pas réellement d'IV. Donc, si vous obtenez la même sortie quel que soit le IV, c'est ECB, sinon ce n'est probablement pas le cas. Mais s'il s'agit d'un système de conception étrange, l'IV pourrait être utilisé de manière non standard, par exemple un «quasi-ECB» pourrait utiliser ECB sur IV + en clair.
Cryptez deux blocs identiques. Si les deux premiers blocs de texte chiffré sont identiques, c'est ECB. Sinon, par élimitation, c'est CBC. (Il peut y avoir ou non un troisième bloc selon la méthode de remplissage.)
Le remplissage CBC (ou ECB) augmente normalement la taille du texte chiffré de 1 à 16 octets. La raison pour laquelle le remplissage est toujours d'au moins 1 octet est de rendre le déchiffrement sans ambiguïté: s'il y avait des cas de remplissage vide, il serait impossible de le dire en regardant le texte chiffré déchiffré mais pas encore non rembourré. La plupart des méthodes de remplissage transmettent la longueur du remplissage par la valeur du dernier octet du texte chiffré déchiffré mais pas encore non ajouté. Cependant, il est possible d'autoriser un remplissage vide si la longueur du texte en clair est transmise séparément, ou si le texte en clair a des propriétés connues telles que se terminer par un certain octet. (Ce n'est pas une bonne idée, mais nous parlons ici d'analyser un système mal conçu.)
Distinguer les modes de flux
(Notations: $E$ est la fonction de chiffrement par bloc, $||$ est la concaténation de chaînes, $\oplus$ est xor au niveau du bit, $+$ est l'addition sur les valeurs de compteur, $\mathbf{0}$ est un bloc zéro tout bits, $\mathbf{1}$ est un bloc où tous les bits sont à zéro sauf que le dernier bit est 1.)
Étant donné que vous pouvez soumettre le même IV pour le chiffrement plusieurs fois, il est possible de faire la distinction entre les modes de flux. Voyons comment un texte en clair à deux blocs$P_1 || P_2$ est chiffré dans un texte chiffré à deux blocs $C_1 || C_2$:
- OFB: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(E(\mathrm{IV})) \oplus P_2$
- BFC: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(E(\mathrm{IV}) \oplus P_1) \oplus P_2$
- CTR: $C_1 = E(\mathrm{IV}) \oplus P_1$, $C_2 = E(\mathrm{IV}+1) \oplus P_2$
Utilisons ceci pour construire un moyen de distinguer ces trois modes.
- Cryptez un texte clair d'un bloc tout bits-zéro avec un IV tous bits-zéro. Quel que soit le mode de mise en œuvre de la boîte noire, la sortie est$E(\mathbf{0})$.
- Crypter un texte en clair d'un bloc tout bits-zéro avec l'IV $E(\mathbf{0})$. La sortie est$E(E(\mathbf{0}))$.
- Crypter un texte en clair d'un bloc tout bits-zéro avec l'IV $\mathbf{1}$(tous les bits à zéro sauf que le dernier bit est 1). La sortie est$E(\mathbf{1})$.
- Crypter un texte en clair d'un bloc tout bits-zéro avec l'IV $E(\mathbf{0}) \oplus \mathbf{1}$. La sortie est$E(E(\mathbf{0}) \oplus \mathbf{1})$.
- Maintenant, cryptez un texte en clair à deux blocs: $\mathrm{IV} = \mathbf{0}$, $P_1 = \mathbf{1}$, $P_2 = \mathbf{0}$. Regardez le deuxième bloc du texte chiffré.
- OFB: $C_2 = E(E(\mathbf{0}))$ (calculé à l'étape 2).
- BFC: $C_2 = E(E(\mathbf{0}) \oplus \mathbf{1})$ (calculé à l'étape 4).
- CTR: $E(\mathrm{0} + 1)$. C'est généralement$E(\mathrm{1})$ (calculé à l'étape 3) mais peut être différent si l'implémentation CTR effectue l'incrémentation du compteur différemment.
Comment identifier le mode de cryptage?
Vous ne pouvez pas identifier complètement ce mode sans envoyer $2^{64}$ish octets de données sous la même clé, car ce n'est qu'alors que les modes de streaming (CFB, OFB, CTR) commencent à se décomposer en sécurité de différentes manières.
Cependant, vous pouvez être sûr que si vous voyez un texte chiffré qui n'est pas un multiple de la longueur du bloc (16 octets pour AES), alors vous avez l'un des CFB, OFB ou CTR (ou un mode de diffusion en continu similaire ou un d'eux).
Maintenant, si vous obtenez toujours des sorties qui sont un multiple de la longueur de bloc, il est probable que ce soit en mode CBC ou ECB. Vous pouvez distinguer ces deux en fonction de la vulnérabilité ECB classique que CBC n'a pas: Des blocs égaux d'entrées sont traités en blocs égaux de sorties. En pratique, cela signifie que vous pouvez simplement envoyer 32 octets all-0 et si vous récupérez quelque chose qui montre deux séquences de 16 octets qui sont identiques, vous avez ECB sinon CBC. Alternativement, si vous spécifiez différents IV pour le même texte en clair et que vous récupérez toujours le même texte chiffré, vous savez également que l'ECB est utilisé (bien que les IV CBC devraient vraiment être choisis au hasard et non par l'adversaire ...).