331.2 Certificados para Cifrado, Firma y Autenticación

Introducción

Este subtema cubre el uso práctico de la criptografía para proteger datos, verificar identidades y garantizar la integridad de la información. Se centra en GnuPG (GPG) como herramienta principal, junto con conceptos de cifrado simétrico y asimétrico, firmas digitales y S/MIME.

Para el examen: Conoce a fondo los comandos de gpg2 para gestión de claves, cifrado y firma. Entiende la diferencia entre el modelo de confianza de GPG (Web of Trust) y el de PKI (jerárquico).


Cifrado Simétrico vs Asimétrico

Cifrado Simétrico

Utiliza la misma clave para cifrar y descifrar. Es rápido pero requiere compartir la clave de forma segura.

AlgoritmoTamaño de claveNotas
AES-128128 bitsEstándar mínimo actual
AES-256256 bitsRecomendado para alta seguridad
3DES168 bitsObsoleto, evitar
ChaCha20256 bitsAlternativa moderna a AES
# Cifrado simétrico con GPG
gpg2 --symmetric --cipher-algo AES256 archivo.txt
# Genera archivo.txt.gpg - pedirá passphrase
 
# Descifrar
gpg2 --decrypt archivo.txt.gpg > archivo.txt

Cifrado Asimétrico

Utiliza un par de claves: pública (para cifrar) y privada (para descifrar). Más lento pero resuelve el problema de distribución de claves.

AlgoritmoUsoNotas
RSACifrado y firmaEstándar ampliamente usado
DSASolo firmaObsoleto en nuevas implementaciones
ECDSAFirmaCurvas elípticas, más eficiente
Ed25519FirmaCurva Edwards, moderno y seguro
ECDHIntercambio de clavesBasado en curvas elípticas

Para el examen: En la práctica, se usa cifrado asimétrico para intercambiar una clave simétrica de sesión, y luego cifrado simétrico para los datos (cifrado híbrido).


GnuPG (GPG)

Generación de Claves

# Generación interactiva completa
gpg2 --full-generate-key
 
# Generación rápida con valores por defecto
gpg2 --quick-generate-key "Nombre <email@ejemplo.com>" rsa4096
 
# Generar subclaves (para separar usos)
gpg2 --edit-key ID_CLAVE
> addkey

Gestión de Claves

# Listar claves públicas
gpg2 --list-keys
gpg2 -k
 
# Listar claves privadas
gpg2 --list-secret-keys
gpg2 -K
 
# Exportar clave pública
gpg2 --export --armor usuario@ejemplo.com > publica.asc
 
# Exportar clave privada (con cuidado)
gpg2 --export-secret-keys --armor usuario@ejemplo.com > privada.asc
 
# Importar clave
gpg2 --import clave-publica.asc
 
# Eliminar clave pública
gpg2 --delete-keys ID_CLAVE
 
# Eliminar clave privada
gpg2 --delete-secret-keys ID_CLAVE
 
# Ver huella digital (fingerprint)
gpg2 --fingerprint usuario@ejemplo.com

Modelo de Confianza (Web of Trust)

A diferencia de PKI (jerárquico), GPG usa un modelo descentralizado donde los usuarios firman las claves de otros para validar su identidad.

# Firmar clave de otro usuario (certificar identidad)
gpg2 --sign-key usuario@ejemplo.com
 
# Editar nivel de confianza
gpg2 --edit-key usuario@ejemplo.com
> trust

Niveles de confianza del propietario:

NivelSignificado
unknownNo se sabe nada del propietario
noneNo se confía en las firmas del propietario
marginalSe confía parcialmente
fullSe confía completamente
ultimateConfianza absoluta (solo para claves propias)

Para el examen: Una clave se considera válida si está firmada por al menos una clave de confianza “full” o por tres claves de confianza “marginal”.


Cifrado y Descifrado con GPG

# Cifrar para un destinatario (asimétrico)
gpg2 --encrypt --recipient usuario@ejemplo.com archivo.txt
 
# Cifrar para múltiples destinatarios
gpg2 --encrypt -r user1@ej.com -r user2@ej.com archivo.txt
 
# Cifrar con salida ASCII (para email)
gpg2 --encrypt --armor --recipient usuario@ejemplo.com archivo.txt
 
# Descifrar
gpg2 --decrypt archivo.txt.gpg
gpg2 -d archivo.txt.gpg > archivo-descifrado.txt
 
# Cifrado simétrico (con passphrase)
gpg2 --symmetric archivo.txt
gpg2 -c archivo.txt

Firmas Digitales

Las firmas digitales garantizan autenticidad (quién lo firmó) e integridad (que no se ha modificado).

# Firma separada (detached) - no modifica el original
gpg2 --detach-sign archivo.txt
# Genera archivo.txt.sig
 
# Firma separada en ASCII
gpg2 --detach-sign --armor archivo.txt
# Genera archivo.txt.asc
 
# Firma integrada en el archivo (clearsign)
gpg2 --clearsign archivo.txt
# Genera archivo.txt.asc con texto legible + firma
 
# Firma binaria integrada
gpg2 --sign archivo.txt
# Genera archivo.txt.gpg
 
# Firmar y cifrar simultáneamente
gpg2 --sign --encrypt --recipient user@ej.com archivo.txt
 
# Verificar firma
gpg2 --verify archivo.txt.sig archivo.txt
gpg2 --verify archivo.txt.asc

Algoritmos Hash

Los algoritmos hash generan un resumen de longitud fija a partir de datos de cualquier tamaño. Son fundamentales para firmas digitales y verificación de integridad.

AlgoritmoTamaño de salidaEstado
MD5128 bitsRoto, no usar para seguridad
SHA-1160 bitsObsoleto, evitar
SHA-256256 bitsRecomendado
SHA-512512 bitsAlta seguridad
SHA3-256256 bitsÚltima generación
# Calcular hashes con gpg
gpg2 --print-md sha256 archivo.txt
 
# Con herramientas del sistema
sha256sum archivo.txt
sha512sum archivo.txt

Código de Autenticación de Mensajes (MAC/HMAC)

Un MAC combina un hash con una clave secreta para verificar tanto la integridad como la autenticidad del mensaje. HMAC es la implementación más común.

# Generar HMAC con OpenSSL
openssl dgst -sha256 -hmac "clave-secreta" archivo.txt

Servidores de Claves

Los servidores de claves permiten publicar y buscar claves públicas GPG.

# Enviar clave a servidor
gpg2 --keyserver hkps://keys.openpgp.org --send-keys ID_CLAVE
 
# Buscar clave en servidor
gpg2 --keyserver hkps://keys.openpgp.org --search-keys usuario@ejemplo.com
 
# Recibir (descargar) clave de servidor
gpg2 --keyserver hkps://keys.openpgp.org --recv-keys ID_CLAVE
 
# Actualizar claves desde servidor
gpg2 --keyserver hkps://keys.openpgp.org --refresh-keys

Para el examen: El protocolo hkps:// usa HTTPS para la comunicación con servidores de claves. hkp:// es la versión sin cifrar en puerto 11371.


gpg-agent

El gpg-agent es un demonio que cachea passphrases y gestiona claves privadas, evitando tener que introducir la passphrase repetidamente.

# Verificar estado del agente
gpg-connect-agent /bye
 
# Recargar configuración del agente
gpg-connect-agent reloadagent /bye
 
# Configuración en ~/.gnupg/gpg-agent.conf
default-cache-ttl 600       # Cache por 10 minutos
max-cache-ttl 7200           # Máximo 2 horas

S/MIME (Secure/Multipurpose Internet Mail Extensions)

S/MIME usa certificados X.509 (no GPG) para cifrar y firmar correo electrónico.

# Firmar email con S/MIME
openssl smime -sign -in mensaje.txt -signer cert.pem \
  -inkey clave.key -out mensaje-firmado.eml
 
# Verificar firma S/MIME
openssl smime -verify -in mensaje-firmado.eml -CAfile ca.pem
 
# Cifrar email con S/MIME
openssl smime -encrypt -in mensaje.txt \
  -out mensaje-cifrado.eml dest-cert.pem
 
# Descifrar email S/MIME
openssl smime -decrypt -in mensaje-cifrado.eml \
  -recip cert.pem -inkey clave.key
CaracterísticaGPG/OpenPGPS/MIME
Modelo de confianzaWeb of TrustJerárquico (PKI/CA)
Formato de certificadoOpenPGPX.509
Distribución de clavesServidores de clavesCAs comerciales
Soporte en clientes emailRequiere pluginIntegrado nativamente
CosteGratuitoCertificados pueden ser de pago

Archivos de Configuración GPG

~/.gnupg/
├── gpg.conf           # Configuración de GPG
├── gpg-agent.conf     # Configuración del agente
├── pubring.kbx        # Anillo de claves públicas (formato nuevo)
├── trustdb.gpg        # Base de datos de confianza
└── private-keys-v1.d/ # Claves privadas (gestionadas por gpg-agent)

Opciones útiles en ~/.gnupg/gpg.conf:

default-key ID_CLAVE
keyserver hkps://keys.openpgp.org
auto-key-retrieve

Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • Web of Trust vs PKI jerarquico — GPG/OpenPGP usa Web of Trust (descentralizado, los usuarios firman claves entre si); S/MIME usa PKI (jerarquico, las CAs emiten certificados). Nunca confundir los modelos de confianza
  • --clearsign vs --detach-sign vs --sign--clearsign produce texto legible + firma integrada; --detach-sign genera un archivo de firma separado (.sig); --sign genera un archivo binario que combina datos + firma. Confundir el tipo de firma es un error clasico
  • Validez de clave en Web of Trust — una clave se considera valida si esta firmada por al menos 1 clave de confianza “full” O por 3 claves de confianza “marginal”. No confundir “confianza del propietario” (trust) con “validez de la clave” (validity)
  • gpg2 --export vs gpg2 --export-secret-keys--export exporta SOLO la clave publica; --export-secret-keys exporta la clave privada. Sin --armor, la salida es binaria. Exportar la clave privada accidentalmente es un riesgo de seguridad critico
  • Cifrado simetrico vs asimetrico con GPGgpg2 -c (o --symmetric) cifra con passphrase (simetrico); gpg2 -e -r destinatario cifra con la clave publica del destinatario (asimetrico). En la practica, GPG usa cifrado hibrido: asimetrico para la clave de sesion y simetrico para los datos
  • hkps:// vs hkp://hkps:// usa HTTPS (cifrado, puerto 443); hkp:// usa HTTP sin cifrar en el puerto 11371. El examen puede preguntar el puerto por defecto de HKP
  • gpg-agent cache TTLdefault-cache-ttl controla cuanto tiempo se cachea la passphrase tras cada uso; max-cache-ttl es el limite absoluto independientemente del uso. Si ambos estan configurados, se aplica el que venza primero
  • S/MIME usa openssl smime, no gpg — S/MIME trabaja con certificados X.509 y se gestiona con OpenSSL. No mezclar comandos de GPG con operaciones S/MIME
  • MD5 y SHA-1 estan rotos — MD5 (128 bits) tiene colisiones conocidas desde 2004; SHA-1 (160 bits) desde 2017. Para el examen, solo SHA-256 o superior se consideran seguros. Pero deben conocerse los tamaños de salida de todos
  • --delete-secret-keys antes de --delete-keys — para eliminar un par de claves completo, primero se debe borrar la clave privada y luego la publica. Intentar borrar la publica primero cuando existe la privada genera un error