Como proteger tus comunicaciones mediante criptografía asimétrica

Supongamos que Alicia quiere enviarle un mensaje a Juan. Primero, Juan generará un par de claves y le envía su clave pública a Alicia (esta clave puede viajar de forma pública y por canales inseguros, ya que no es crítica). Alicia usa la clave pública de Juan para cifrar un mensaje y enviárselo. Entonces Juan recibe el mensaje y con su clave privada puede descifrarlo y leerlo. Aunque un tercero interceptara las comunicaciones y lograra obtener el mensaje cifrado o incluso la clave pública, no podría descifrarlo sin la clave privada que solo posee Juan.
Piénsalo como que la clave pública es un candado, y la clave privada es la llave que lo abre: Juan le da el candado a Alicia, Alicia esconde el mensaje en una caja y lo cierra con el candado, luego Juan es el único que puede abrirlo.
PGP y GPG
PGP (Pretty Good Privacy) fue creado en 1991 como un programa de cifrado de clave pública para proteger comunicaciones (inicialmente correo electrónico). PGP se hizo muy popular al ser de las primeras herramientas de criptografía disponibles al público general. Posteriormente se convirtió en un producto comercial, sin embargo sentó las bases del estándar OpenGPG, una especificación abierta para garantizar interoperabilidad de sistemas de cifrado de clave pública.
GPG (GNU Privacy Guard) es la implementación libre del estándar OpenGPG. Es una reimplementación de PGP completamente de código abierto, mantenida por la comunidad del proyecto GNU. GPG ofrece la misma funcionalidad, con mejoras, soportando múltiples algoritmos de cifrado modernos (RSA, ElGamal, AES, 3DES, Twofish, SHA-1, SHA-256…).
En resumen: PGP y GPG hacen lo mismo (cifrado asimétrico y firmas digitales). La diferencia es histórica y de licencias.
Instalación y configuración
Primero lo instalamos:
$ apt install gnupg -y # Linux (Debian/Ubuntu)
$ brew install gnupg # macOS
Crear un par de claves:
$ gpg --full-generate-key
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
...
Your selection? 1
Elegir tamaño (recomendado: 4096 bits):
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Elegir expiración:
Key is valid for? (0) 1w
Introducir nombre y correo:
Real name: Jose Alberto
Email address: josealberto@gmail.com
Comment: comentario
Listar claves:
$ gpg --list-keys
Distribución de clave
Ahora veremos las formas de exportación y distribución de nuestras claves una vez creadas.
Ejemplo de exportación:
$ gpg --export --armor <fingerprint> > clave.asc
$ gpg --export-secret-keys <fingerprint> > privada.asc
Subir clave a un servidor:
$ gpg --keyserver keys.openpgp.org --send-keys CLAVE_ID
Recibir clave:
$ gpg --keyserver keys.openpgp.org --recv-keys CLAVE_ID
Importar clave pública de un amigo:
$ gpg --import colega.asc
Cifrar y descifrar un documento:
$ gpg --output doc.gpg --encrypt --recipient colega@ejemplo.com documento
$ gpg --decrypt doc.gpg
Firma digital
Firmar:
$ gpg --output doc.gpg --sign documento
Firma separada en ASCII:
$ gpg --output aviso.txt --clearsign aviso.txt
Verificar:
$ gpg --verify aviso.txt