Seguridad

Cifrado asimétrico con GPG en Linux – Tutorial con ejemplos

En un post anterior vimos cómo usar gpg en Linux para cifrar datos, pero utilizamos un cifrado simétrico.

Hoy, en cambio, vamos a cifrar de manera asimétrica usando GPG. Veremos cómo:

  • Generar un par de claves públicas y privadas
  • Exportar la clave pública para que otras personas puedan cifrar archivos con nuestra clave y solo nosotros podamos descifrarlos
  • Importar clave pública de otra persona y cifrar datos con la misma
  • Desencriptar un archivo con nuestra clave privada

Nota: voy a usar la palabra encriptar y cifrar como sinónimos, así como desencriptar y descifrar.

Generar clave pública y privada

Para generar un par de claves ejecuta el siguiente comando en una terminal:

gpg --full-generate-key

Como en la imagen:

1 – Generar claves con GPG

Al ejecutar el comando aparecerá un asistente. Puedes ver mis elecciones resaltadas.

En el primer caso selecciono 1, RSA y RSA

Quiero que la longitud de mi clave sea de 4096 bits

La validez de la clave es de 20 años (20y); si no se desea que caduque se escribe un 0. También son válidos los valores como 50 (50 días), 53w (53 semanas) 15m (15 meses), etcétera

En el apartado del identificador hay que poner datos reales o que vayamos a recordar. Lo más importante es el correo electrónico, pues así nos van a identificar los demás usuarios cuando importen nuestra clave.

Después pregunta si todo está bien, en caso de que sí, escribimos V. Si queremos cambiar el nombre escribimos N, y así por cada opción.

En uno de estos paso nos pedirá la frase de paso o passphrase. Esa es la contraseña que vas a usar para desencriptar, asegúrate de que sea totalmente segura, no la olvides y no la compartas con nadie.

Entropía

Como la generación de la clave debe ser totalmente aleatoria, gpg va a obtener datos realmente aleatorios como la temperatura del CPU o la velocidad del disco; es decir, que no provengan del tiempo o de algo que pueda ser calculado más tarde.

Por eso es que se nos pide hacer acciones mientras se genera la clave, así que debemos abrir otra terminal, navegar en la web un poco, eliminar algunos archivos, etcétera.

Cuando haya suficiente entropía para la longitud de la clave que seleccionamos, las clave serán generadas:

2 – Terminando de generar clave y entropía

No te preocupes, las claves se guardaron automáticamente.

Nota: recuerda que tu clave privada, como su nombre lo dice, es privada, y no debes compartirla con nadie ni exportarla, al menos que vayas a mudarte a otra computadora.

Exportar la clave pública

Ya tenemos nuestro par de claves y ahora queremos que nuestros amigos nos envíen archivos y datos cifrados con la misma, así que, ¿cómo la exportamos?

Muy fácil. Ejecuta el siguiente comando:

gpg -a --export contacto@parzibyte.me > parzibyte.gpg.asc

Obviamente cambiando tus datos y tu correo. Te explico el comando…

La opción -a es para que la salida sea ASCII, no en formato binario. La opción --export es para exportar, y le indicamos el correo o identificador del dueño de la clave pública.

Después redireccionamos la salida a un archivo llamado parzibyte.gpg.asc cuyo contenido podemos ver y compartir libremente.

3 – Exportar clave pública en formato ascii

Aquí dejo mi clave pública por si quieres importarla (recuerda usarla antes del 2039):

-----BEGIN PGP PUBLIC KEY BLOCK-----

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
=hJev
-----END PGP PUBLIC KEY BLOCK-----

Con esta clave, cualquier persona puede cifrar un documento o archivo (abajo veremos cómo) y enviarnos el resultado, el cual solo nosotros (poseedores de la clave privada) podemos desencriptar.

Importar clave de otro usuario

Si otro usuario nos envía su clave pública (o si queremos mostrarle a alguien cómo se importa nuestra clave que acabamos de exportar) la manera de importarla es fácil.

gpg --import nombreDeArchivo

En mi caso:

gpg --import aldair.gpg.key.asc

Si tú vas a importar la clave que acabo de exportar:

gpg --import parzibyte.gpg.asc

Se debe mostrar una confirmación:

4 – Importar clave de otro usuario

Ahora podemos cifrar mensajes con la clave pública de ese usuario, y solo él podrá descifrarlos.

Cifrar archivo de manera asimétrica

Ya sea que otro usuario va a cifrar un archivo con nuestra clave, o nosotros con la que acabamos de exportar, el comando es:

gpg -a -r correo.del.destinatario@asd.com --encrypt nombreDelArchivo

En mi caso es:

gpg -a -r alda@hotmail.com --encrypt secreto.txt

De nuevo, si lo estás haciendo con mi clave, sería:

gpg -a -r contacto@parzibyte.me --encrypt tuArchivo

GPG va a pedir confirmación por la identidad del usuario.

Te explico el comando. La opción -a es para que la salida sea en ascii, si quieres puedes omitir ese parámetro. Y la -r es del destinatario, que en este caso es el que tiene su correo en alda@hotmail.com

Finalmente --encrypt es para encriptar un archivo.

5 – Encriptar archivo con clave pública externa

Por cierto, se creará un archivo encriptado con el mismo nombre pero distinta extensión. Ese archivo se lo puedes enviar al dueño de la clave pública y solo él podrá descifrarlo.

Cifrar archivo con nuestra propia clave

Esto tiene poco sentido, pero si no tenemos con quién probar viene de maravilla. Podemos cifrar con nuestra propia clave así:

gpg -a -r tu_correo@dominio.com --encrypt nombreDeArchivo

Es decir, cifras con tu propia clave que registraste.

6 – Encriptar mensaje con nuestra clave pública

En la imagen puedes ver una demostración. Primero creo un archivo de texto y luego lo cifro (en realidad se pueden cifrar todo tipo de archivos, no solo los de texto)

Eso va a crear un archivo con el mismo nombre pero con extensión asc. Y al mostrarlo vemos los datos cifrados que solamente el poseedor de la clave privada podrá ver.

Descifrar archivos

Para terminar, veamos cómo se descifran los archivos. Recuerda que solo podemos descifrar aquellos archivos que fueron cifrados por nuestra clave pública.

El comando es:

gpg -a --decrypt archivoEncriptado > archivoDesencriptado

En mi caso voy a descifrar el mismo que cifré con mi clave:

gpg -a --decrypt secreto.txt.asc > desencriptado.txt

En un paso de estos el programa va a solicitar la frase de paso que pusimos cuando generamos el par de claves.

La explicación del comando es casi la misma. La opción -a es por si se cifró con ascii. Después hacemos un redireccionamiento.

7 – Desencriptar archivo con nuestra clave privada

En la imagen se observa que pude desencriptar el archivo exitosamente.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Hola genial el tutorial pero una consulta hay foma de evitar la frase de paso? tanto en generarla como en descriptar entiendo que le da el plus de seguridad pero no le veo sentido.
    si en caso deseo encriptar y desencriptar sin esa frase de paso? que recomendación sugiere?
    Gracias saludos!

    • Hola. Me parece que es totalmente posible omitir ese paso, puedes ingresar "nada" cuando te solicite la passphrase
      Saludos :)

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.