8. Détecter AES en mode ECB
Detect AES in ECB mode
In this file are a bunch of hex-encoded ciphertexts.
One of them has been encrypted with ECB.
Detect it.
Remember that the problem with ECB is that it is stateless and deterministic; the same 16 byte plaintext block will always produce the same 16 byte ciphertext.
La résolution de cet exercice est plus proche de celle d'un exercice d'algorithmique que d'un problème de cryptographie. Comme expliqué dans l'énoncé, le but ici est de trouver la ligne dans le fichier texte qui contient le plus de block de 16 octets identiques. En effet, la principale faille d'ECB est qu'une clef chiffrera toujours de la même manière un bloc de 16 caractères.
Chacune des chaines de caractères du fichier est encodé en hexadécimal et fait exactement 160 octets une fois décodée.
import codecs
from textwrap import wrap
file = open('8.txt', 'r')
lines = file.read().splitlines()
candidate = 0
min_length = None
for index, line in enumerate(lines):
bytes_string = codecs.decode(line, "hex")
line_chunks = [bytes_string[i:i+16] for i in range(0, len(bytes_string), 16)]
line_chunks = list(set(line_chunks))
if(min_length == None or len(line_chunks) < min_length):
min_length = len(line_chunks)
candidate = index
print("The most redudant line is :", candidate, "\n", lines[candidate])
J'ai un peu allongé le code pour rajouter de la clarté. A noter que la ligne list(set(line_chunks))
transform la liste de block en un set (une collection composée de valeurs uniques) avant de le retransformer en liste.
En exécutant le code on obtient le résultat :
The most redudant line is : 132
d880619740a8a19b7840a8a31c810a3d08649af70dc06f4fd5d2d69c744cd283e2dd052f6b641dbf9d11b0348542bb5708649af70dc06f4fd5d2d69c744cd2839475c9dfdbc1d46597949d9c7e82bf5a08649af70dc06f4fd5d2d69c744cd28397a93eab8d6aecd566489154789a6b0308649af70dc06f4fd5d2d69c744cd283d403180c98c8f6db1f2a3f9c4040deb0ab51b29933f2c123c58386b06fba186a