Skip to content

[Actualizado a 24 de septiembre de 2026]

Ejercicio de cifrado asimétrico

Esta es la guía paso a paso para realizar la práctica de Cifrado Asimétrico (RSA) con OpenSSL y comunicación vía Netcat en Ubuntu Linux.

Requisitos previos en ambos equipos (A y B)

  • netcat
  • openssl

Nota sobre el puerto 80: Para evitar el uso de puertos reservados (y por tanto permisos de root, emplearemos el puerto 8080 para las comunicaciones, por lo que deberemos crear una regla en el firewall de AWS.

La regla del firewall la crearemos de entrada, tcp, puerto 8080 de destino y sólo para la IP del instituto.

Para averigura la IP del instituto podemos usar el comando curl ifconfig.me o curl myip.wtf.

Paso 1: Generación de claves (Ambos alumnos)

Cada alumno genera en su máquina su par de llaves RSA (privada y pública):

Alumno A:

# Genera la llave privada
openssl genpkey -algorithm RSA -out privada_A.pem -pkeyopt rsa_keygen_bits:2048

# Extrae la llave pública
openssl pkey -in privada_A.pem -pubout -out publica_A.pem

Alumno B:

# Genera la llave privada
openssl genpkey -algorithm RSA -out privada_B.pem -pkeyopt rsa_keygen_bits:2048

# Extrae la llave pública
openssl pkey -in privada_B.pem -pubout -out publica_B.pem

Paso 2: Intercambio inicial de llaves públicas

Antes de enviar mensajes secretos, deben intercambiar sus llaves públicas por Netcat.

  1. Alumno B se pone en escucha:
nc -l -p 8080 > publica_A.pem

  1. Alumno A le envía su llave pública:
nc <IP_DE_B> 8080 < publica_A.pem

  1. Ahora al revés (Alumno A se pone en escucha):
nc -l -p 8080 > publica_B.pem

  1. Alumno B le envía su llave pública:
nc <IP_DE_A> 8080 < publica_B.pem

Paso 3: Alumno A envía mensaje cifrado a Alumno B

1. Alumno A cifra el mensaje con la llave pública de B

# 1. Crear el mensaje de texto plano
echo "Hola B, este mensaje es confidencial." > mensaje1.txt

# 2. Cifrar con la llave pública de B
openssl pkeyutl -encrypt -inkey publica_B.pem -pubin -in mensaje1.txt -out mensaje1.enc

2. Transmisión vía Netcat (Puerto 8080)

2.1. Alumno B abre el puerto 8080 para recibir:

nc -l -p 8080 > mensaje1.enc

2.2. Alumno A envía el archivo cifrado:

nc <IP_DE_B> 8080 < mensaje1.enc

3. Alumno B descifra el mensaje con su llave privada

openssl pkeyutl -decrypt -inkey privada_B.pem -in mensaje1.enc -out mensaje1_descifrado.txt

# Ver el texto original
cat mensaje1_descifrado.txt

Paso 4: Alumno B responde cifrado a Alumno A

1. Alumno B cifra la respuesta con la llave pública de A

# 1. Crear la respuesta
echo "Recibido A, tu mensaje está seguro conmigo." > respuesta1.txt

# 2. Cifrar con la llave pública de A
openssl pkeyutl -encrypt -inkey publica_A.pem -pubin -in respuesta1.txt -out respuesta1.enc

2. Transmisión vía Netcat (Puerto 80)

2.1. Alumno A abre el puerto 8080 para recibir:

nc -l -p 8080 > respuesta1.enc

2.2. Alumno B envía el archivo cifrado:

nc <IP_DE_A> 8080 < respuesta1.enc

3. Alumno A descifra la respuesta con su llave privada

openssl pkeyutl -decrypt -inkey privada_A.pem -in respuesta1.enc -out respuesta1_descifrada.txt

# Ver la respuesta
cat respuesta1_descifrada.txt