Crack the Power PicoCTF (Intermediate)
Contexto de la maquina
Trayectoria Crack the Power

Descripción
Crack the Power es un reto de criptografía enfocado en la explotación de una implementación insegura del algoritmo RSA. El desafío consiste en analizar un mensaje cifrado proporcionado junto con sus parámetros criptográficos y aplicar técnicas matemáticas para recuperar el mensaje original.
Objetivo del reto
Descifrar un mensaje cifrado mediante RSA y obtener la flag final sin factorizar el módulo, aprovechando debilidades en la elección de los parámetros criptográficos.
Tipo de reto
Criptografía
RSA
Ataques matemáticos
Habilidades y técnicas evaluadas
Comprensión del funcionamiento de RSA
Identificación de configuraciones criptográficas inseguras
Aplicación de ataques de exponente público pequeño
Uso de herramientas matemáticas en Python
Conversión de enteros a datos ASCII
Análisis de vulnerabilidades

Despliegue del CTF
Dentro de la propia página del reto, localizaremos el CTF. Al acceder a él, encontraremos un enlace que nos permitirá descargar un archivo que contiene un mensaje cifrado. Además, se nos proporciona una breve descripción con información relevante sobre el reto.
El objetivo principal de este tipo de CTFs es analizar la información proporcionada hasta conseguir obtener la flag final.
Decode message.txt
message.txt
Nos proporcionan la siguiente descripción:
La descripción indica que se ha interceptado un mensaje cifrado y que el módulo RSA está construido con números primos suficientemente grandes como para que la factorización no sea viable. Esto sugiere que tendremos que buscar una alternativa criptográfica para recuperar el mensaje.
Procedemos a descargar el archivo:
Una vez descargado, al inspeccionar el contenido observamos lo siguiente:
Podemos observar que nos proporcionan los parámetros típicos de un sistema criptográfico RSA.
RSA
Se nos han proporcionado los siguientes valores:
n → Módulo RSA (producto de dos números primos grandes).
e = 20 → Exponente público.
c → Ciphertext (mensaje cifrado).
El funcionamiento clásico de RSA se define mediante:
Para descifrar el mensaje normalmente necesitaríamos la clave privada d, la cual satisface:
donde:
siendo p y q los factores primos de n.
Observación crítica: exponente público pequeño
En este caso, el valor de e = 20 es relativamente pequeño para un sistema RSA. Aunque valores pequeños pueden usarse, también pueden introducir vulnerabilidades si el mensaje original m es suficientemente pequeño en comparación con n.
Si se cumple la condición:
entonces el módulo deja de tener efecto y se cumple directamente:
Esto implica que el cifrado puede romperse sin necesidad de factorizar n. Bastaría con calcular la raíz e-ésima entera del ciphertext para recuperar el mensaje original.
Obtención del mensaje mediante raíz entera
Para calcular dicha raíz, podemos crear un pequeño script en Python utilizando la librería gmpy2, que permite trabajar con números enteros de gran tamaño de forma eficiente.
decodeRootMessage.py
Ejecución:
Respuesta:
Este valor representa el mensaje original en formato numérico.
Conversión del mensaje numérico a texto legible
En este tipo de retos, es habitual que el mensaje original esté codificado como un entero que representa una secuencia de bytes ASCII. Para convertirlo a texto plano, utilizaremos el siguiente script:
decodeMessagePlainText.py
Ejecución
Respuesta:
Con esto comprobamos que el ataque ha sido exitoso, logrando recuperar el mensaje original sin necesidad de factorizar el módulo RSA.
flag.txt
Last updated