On remarque dans le code fourni, que l’algorithme utilisé ressemble à du RSA, mais au lieu d’utiliser p
et q
premiers, il génère directement n
premier.
Le chiffrement RSA fonctionne comme cela :
- On choisit deux nombres premiers
p
etq
. - Leur produit
n = p * q
est le module de chiffrement. phi(n) = (p - 1) × (q - 1)
.- On choisit
e
(dans notre case = 2 ** 16 + 1
). - L’exposant de déchiffrement
d
est l’inverse dee
modulophi(n)
. - On retrouve le message par :
pow(ciphertext, d, n)
.
Pour déchiffrer le message, il faut calculer phi(n) = (p-1) * (q-1)
or, nous n’avons pas p
et q
.
Si l’on choisit p = n
et q = 1
, on se retrouve avec phi(n) = 0
.
Comme phi(n)
représente le nombre d’entiers premiers avec n
et que n
est premier, on trouve phi(n) = n-1
.
On peut alors déchiffrer :
def rsa_decrypt(ciphertext, p, q, e):
n = p * q
phi = n - 1
# Calculate the private exponent d
d = pow(e, -1, phi)
# Decrypt the message
plaintext = pow(ciphertext, d, n)
return long_to_bytes(plaintext)
print(rsa_decrypt(c, n, 1, e))
# Output: b'FCSC{d0bf88291bcd488f28a809c9ae79d53da9caefc85b3790f57615e61c70a45f3c}'