[Cryptopals 2.14] Décryptage ECB octet à la fois

Vous avez un oracle qui crypte votre texte brut en utilisant AES-128-ECB. L’oracle ajoute toujours au début des octets aléatoires et ajoute un texte que vous souhaitez déchiffrer.

Comment obtenir une chaîne inconnue?

Tout d’abord, pensez à ce qui se passerait s’il n’y avait pas de préfixe aléatoire.

Si vous passez un texte en clair qui fait exactement 15 octets, alors votre texte en clair et le premier octet de la chaîne inconnue seront mappés dans le même bloc. Cela signifie que – pour ce bloc – vous savez tout sauf le dernier octet.

Comme il s’agit d’une propriété du mode ECB, pas du chiffrement spécifique, disons que nous avons construit un chiffrement par blocs fonctionnant sur 4 octets. Nous savons que notre chiffrement mappe «AAAB» en «EL \ x0b \ x0f». Si nous connectons maintenant ce chiffrement dans l’oracle ci-dessus, et passons comme un texte en clair «AAA», l’oracle mettra dans le même bloc de texte en clair «AAA» et le premier octet de la chaîne inconnue. Ainsi, si nous lisons ensuite le texte chiffré et que le premier bloc est «EL \ x0b \ x0f», nous savons que le premier octet de la chaîne inconnue doit être «B».

Encore une fois. Nous obtenons un autre indice: le chiffrement crypte «AABQ» en «\ x0a} Fq». Lorsque nous passons maintenant comme un texte brut «AA», l’oracle ajoutera à la fois le premier octet et le deuxième octet de la chaîne inconnue. Si nous lisons un ‘\ x0a} Fq’, nous savons que le premier octet doit être un B – nous le savions déjà – et le second un Q.

Quelques réflexions supplémentaires doivent être faites pour que l’attaque fonctionne (comment gérer PKCS # 7 et comment passer le premier bloc), mais l’idée générale est la suivante. Le code suivant devrait fournir suffisamment d’informations pour faire l’attaque – l’oracle n’a-t-il PAS ajouté un préfixe aléatoire.

Même si le code ci-dessus n’attaquera pas l’oracle de ce défi, il est désormais facile de généraliser l’idée ci-dessus afin de gérer le cas où l’oracle ajoute un bruit aléatoire. En effet, si nous savons combien d’octets de bruit aléatoire sont ajoutés, il serait facile d’en tenir compte et d’effectuer une attaque très similaire. Le seul élément manquant est que nous ne savons pas quelle est la longueur du préfixe.

Mais nous pouvons surmonter ce problème.

Si le préfixe aléatoire était de 0 octet, alors je m’attendrais à cela en passant «A» * & lt; # d’octets dans 4 blocs & gt; Je verrais 4 blocs identiques dans le texte chiffré au tout début. Sinon, si le préfixe aléatoire était un nombre d’octets dont mod16 n’est pas 0, je devrai (à gauche) remplir ces 4 blocs de A; mais une fois que je vois les 4 blocs identiques, j’ai la taille du préfixe.

Ainsi, pour rendre le code qui fonctionnait auparavant avec l’oracle «plus simple», il est maintenant possible de faire fonctionner l’oracle «plus dur» que nous avions au début – il suffit de détecter la taille du préfixe et de faire quelques calculs.