Skip to main content

Práctica: Cifrado asimétrico con gpg y openssl

Después de leer este **artículo de cifrado asimetrico **, vamos a realizar los siguientes ejercicios.

1. Generación de claves

1. Genera un par de claves (pública y privada). ¿En que directorio se guarda las claves de un usuario?

  • Las claves se generan con el comando gpg --gen-key y se en el directorio /home/usuario/.gnupg.

2. Lista las claves públicas que tienes en tu almacén de claves. Explica los distintos datos que nos muestra. ¿Cómo deberías haber generado las claves para indicar, por ejemplo, que tenga un 1 mes de validez?

  • Con gpg --list-keys se muestran las claves públicas. También se muestran, en este orden, el ID de la clave, el tipo de clave y su longitud, la fecha de creación y las identidades asociadas (usualmente direcciones de correo electrónico).
  • Si usamos el comando gpg --full-gen-key, se nos harán todas las preguntas, a diferencia de gpg --gen-key. Entre ellas, nos preguntarán el tiempo de validez de la clave.

3. Lista las claves privadas de tu almacén de claves.

  • Esto lo haremos con gpg --list-secret. En mi caso me devolvera:
gpg --list-secret-keys
[keyboxd]
---------
sec ed25519 2023-10-21 [SC] [caduca: 2024-10-20]
123ABCD4567EFG890HIJ1234KLM56789NOPQR012
uid [ absoluta ] David (Clave personal) <david@example.com>
ssb cv25519 2023-10-21 [E] [caduca: 2024-10-20]
  • Ahora veremos que significa cada apartado.

    1. [keyboxd]: Esto es simplemente un encabezado que indica que la siguiente información proviene del demonio de almacenamiento de claves de GPG (keybox daemon).

    2. sec ed25519 2023-10-21 [SC] [caduca: 2024-10-20]:

      • sec: Indica que esta es una clave secreta (o clave privada).
      • ed25519: El tipo de algoritmo utilizado para generar esta clave. Ed25519 es un esquema de firma digital que ofrece una seguridad fuerte y es conocido por ser rápido y eficiente.
      • 2023-10-21: La fecha en que se generó la clave.
      • [SC]: Estas letras indican los usos permitidos de esta clave. 'S' significa firma (Sign), y 'C' significa certificación. La firma se utiliza para firmar digitalmente documentos o correos electrónicos, mientras que la certificación se utiliza para firmar otras claves.
      • [caduca: 2024-10-20]: La fecha de caducidad de la clave. Después de esta fecha, la clave ya no se considera válida.
    3. 123ABCD4567EFG890HIJ1234KLM56789NOPQR012: Este es el ID de la clave, una representación hexadecimal de la misma, que se utiliza para identificarla en operaciones como firmas, encriptación, etc.

    4. uid [ absoluta ] David (Clave personal) <david@example.com>:

      • uid: Identificador de usuario asociado a la clave.
      • [ absoluta ]: Indica el nivel de confianza de esta clave. 'Absoluta' sugiere que tienes total confianza en que esta clave pertenece al usuario especificado.
      • David (Clave personal): El nombre y un comentario adicional que se agregó al crear la clave.
      • <david@example.com>: La dirección de correo electrónico asociada a la clave.
    5. ssb cv25519 2023-10-21 [E] [caduca: 2024-10-20]:

      • ssb: Indica una clave subordinada (o subclave). Las subclaves se pueden usar para tareas específicas.
      • cv25519: El tipo de algoritmo utilizado para la subclave. Curve25519 es conocida por su seguridad y eficiencia en la criptografía de clave pública.
      • 2023-10-21: Fecha de generación de la subclave.
      • [E]: Indica que esta subclave se utiliza para encriptación.
      • [caduca: 2024-10-20]: Fecha de caducidad de la subclave.
    ¿Qué es Keybox?
    1. Almacenamiento de Claves: El keybox es un formato de archivo o una base de datos donde GPG almacena información sobre claves públicas y privadas. Es parte del sistema interno de GPG para organizar y acceder a las claves de manera eficiente.

    2. Formato de Archivo Keybox: En versiones anteriores, GPG utilizaba un conjunto de archivos conocidos como keyrings (anillos de claves) para almacenar las claves.

    3. Beneficios del Formato Keybox:

      • Rendimiento Mejorado: Es más rápido para buscar y acceder a las claves, especialmente útil cuando se trabaja con una gran cantidad de claves.
      • Estructura Organizada: Proporciona una mejor organización interna de las claves.
      • Compatibilidad con Versiones Anteriores: GPG mantiene la compatibilidad con los formatos de keyring antiguos, permitiendo a los usuarios migrar gradualmente a keybox.

2. Importar / exportar clave pública

1. Exporta tu clave pública en formato ASCII y guardalo en un archivo nombre_apellido.asc y envíalo al compañero con el que vas a hacer esta práctica.

  • He creado una clave nueva para las próximas tareas, por lo que los datos no coincidirán con la explicación anterior.

  • Creamos la clave.

    gpg --armor --export A00408A84D6C3F20BE92C5E2AE2B911D20ABB2A6 > david_rodriguez.asc
    Uso de armor y dearmor

    En las nuevas versiones de GPG (GNU Privacy Guard), el uso de los parámetros --armor y --dearmor se relaciona con la necesidad de convertir datos binarios en un formato de texto (ASCII) y viceversa, principalmente por razones de compatibilidad y conveniencia al compartir claves o mensajes.

2. Importa las claves públicas recibidas de vuestro compañero.

  • Importamos la de nuestro compañero.
    gpg --import Descargas/davidrg2.asc
    gpg: clave ACDD90F7CC8753F1: clave pública "davidrg2 (Clave para tareas2) <davidrg2@example.com>" importada
    gpg: Cantidad total procesada: 1
    gpg: importadas: 1

3. Comprueba que las claves se han incluido correctamente en vuestro keyring.

gpg --list-keys
gpg: comprobando base de datos de confianza
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: nivel: 0 validez: 2 firmada: 0 confianza: 0-, 0q, 0n, 0m, 0f, 2u
gpg: siguiente comprobación de base de datos de confianza el: 2024-07-09
[keyboxd]
---------
pub rsa4096 2023-12-12 [SC] [caduca: 2024-07-09]
646718A13FA27CA5804FD10AACDD90F7CC8753F1
uid [desconocida] davidrg2 (Clave para tareas2) <davidrg2@example.com>
sub rsa4096 2023-12-12 [E] [caduca: 2024-07-09]

pub rsa4096 2023-12-12 [SC] [caduca: 2024-07-09]
A00408A84D6C3F20BE92C5E2AE2B911D20ABB2A6
uid [ absoluta ] David Rodriguez Garcia (Clave para tareas) <davidrg@davidrgfoss.com>
sub rsa4096 2023-12-12 [E] [caduca: 2024-07-09]

3. Cifrado asimétrico con claves públicas

1. Cifraremos un archivo cualquiera y lo remitiremos por email a uno de nuestros compañeros que nos proporcionó su clave pública.

gpg --encrypt --recipient 646718A13FA27CA5804FD10AACDD90F7CC8753F1 tarea1.txt
ls tarea1*
tarea1.txt tarea1.txt.gpg

2. Tanto nosotros como nuestro compañero comprobaremos que hemos podido descifrar los mensajes recibidos respectivamente.

gpg --decrypt usuario2.txt.gpg > usuario2.txt
gpg: encrypted with rsa4096 key, ID D7C0FE89A5521F58, created 2023-12-12
"David Rodriguez Garcia (Clave para tareas) <davidrg@davidrgfoss.com>"
cat usuario2.txt
davidrg2 Tarea1

3. Por último, enviaremos el documento cifrado a alguien que no estaba en la lista de destinatarios y comprobaremos que este usuario no podrá descifrar este archivo.

gpg --decrypt usuario2.txt.gpg > usuario2.txt
gpg: encrypted with rsa4096 key, ID 471A145A44FD1D87, created 2023-12-12
"davidrg2 (Clave para tareas2) <davidrg2@example.com>"
gpg: descifrado de la clave pública fallido: No tenemos la clave secreta
gpg: descifrado fallido: No tenemos la clave secreta

4. Para terminar, indica los comandos necesarios para borrar las claves públicas y privadas que posees.

  • Borrar clave publica:

    gpg --delete-key A00408A84D6C3F20BE92C5E2AE2B911D20ABB2A6
  • Borrar clave privada:

    gpg --delete-secret-key A00408A84D6C3F20BE92C5E2AE2B911D20ABB2A6
    Borrar ambas claves

    En las últimas versiones de gpg, al borrar una clave privada, se borra automáticamente la pública. En caso de que nuestra versión no funcione así, podemos usar el comando gpg --delete-secret-and-public-keys.

4. Exportar clave a un servidor público de claves PGP

1. Genera la clave de revocación de tu clave pública para utilizarla en caso de que haya problemas.

gpg --gen-revoke A00408A84D6C3F20BE92C5E2AE2B911D20ABB2A6 > revocacion.asc

sec rsa4096/AE2B911D20ABB2A6 2023-12-12 David Rodriguez Garcia (Clave para tareas) <davidrg@davidrgfoss.com>

¿Crear un certificado de revocación para esta clave? (s/N) s
Por favor elija una razón para la revocación:
0 = No se dio ninguna razón
1 = La clave ha sido comprometida
2 = La clave ha sido reemplazada
3 = La clave ya no está en uso
Q = Cancelar
(Probablemente quería seleccionar 1 aquí)
¿Su decisión? 0
Introduzca una descripción opcional; acábela con una línea vacía:
> Prueba tarea
>
Razón para la revocación: No se dio ninguna razón
Prueba tarea
¿Es correcto? (s/N) s
se fuerza salida con armadura ASCII.
Certificado de revocación creado.

Por favor consérvelo en un medio que pueda esconder; si alguien consigue
acceso a este certificado puede usarlo para inutilizar su clave.
Es inteligente imprimir este certificado y guardarlo en otro lugar, por
si acaso su medio resulta imposible de leer. Pero precaución: ¡el sistema
de impresión de su máquina podría almacenar los datos y hacerlos accesibles
a otras personas!
  • El certificado de revocación es un fichero .asc que, al importarlo a nuestra base de claves, marca esa clave como revocada y especifica el motivo para que no la usemos. En caso de obtener claves de un servidor, podemos usar gpg --refresh-keys para que se actualicen con el servidor por defecto, especificado en /home/usuario/.gnupg/gpg.conf. En caso de que estén revocadas porque se haya subido su certificado de revocación, también se nos indicará. Este comando devolvería algo como esto:
    gpg --refresh-keys
    gpg: renovando 3 claves desde hkps://keyserver.ubuntu.com

2. Exporta tu clave pública al servidor pgp.rediris.es

gpg --keyserver keyserver.ubuntu.com --send-keys A00408A84D6C3F20BE92C5E2AE2B911D20ABB2A6
gpg: enviando clave AE2B911D20ABB2A6 a hkp://keyserver.ubuntu.com

3. Borra la clave pública de alguno de tus compañeros de clase e impórtala ahora del servidor público de rediris.

gpg --delete-keys 646718A13FA27CA5804FD10AACDD90F7CC8753F1
gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub rsa4096/ACDD90F7CC8753F1 2023-12-12 davidrg2 (Clave para tareas2) <davidrg2@example.com>

¿Eliminar esta clave del anillo? (s/N) s
--------------------------------------------------

gpg --keyserver keyserver.ubuntu.com --recv-keys 646718A13FA27CA5804FD10AACDD90F7CC8753F1
gpg: clave ACDD90F7CC8753F1: clave pública "davidrg2 (Clave para tareas2) <davidrg2@example.com>" importada
gpg: Cantidad total procesada: 1
gpg: importadas: 1

5. Cifrado asimétrico con openssl

1. Genera un par de claves (pública y privada).

# Generar clave privada
openssl genrsa -out davidrg1.pem 4096

#Generar clave publica a partir de una privada
openssl rsa -in davidrg1.pem -outform PEM -pubout -out davidrg1_pub.pem
writing RSA key
ls davidrg1*
davidrg1.pem davidrg1_pub.pem

2. Utilizando la clave pública cifra un fichero de texto y envíalo a tu compañero.

openssl pkeyutl -encrypt -inkey davidrg2_pub.pem -pubin -in tarea2.txt -out tarea2_cifrado.txt
  • Aquí, -encrypt indica que se está realizando una operación de cifrado; -in especifica el archivo de entrada, que en este caso es tarea2.txt; -pubin señala que se está utilizando una clave pública; -inkey define el archivo de la clave pública; y -out determina el archivo de salida para el texto cifrado.

    Versiones openssl antiguas

    En el caso de tener una versión de OpenSSL más antigua, en vez de usar el comando pkeyutl, debemos usar rsautl. El resto del comando sería idéntico.

    Motivos para usar pkeyutl:

    • Mejora de la Consistencia y Estandarización: pkeyutl ofrece una interfaz más consistente y estandarizada para las operaciones criptográficas, en comparación con rsautl, que es más específico para RSA.
    • Mayor Flexibilidad y Funcionalidad: pkeyutl puede manejar una gama más amplia de algoritmos y operaciones, lo que lo hace más flexible y potente que rsautl.

3. Tu compañero te ha mandado un fichero cifrado, muestra el proceso para el descifrado.

openssl pkeyutl -decrypt -inkey davidrg1.pem -in tarea1_cifrado.txt -out tarea1_descifrado.txt
cat tarea1_descifrado.txt
hola tarea1