Solution de U03 pour Intégration par parties

intro hardware attaque side channel

26 janvier 2025

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}}}")