Introducción a la Criptografía Asimétrica
En las comunicaciones digitales modernas, garantizar la seguridad de la información requiere satisfacer cuatro pilares fundamentales: autenticación (verificar la identidad de las partes), autenticidad (confirmar el origen real del mensaje), integridad (asegurar que los datos no han sido alterados) y confidencialidad (proteger el contenido de accesos no autorizados).
Mientras que la criptografía simétrica es altamente eficiente para cifrar grandes volúmenes de datos y garantizar la confidencialidad, la criptografía asimétrica o de clave pública es indispensable para resolver los problemas de distribución de claves, autenticación e integridad. Este paradigma utiliza un par de claves matemáticamente vinculadas: una clave pública, que se distribuye libremente, y una clave privada, que se mantiene en absoluto secreto.
Intercambio de Claves y Cifrado Híbrido
Una de las aplicaciones más críticas de la criptografía asimétrica es el intercambio seguro de claves simétricas. Dado que los algoritmos asimétricos son computacionalmente costosos, no se utilizan para cifrar el flujo completo de datos. En su lugar, se emplean para negociar y transmitir de forma segura una clave simétrica efímera, la cual luego se encarga del cifrado rápido de la sesión.
Este proceso puede entenderse mediante una analogía física: si deseas enviar un documento confidencial, solicitas al destinatario un candado abierto (clave pública). Colocas el documento en una caja, lo aseguras con el candado y lo envías. Solo el destinatario, que posee la única llave existente (clave privada), puede abrir el candado y acceder al contenido. Una vez establecida la comunicación, ambas partes pueden acordar un código secreto (clave simétrica) para futuras interacciones más rápidas.
El Algoritmo RSA
RSA es uno de los primeros y más utilizados algoritmos de criptografía de clave pública. Su seguridad reside en la dificultad computacional de factorizar el producto de dos números primos grandes. Aunque multiplicar dos primos es una operación trivial, revertir el proceso para encontrar los factores originales de un número de cientos de dígitos es inviable con la capacidad de cómputo actual.
Funcionamiento Matemático
El proceso de generación de claves y cifrado en RSA se basa en la aritmética modular:
- Se seleccionan dos números primos distintos,
pyq. Para este ejemplo simplificado, usaremosp = 11yq = 13. - Se calcula el módulo
n = p × q, resultando enn = 143. - Se calcula la función totiante de Euler
φ(n) = (p - 1) × (q - 1), lo que daφ(n) = 120. - Se elige un exponente público
etal que1 < e < φ(n)y sea coprimo conφ(n). Seleccionamose = 7. - Se calcula el exponente privado
d, que es el inverso multiplicativo deemóduloφ(n). Es decir,(d × e) mod φ(n) = 1. Parae = 7yφ(n) = 120, el valor dedes103.
La clave pública está compuesta por el par (n, e), es decir, (143, 7). La clave privada es el par (n, d), o sea, (143, 103).
Para cifrar un mensaje numérico m = 9, se calcula el texto cifrado c = m^e mod n. Por tanto, c = 9^7 mod 143 = 48. Para descifrar, el receptor calcula m = c^d mod n, resultando en m = 48^103 mod 143 = 9, recuperando así el mensaje original.
Protocolo de Intercambio de Claves Diffie-Hellman
Diffie-Hellman (DH) no es un algoritmo de cifrado en sí mismo, sino un protocolo criptográfico que permite a dos partes establecer un secreto compartido a través de un canal de comunicación inseguro. Su seguridad se basa en la dificultad del problema del logaritmo discreto.
Mecanismo de Intercambio
El protocolo opera de la siguiente manera:
- Alice y Bob acuerdan públicamente un número primo grande
py una base o generadorg. En este ejemplo usaremos valores pequeños:p = 23yg = 5. - Alice elige un entero privado
a = 6y calcula su valor públicoA = g^a mod p. Así,A = 5^6 mod 23 = 8. - Bob elige un entero privado
b = 15y calcula su valor públicoB = g^b mod p. Así,B = 5^15 mod 23 = 19. - Ambos intercambian sus valores públicos
AyBa través del canal inseguro. - Alice calcula el secreto compartido como
s = B^a mod p, resultando ens = 19^6 mod 23 = 2. - Bob calcula el secreto compartido como
s = A^b mod p, resultando ens = 8^15 mod 23 = 2.
Ambas partes han llegado al mismo valor s = 2 sin que este haya transitado por la red. En implementaciones reales, p es un número primo de al menos 2048 bits para resistir ataques de fuerza bruta y análisis criptográfico.
Autenticación y Gestión de Claves SSH
El protocolo Secure Shell (SSH) utiliza criptografía de clave pública tanto para verificar la identidad del servidor como para autenticar a los clientes, eliminando la necesidad de transmitir contraseñas en texto plano.
Verificación del Servidor
Al conectarse a un host por primera vez, el cliente SSH presenta la huella digital (fingerprint) de la clave pública del servidor. El usuario debe verificar esta huella para prevenir ataques de intermediario (Man-in-the-Middle). Una vez aceptada, la clave se almacena en el archivo known_hosts local.
Autenticación del Cliente
Para autenticarse, el cliente genera un par de claves. La clave pública se añade al archivo ~/.ssh/authorized_keys en el servidor remoto. A continuación, se muestra la generación de un par de claves utilizando el algoritmo de curva elíptica ECDSA:
admin@workstation:~$ ssh-keygen -t ecdsa -b 521 -C "admin@infraestructura"
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/admin/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/admin/.ssh/id_ecdsa
Your public key has been saved in /home/admin/.ssh/id_ecdsa.pub
The key fingerprint is:
SHA256:Xy9Zk2+8vQ7mR4pL1wN3jT6yU8iO0sD5fG2hJ9kL1mM admin@infraestructura
The key's randomart image is:
+---[ECDSA 521]---+
| . o + . |
| . + O o |
| . + = X . |
| . o = S + |
| E . + . |
| . . . |
| . . |
| . |
| |
+----[SHA256]-----+
Es crucial proteger la clave privada con una contraseña robusta (passphrase) y establecer permisos restrictivos (chmod 600) en el archivo. La contraseña nunca se trensmite por la red; solo se utiliza para descifrar la clave privada en la memoria local del cliente antes de iniciar el proceso de autenticación.
Firmas Digitales e Infraestructura de Clave Pública (PKI)
Una firma digital garantiza la autenticidad e integridad de un documento electrónico. El emisor genera un hash criptográfico del documento y lo cifra con su clave privada. El receptor descifra la firma utilizando la clave pública del emisor y compara el hash resultante con el hash calculado del documento recibido. Si coinciden, se demuestra matemáticamente que el documento no fue alterado y que fue firmado por el poseedor de la clave privada.
Para evitar que un atacante suplante la identidad del emisor proporcionando una clave pública falsa, se utiliza una Infraestructura de Clave Pública (PKI). En este modelo, una Autoridad de Certificación (CA) de confianza emite certificados digitales que vinculan una identidad verificada con una clave pública. Los navegadores web y sistemas operativos mantienen un almacén de certificados raíz de CA confiables, estableciendo así una cadena de confianza que valida los certificados TLS/SSL utilizados en comunicaciones HTTPS.
Cifrado de Comunicaciones con GPG
GNU Privacy Guard (GPG) es una implementación libre del estándar OpenPGP, ampliamente utilizada para cifrar y firmar correos electrónicos, archivos y repositorios de código. GPG gestiona un anillo de claves que almacena las claves públicas de los contactos y las claves privadas del usuario.
Para generar un nuevo par de claves GPG, se ejecuta el siguiente comando interactivo:
dev@secure-node:~$ gpg --full-generate-key
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(14) Existing key from card
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
Key is valid for? (0) 1y
Key expires at Fri 12 Sep 2025 10:00:00 AM UTC
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: DevOps Engineer
Email address: devops@example-corp.com
Comment: Infraestructura Clave
You selected this USER-ID:
"DevOps Engineer (Infraestructura Clave) <devops@example-corp.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
Una vez generadas las claves, la clave pública puede exportarse y compartirse. Para descifrar un archivo que ha sido cifrado con nuestra clave pública, se utiliza el comando de descifrado, el cual solicitará la contraseña de la clave privada si esta fue protegida durante la generación:
dev@secure-node:~$ gpg --output documento_des cifrado.txt --decrypt documento_cifrado.gpg
gpg: encrypted with 4096-bit RSA key, ID 8F9A2B3C4D5E6F70, created 2024-09-12
"DevOps Engineer (Infraestructura Clave) <devops@example-corp.com>"