Ron was wrong, Whit is right
2 minutos de lectura
Se nos proporciona el código fuente utilizado para cifrar la flag:
#!/usr/bin/env python
from Crypto.Util import number
flag = open("flag.txt", "rb").read()
m = number.bytes_to_long(flag)
e = 65537
for _ in range(1336):
q = number.getPrime(1024)
p = number.getPrime(1024)
n = p * q
c = pow(m, e, n)
print(f"{n},{c}")
También tenemos el resultado (1336 pares de n
y c
).
Contexto de RSA
Vamos a recordar cómo funciona RSA:
El proceso de descifrado necesita
Realizando el ataque
Esta vez, tenemos muchos módulos
La idea es calcular el Maximo Común Divisor (Greatest Common Divisor, GCD) entre cada par de módulos públicos y mirar si el resultado no es
Flag
Después de programar un script en Python para comprobar lo expuesto anteriormente, podemos descifrar RSA y capturar la flag:
$ python3 solve.py
ictf{bad_prngs_can_cause_collisions_349d}
El script completo se puede encontrar aquí: solve.py
.