Description
Un équipement embarqué, une tablette, comporte un système d’échanges sécurisés avec un serveur de données.
Pour authentifier les données envoyées par cette tablette, une signature est apposée sur chacun des fichiers envoyés. La signature est calculée de la manière suivante :
RSA-CRT(SHA256(fichier))
qui par exemple, peut être implémentée en Python de la manière suivante :
import hashlib
f = open('public/ANSSI_ref.png','rb')
raw = bytearray(f.read())
m = hashlib.sha256(raw).digest()
m = int.from_bytes(m, byteorder='big', signed=False)
signature = pow_crt(m, d, p, q)
print(f"{signature.hex()}")
Ainsi la signature de l’image ANSSI_ref.png
de référence est égale à
39eb497f830a302f41818784cf83bff1d245e2a2d5e1dc04996d57443bcc4a5fde3650ad11a70267fd4c34d922c47633d2decb21d30d42215766485acf6399d1f9639419d2104376070045b8401470e56fc3b21cc4b2e5d6443cb1beef4815db6725cf0226d49d8e17199c6075dd78f393e265ad350ac79c5be18fc6c9981de1
qui se vérifiera facilement grâce à clé publique RSA:
e = 65537
n = 114181065031786564590139505995090932681603488058093695383755920020714540043378009781380110655253006728353171921382633045444731450267353184468441566668432893992049978192406103162591416659000523363797206479008373775089128981682147631692898693610665109453356689955829711356078688003770094519986009441791800904261
Un de nos apprentis en canaux auxillaires nous a remonté un phénomène étrange concernant l’implémentation du RSA-CRT sur cette tablette : malgré la mise en place d’une contre-mesure classique pour éviter les attaques par les canaux auxilliares temporels et celui lié à la consommation de courant, il semblerait que des informations sensibles fuitent dans le spectre audible ! La contre-mesure utilisée est la méthode de Montgomery, elle consiste en l’utilisation d’une exponentiation modulaire ne faisant pas apparaitre de différence de calcul entre les différents bits des exposants secrets dp
et dq
de RSA.
def montgomery(a, e, n):
exp = map(int, f"{e:b}")
out = [1, a]
for i in exp:
out[1 - i] = (out[0] * out[1]) % n
out[i] = (out[i] ** 2) % n
return out[0]
Cependant, cet apprenti, qui est aussi oreille d’or, s’est aperçu d’une différence sonore. Pour cela, il a ralenti au minimum la vitesse de calcul de la tablette et enregistré les sons émis par la tablette lors d’une signature cryptographique. Réussirez-vous, comme lui, à retrouver les secrets RSA en utilisant cet enregistrement ?
Prouvez-le en calculant le SHA256 de la signature du fichier audio contenant l’enregistrement que vous venez d’analyser. Le flag pourra être calculé ainsi :
import hashlib
f = open('public/RSA.wav', 'rb')
raw = bytearray(f.read())
m = hashlib.sha256(raw).digest()
m = int.from_bytes(m, byteorder = 'big', signed = False)
sig = pow(m, d, n)
flag = hashlib.sha256(sig.to_bytes(128, byteorder = "big")).digest()
print(f"FCSC{{{flag.hex()}}}")
Fichiers
-
ANSSI_ref.png
241.62 KiB – 9bb8cd76365a5fbca814c6a0817752bd6337bd892f70b6b09f6147a398fec6ed -
RSA.wav
5.29 MiB – 53e2d4d94c963e7f9fa546dc4117ff386c9390998ac2a78dbf59e506e311e219
Auteur
Flag
Soumettez votre solution
Vous pouvez envoyer votre solution rédigée pour cette épreuve. La FAQ contient la marche à suivre.
Vous avez besoin d'être identifié(e) pour soumettre une solution.
Solutions
Il n'y a pas encore de solutions pour cette épreuve, mais vous pouvez soumettre la vôtre après avoir trouvé le flag.