Parte: 0 — Fundamentos y prerrequisitos · Fuente: Ferguson, Schneier & Kohno, Cryptography Engineering ⏱️ Duración estimada: 120 min · Nivel: Fundamentos
Construir la intuición criptográfica que sostiene TLS, firmas, autenticación y almacenamiento seguro de contraseñas. Al terminar entenderás cifrado simétrico y asimétrico, funciones hash, HMAC, firmas digitales y por qué "nunca inventes tu propia cripto". No se trata de matemáticas avanzadas, sino de saber usar las primitivas correctas.
Al finalizar, el alumno podrá:
| # | Tema | Por qué importa |
|---|---|---|
| 1 | Terminología | Confidencialidad, integridad, autenticidad |
| 2 | Cifrado simétrico | AES, modos, IV/nonce |
| 3 | Cifrado asimétrico | RSA, ECC, par de claves |
| 4 | Funciones hash | SHA-2/3, colisiones |
| 5 | Hash de contraseñas | bcrypt, scrypt, argon2, sal |
| 6 | HMAC y MAC | Integridad autenticada |
| 7 | Firmas digitales | No repudio |
| 8 | Intercambio de claves | Diffie-Hellman, PKI |
Usa Python con la librería cryptography (de PyCA) y hashlib. Para contraseñas, bcrypt/argon2-cffi. Instala en tu venv:
pip install cryptography bcrypt argon2-cffi
También openssl en línea de comandos para experimentar. Regla de oro: usa librerías establecidas, nunca implementaciones caseras de primitivas.
python
import hashlib
print(hashlib.sha256(b"mensaje").hexdigest())
Cambia un byte del mensaje y observa el efecto avalancha.
2. Por qué MD5/SHA-1 no valen. Investiga colisiones conocidas y razona por qué no deben usarse para integridad de seguridad.
3. Cifrado simétrico autenticado con AES-GCM (vía cryptography):
python
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
key = AESGCM.generate_key(bit_length=256)
aes = AESGCM(key); nonce = b"\x00"*12
ct = aes.encrypt(nonce, b"secreto", None)
print(aes.decrypt(nonce, ct, None))
Nota: en producción el nonce debe ser único por mensaje. 4. Hash de contraseñas con sal:
python
import bcrypt
h = bcrypt.hashpw(b"Contrasena1", bcrypt.gensalt())
print(bcrypt.checkpw(b"Contrasena1", h))
Compara: hashear una contraseña con SHA-256 "pelado" es inseguro. 5. HMAC para integridad autenticada de un mensaje con clave compartida. 6. Claves asimétricas. Genera un par RSA con openssl y firma/verifica un archivo:
bash
openssl genrsa -out priv.pem 2048
openssl rsa -in priv.pem -pubout -out pub.pem
openssl dgst -sha256 -sign priv.pem -out firma archivo
openssl dgst -sha256 -verify pub.pem -signature firma archivo
Implementa securebox.py, una herramienta que cifre y descifre un archivo con AES-GCM (clave derivada de una contraseña mediante un KDF adecuado como scrypt/argon2 con sal), verificando integridad al descifrar. Debe fallar de forma clara si el archivo fue manipulado o la contraseña es incorrecta.
Criterio de aceptación: un archivo cifrado y luego descifrado con la contraseña correcta se recupera idéntico (mismo SHA-256); alterar un byte del cifrado o usar contraseña errónea produce un error de autenticación explícito, no datos corruptos silenciosos. Usa una librería establecida (PyCA cryptography), sin cripto casera.
| Síntoma / mensaje | Causa y cómo arreglar |
|---|---|
| Almacenar contraseñas con SHA-256 sin sal | Vulnerable a rainbow tables y GPU cracking. Usa bcrypt/argon2 con sal. |
| Reutilizar el nonce en AES-GCM | Rompe la seguridad del cifrado. Genera un nonce único por mensaje. |
| Implementar AES "a mano" | Errores sutiles = inseguro. Usa librerías auditadas. |
| Usar MD5/SHA-1 para firmas o integridad | Están rotos por colisiones. Migra a SHA-256/SHA-3. |
| Cifrar sin autenticar (solo AES-CBC) | Permite manipulación. Usa modos autenticados (GCM) o "encrypt-then-MAC". |
❓ ¿Por qué "no inventes tu propia cripto"? Porque las primitivas son fáciles de implementar mal de formas invisibles pero catastróficas (timing, padding, nonces). Las librerías establecidas han sido auditadas por expertos durante años.
❓ ¿Cifrado o hashing para contraseñas? Ninguno de los dos "a secas": se usa un hash de contraseñas lento y con sal (bcrypt/scrypt/argon2), diseñado para resistir fuerza bruta.
❓ ¿RSA está obsoleto? No, pero la criptografía de curva elíptica (ECC) ofrece la misma seguridad con claves más pequeñas y es preferida hoy. Ambos conviven.
❓ ¿Qué es la criptografía post-cuántica? Algoritmos resistentes a computadores cuánticos, que amenazan RSA/ECC. El NIST ya estandariza esquemas PQC; es un tema emergente que solo introducimos aquí.
cryptography — https://cryptography.io/Clase 020 — Sistemas de numeración y encoding: binario, hex, base64 y URL
Clase 022 — Docker y contenedores para laboratorios de seguridad