Nous commençons par ne conserver que le code strictement nécessaire afin de comprendre le fonctionnement de shared_value.py
et integration-par-parties.py
:
#!/usr/bin/python3
from Cryptodome.Random.random import randrange
import json
order = 32
bit_size = 256
value = [0]*order
value.append(int(b'ABCD', 16))
for v in value:
print(hex(v))
print()
for i in range(order):
for j in range(i+1, order + 1):
print(i,j)
t = randrange(1 << bit_size)
value[i] ^= t
value[j] ^= t
for v in value:
print(hex(v))
Des nombres aléatoires sont tirés avec randrange
et un XOR est appliqué par rondes. Nous nous interressons à la ronde avec i = 0
.
On note que la clé en clair se trouve intialement en value[32]
et toutes les autres valeurs valent 0 (ce qui constitue une faille car il existe une méthode randomize()
qui aurait due être appelée.
Comme randomize()
n’a pas été appelée il est possible de reprendre à l’envers cette ronde.
i = 0, j = 1
v[0] = v[0] ^ t1
v[1] = v[1] ^ t1
i = 0, j = 2
v[0] = v[0] ^ t1 ^ t2
v[2] = v[2] ^ t2
i = 0, j = 3
v[0] = v[0] ^ t1 ^ t2 ^ t3
v[3] = v[3] ^ t3
.../...
v[0] = v[0] ^ t1 ^ t2 ^ t3 ... ^ t32
v[32] = v[32] ^ t32
Le programme suivant permet de calculer la valeur du drapeau qui sert de clé.
#!/usr/bin/python3
import json
with open('output.txt') as f:
value = json.load(f)
order = len(value)-1
value[order] = value[order] ^ value[0]
for j in range(order-1, 0, -1):
value[order] ^= value[j]
print(f"FCSC{{{value[order]:x}}}")