RSA Cracker
TAG -> Artículos
La Importancia de Crear Claves Públicas Robusta en el Mundo de la Ciberseguridad
En el mundo del hacking ofensivo y la ciberseguridad, las llaves públicas juegan un papel crucial en la protección de la información y la verificación de la autenticidad de los mensajes. Ya sea que estés realizando un análisis forense o una prueba de penetración, entender cómo generar, usar y proteger adecuadamente estas llaves es esencial para un trabajo exitoso.
A lo largo de este artículo, exploraremos la importancia de generar llaves públicas robustas, cómo puedes cifrar archivos de manera segura usando OpenSSL y qué sucede cuando intentas decifrar la información cifrada.
🔐 1. ¿Qué es una clave pública?
Una clave pública es un componente esencial en los algoritmos de cifrado como RSA. Se utiliza para cifrar datos que solo podrán ser descifrados con la clave privada correspondiente. Aunque la clave pública es accesible para todos, su fortaleza depende de la robustez de su longitud y de los factores matemáticos que la componen.
¿Por qué es importante crear una clave pública robusta?
La seguridad de la clave pública depende directamente de la complejidad y tamaño de su módulo
n(producto de dos números primos grandes).Una clave débil (es decir, con un módulo pequeño o con factores conocidos) puede ser fácilmente comprometida, lo que facilita el acceso a la información cifrada y permite ataques de tipo factorización.
🛠️ 2. ¿Cómo se crean claves RSA con ssh-keygen? ¿Y por qué son tan seguras?
ssh-keygen? ¿Y por qué son tan seguras?Una de las formas más comunes y prácticas de generar claves RSA en sistemas UNIX/Linux es con el comando ssh-keygen. Este comando se usa ampliamente tanto para autenticación SSH como para otras tareas criptográficas.
🧬 ¿Qué pasa "detrás de cámaras"?
Cuando ejecutamos ssh-keygen, se genera:
Dos números primos grandes
pyq.Se calcula su producto
n = p * q, que se convierte en el módulo RSA.Se escoge un exponente público
e, generalmente65537.Luego se calcula el exponente privado
d, que es la clave privada, usando la inversa modular.
🔐 Generar una clave RSA con ssh-keygen
Resultado

📌 Esto creará:
rsa_key→ clave privadarsa_key.pub→ clave pública
La opción -b 4096 genera una clave de 4096 bits, lo que significa que el valor n tiene 4096 bits (¡más de 1200 dígitos decimales!).
🔍 ¿Por qué es segura una clave RSA?
👉 Porque factorizar n es muy difícil:
nse forma multiplicando dos primos enormes.Si alguien quiere obtener la clave privada, tendría que factorizar
n(es decir, hallarpyq), lo cual es computacionalmente inviable sines lo suficientemente grande.
⏱️ Incluso con supercomputadoras modernas, factorizar un número de 2048 o 4096 bits llevaría siglos usando fuerza bruta.
🧪 Script: Visualizando los valores de una clave RSA
Aquí te dejo un script en Python que usa pycryptodome para leer una clave pública y mostrar:
El módulo
n(base de seguridad RSA)El exponente público
eEl número de bits de
n
visualizar_clave_rsa.py
Resultado

📌 ¿Qué debes notar?
🔍 El módulo n se ve así (extracto real de una clave de 4096 bits):
¡Un solo número! Pero tan grande que si lo intentaras factorizar con fuerza bruta, necesitarías más años de los que tiene el universo conocido. 🤯
✅ Usar ssh-keygen con al menos 2048 o 4096 bits es una de las formas más sencillas y confiables de generar claves RSA seguras.
⚔️ En pruebas de hacking ofensivo, si encuentras una clave débil con menos de 2048 bits, podrías extraer la clave privada y comprometer el sistema.
Ejemplo

🔨 3. Usando OpenSSL para Cifrar y Descifrar Archivos 🖥️
En el siguiente ejemplo, utilizamos OpenSSL para generar una clave pública robusta, cifrar un archivo y luego descifrarlo usando la clave privada. A continuación, verás cómo puedes realizar estos procesos y cómo entender cada paso.
🔑 Generando las Claves con OpenSSL
Para empezar, necesitamos generar un par de claves públicas y privadas con OpenSSL:
Resultado

Aquí generamos una clave privada (private.key) usando el algoritmo RSA y luego extraemos la clave pública (public.key) de esa clave privada.
Paso 1: Crea un archivo de texto
Imagina que tienes un archivo de texto llamado archivo.txt que quieres cifrar. Este archivo podría contener cualquier información, como:
Crear

Paso 2: Cifrado con la llave pública
Para cifrar el archivo usando una clave pública, primero necesitas tener la clave pública en un archivo. Suponiendo que ya tienes la clave pública (por ejemplo, public.key), puedes usar el siguiente comando en OpenSSL para cifrar el archivo:
Explicación:
pkeyutl: Es el comando de OpenSSL para operaciones de RSA (cifrado/descifrado).-encrypt: Indica que la operación es un cifrado.-inkey public.key: Especifica el archivo que contiene la clave pública.-pubin: Le indica a OpenSSL que la clave es una clave pública.-in archivo.txt: Especifica el archivo de entrada que contiene el mensaje.-out archivo_cifrado.bin: Especifica el archivo de salida que contendrá el texto cifrado.
Resultado

Como podemos ver, el contenido cifrado es imposible de entender al menos que se usa la clave privada para descifrarlo, borremos el archivo original y sigamos:
Paso 3: Descifrar el archivo con la llave privada
Para descifrar el archivo que cifraste previamente (archivo_cifrado.bin), puedes usar el siguiente comando en OpenSSL:
Explicación:
pkeyutl: Es el comando de OpenSSL para operaciones de RSA (cifrado/descifrado).-decrypt: Indica que la operación es un descifrado.-inkey private.key: Especifica el archivo que contiene la clave privada.-in archivo_cifrado.bin: Especifica el archivo de entrada que contiene el texto cifrado.-out archivo_descifrado.txt: Especifica el archivo de salida que contendrá el mensaje descifrado.
Paso 4: Ver el archivo descifrado
Después de ejecutar el comando anterior, tendrás el archivo archivo_descifrado.txt con el contenido original, por ejemplo:
Resultado

Resumen de los comandos
Cifrado (usando la clave pública):
Descifrado (usando la clave privada):
Consideraciones
RSA en OpenSSL es adecuado para cifrar pequeños bloques de datos, ya que el tamaño máximo de datos que puedes cifrar depende del tamaño de la clave. Si los datos a cifrar son demasiado grandes, normalmente se utiliza un enfoque híbrido (combinando RSA con AES para cifrar grandes cantidades de datos).
Si el archivo es grande, es recomendable cifrar solo una clave simétrica (como AES) con RSA, y luego usar esa clave para cifrar el archivo completo con AES. Sin embargo, para archivos pequeños o sencillos, RSA es suficiente.
🔓 Qué pasa si usas una clave débil? ⚠️
Si alguna de las claves que generas es débil (por ejemplo, si eliges números primos pequeños), el proceso de cifrado y descifrado puede ser fácilmente vulnerado por un atacante. Un atacante podría factorizar el módulo n para obtener los valores p y q, lo que le permitiría calcular la clave privada d y descifrar el contenido cifrado.
🛠️ 4. Crypto Challenge - HackTheBox - Brevi Moduli
Código del challenge server.py:
La debilidad clave es:
El tamaño de los primos (
getPrime(110)):Primos de 110 bits → módulo RSA
nde ~220 bits.Este tamaño es ridículamente pequeño para los estándares modernos (se recomienda mínimo 2048 bits para seguridad).
Esto hace que
n = p * qpueda factorizarse fácilmente con Sage o incluso consympy.factorint()en segundos.
Llave pública completa se revela:
Se muestra en cada ronda:
nye.Si puedes factorizar
n, puedes calcularφ(n) = (p-1)(q-1)y la clave privada.
Validación directa del reto:
El servidor te pide que envíes
pyqdirectamente.Solo necesitas factorizar
npara superarlo.
🧠 ¿Qué necesitas hacer?
Extraer
ndel contenido de la llave pública.Factorizar
nusando Sage.Enviar
pyqde vuelta al servidor.
Crear una llave privada en base a una llave pública insegura.
Vamos a tomar este challenge para repasar lo aprendido, primero veamos que pasa si ejecutamos el script server.py:
Resultado

Inspeccionando el código y ya viendo el resultado de ejecutar el archivo server.py, podemos notar que el script nos da una llave pública y luego nos pide los valores de p y q, entonces en este primer paso, vamos a copiar esa llave publica insegura y guardarla en public.key, para trabajar sobre esa llave, luego usando openssl cifraremos el contenido de archivo.txt con esa llave insegura y veremos como construir paso a paso una llave privada en base a una llave publica insegura:

El siguiente paso es cifrar el archivo con openssl y borrar el original:

Ahora, ¿Cómo logramos descifrar ese archivo_cifrado.bin si solo tenemos la llave publica?, pues primero veamos un poco de teoría sobre el significado y el papel de cada uno de los valores que usaremos para construir la llave privada.
Significado y el papel de cada uno de los valores que usaremos y cómo se obtienen
Estos valores están relacionados con el funcionamiento del sistema de cifrado RSA.
1. Valor de n:
n:Significado:
nes el módulo de la clave RSA. Es el producto de dos números primos grandes,pyq.Obtención: El valor de
nse obtiene directamente de la clave pública. Es parte de la información que viene incluida en la clave pública y se utiliza tanto para cifrar como para verificar la autenticidad de un mensaje.Uso:
nes usado en las operaciones matemáticas RSA (cifrado, descifrado, firma, verificación) y es la base del sistema de seguridad de RSA. Es un número muy grande, que asegura que el sistema sea seguro, ya que factorizarlo para encontrarpyqes computacionalmente difícil.
2. Valor de e:
e:Significado:
ees el exponente público. Es un número utilizado en el proceso de cifrado. A menudo, se elige un valor pequeño y bien conocido parae, típicamente 65537.Obtención: El valor de
ese obtiene directamente de la clave pública.Uso:
ese utiliza en el proceso de cifrado RSA. Para cifrar un mensaje, se eleva el mensaje a la potenciaey luego se toma el residuo cuando se divide entren. Es un número público y no se debe mantener en secreto.
3. Valor de p:
p:Significado:
pes uno de los dos números primos utilizados en la generación de la clave RSA. Junto conq, se utiliza para calcularnyphi(n).Obtención:
pes obtenido al factorizar el valor den. Dado quenes el producto depyq, al factorizarn, se pueden obtener ambos valores.Uso:
pes privado y se mantiene en secreto. Junto conq, se utiliza para calcularphi(n)y la clave privada.
4. Valor de q:
q:Significado:
qes el otro número primo utilizado en la generación de la clave RSA. Junto conp, es utilizado para calcularnyphi(n).Obtención:
qtambién se obtiene al factorizar el valor den. Después de factorizarn, se obtienepyq.Uso: Al igual que
p,qes privado y se utiliza para calcularphi(n)y la clave privada.
5. Valor de phi(n) o φ(n):
phi(n) o φ(n):Significado:
phi(n)es la función totiente de Euler den. Representa la cantidad de enteros positivos menores quenque son coprimos conn. Se calcula como:
Obtención: Se obtiene al calcular el producto de
(p - 1)y(q - 1), dondepyqson los factores primos den.Uso:
phi(n)es utilizado para calcular la clave privadad. Este valor es fundamental para el algoritmo RSA, ya que la clave privadadse calcula usandophi(n).
6. Valor de d:
d:Significado:
des el exponente privado de la clave RSA. Es el valor que se utiliza en el proceso de descifrado, y su cálculo es un paso esencial en la generación de la clave privada.Obtención:
dse obtiene como el inverso multiplicativo deemódulophi(n). Es decir,des el valor tal que:
Esto se puede calcular utilizando el algoritmo de Euclides extendido (lo que se logra con la función inverse_mod).
Uso:
dse utiliza en el proceso de descifrado. Cuando se recibe un mensaje cifrado, se descifra usando la clave privadadjunto conn(el módulo).
7. Llave privada completa:
Significado: La clave privada es el conjunto de valores que incluye
n,e, yd(junto conpyqsi es necesario para la optimización). La clave privada se utiliza para descifrar los mensajes que fueron cifrados con la clave pública.Obtención: La clave privada se construye a partir de los valores
n,e,d,p, yq, usando la funciónRSA_Crypto.construct.Uso: La clave privada es necesaria para descifrar mensajes y firmar datos. Es crucial que esta clave se mantenga en secreto para garantizar la seguridad del sistema RSA.
📜 Script para factorizar una llave pública (archivo .key) con Sage y mostrar sus valores.
.key) con Sage y mostrar sus valores.Ahora que ya hemos visto toda la teoría e creado el siguiente código en este caso llamado solver_1.py el cual puede extraer los valores necesarios de una llave publica para crear su llave privada, siempre y cuando la llave publica sea vulnerable, el contenido del código seria el siguiente:
Cabe resaltar que usaremos SageMath (o simplemente Sage) que es un sistema de matemáticas computacionales de código abierto que combina herramientas como Python, álgebra, teoría de números, criptografía, cálculo simbólico y más. Es muy usado en matemáticas puras, criptografía y álgebra computacional.
🔧 Instalación rápida:
✅ En Debian/Ubuntu/Parrot:
✅ En Arch/Manjaro:
También puedes usarlo online en: https://sagecell.sagemath.org o instalarlo vía conda.
Ahora si veamos como nuestro código resuelve este primer reto por decirlo así:
Resultado

Perfecto, nuestro código pudo construir la llave privada correspondiente a la llave publica que nos genero el script server.py, ahora veamos si podemos descifrar el archivo que tenemos:

Y efectivamente hemos logrado descifrar el mensaje que previamente habíamos cifrado con una clave publica insegura, logrando así crear su correspondiente llave privada con nuestro script usando SageMath.
✅ Versión de solver_2.py que ejecuta y resuelve server.py automáticamente:
solver_2.py que ejecuta y resuelve server.py automáticamente:Este script:
Ejecuta
server.pycomo un subproceso.Detecta el bloque con la clave pública.
Extrae
n, lo factoriza con Sage.Envia los primos
pyqcomo respuestas.
🔧 Requisitos
Asegúrate de tener instalado pexpect:
Y que el script server.py esté en el mismo directorio y sea ejecutable por python3.
🧪 ¿Cómo ejecutarlo?
El script automáticamente:
Lanza
server.pyDetecta cada ronda
Extrae
nFactoriza
Envía
pyqAl final, imprime la flag.
Resultado

Challenge resuelto.
🧩 5. La Importancia de Usar Claves Fuertes en el Hacking Ofensivo 💡
Cuando realizas pruebas de penetración o ataques de hacking ético, una de tus primeras metas es garantizar que los sistemas que estás probando utilizan claves públicas lo suficientemente robustas para proteger la información sensible.
Consejos para fortalecer tus claves públicas:
Tamaño de la clave: Asegúrate de que la clave RSA tenga al menos 2048 bits. No uses claves de 1024 bits, ya que son vulnerables a ataques de factorizar el módulo
nen un tiempo razonable.Utiliza generadores de números primos seguros: Elige generadores de números primos robustos y verifica que no existan vulnerabilidades en el algoritmo que utilices para generarlos.
Cambiar regularmente las claves: Asegúrate de cambiar las claves periódicamente y revocar aquellas que ya no sean necesarias o que puedan haber sido comprometidas.
Last updated