Saltearse al contenido

Conceptos & ataques comunes

La criptografía bien implementada rara vez se “rompe” por fuerza bruta contra el algoritmo: se rompe por cómo se usa. Esta ficha es el mapa del área: los conceptos que hay que tener claros y el catálogo de fallos de implementación que aparecen una y otra vez en auditorías, CTFs y bug bounty. Las demás fichas de Criptografía profundizan en cada bloque.

Confidencialidad nadie salvo el destinatario lee el mensaje -> cifrado (sym/asym)
Integridad el mensaje no ha sido alterado -> hash, MAC
Autenticidad el mensaje viene de quien dice -> MAC, firma digital
No repudio el emisor no puede negar haberlo enviado -> firma digital (asimétrica)

Confundir estos servicios es el origen de muchos fallos: cifrar no da integridad (por eso existe el cifrado autenticado, AEAD), y un hash no da autenticidad (por eso existe HMAC, no “hash(clave‖mensaje)”).

Cifrado simétrico AES, ChaCha20 mucho dato, clave compartida (ver crypto-sym)
Cifrado asimétrico RSA, ECC intercambio de clave / firma (ver crypto-pki)
Hash SHA-256, SHA-3 huella de integridad (ver crypto-hash)
MAC / AEAD HMAC, AES-GCM integridad + autenticidad
KDF PBKDF2, scrypt, Argon2 derivar clave de contraseña (lento a propósito)
Firma digital RSA-PSS, Ed25519 autenticidad + no repudio

Catálogo de fallos de implementación (lo que de verdad se explota)

Sección titulada «Catálogo de fallos de implementación (lo que de verdad se explota)»
Kerckhoffs: la seguridad está en la CLAVE, no en el secreto del algoritmo
-> "cifrado propio" / rolling your own crypto = casi siempre roto
ECB mode bloques iguales -> cifrado igual (el "pingüino ECB"); fuga de patrones
IV/nonce reutilizado catastrófico en CTR/GCM (ver crypto-sym); nonce de GCM NUNCA se repite
Padding oracle el error de padding distingue -> descifrar sin clave (ver crypto-padding)
MAC ausente / mal cifrar sin autenticar -> bit-flipping, maleabilidad (usar AEAD)
Hash para passwords SHA-256 "pelado" es crackeable; usar Argon2/bcrypt (ver crypto-hash)
RNG débil claves/tokens predecibles (ver crypto-rng)
Comparación no cte. == en MACs/tokens -> timing attack; usar comparación de tiempo constante
Length extension SHA-256(secreto‖msg) es extensible -> usar HMAC (ver crypto-hash)
Downgrade / curvas aceptar algoritmos débiles (RC4, MD5, export) -> forzar el más débil
1. Identificar la primitiva y el modo (longitud de bloque, formato de salida, cabeceras)
2. ¿Qué servicio FALTA? (¿hay MAC? ¿el IV es aleatorio? ¿se valida el padding?)
3. Buscar el oráculo: ¿el sistema revela algo (error, timing, longitud) ante entradas manipuladas?
4. Explotar la propiedad, no el álgebra: maleabilidad, reutilización, oráculos de error
  • CyberChef (análisis/transformación interactiva), Python + PyCryptodome (prototipado de ataques).
  • hashcat / John (cracking, ver Hashing & cracking), sage/z3 para la parte matemática en retos.
  • openssl para inspeccionar cifrados, certificados y protocolos reales.
  • No implementar primitivas propias: usar librerías revisadas (libsodium, Tink) y AEAD por defecto (AES-GCM, ChaCha20-Poly1305).
  • Derivar claves de contraseña con Argon2id; generar claves/nonces con un CSPRNG.
  • Comparar secretos en tiempo constante; validar MAC antes de descifrar (encrypt-then-MAC).
  • Inventario criptográfico y agilidad para rotar algoritmos (preparación post-cuántica).
  • ROBOT (2017): padding oracle de RSA PKCS#1 v1.5 revivido en Facebook, PayPal, etc.
  • Heartbleed (CVE-2014-0160) y POODLE (CVE-2014-3566): fallos de implementación/diseño con impacto masivo (ver TLS).
  • DROWN, Logjam, FREAK: downgrade a criptografía “export” débil.
  • Innumerables CTFs y bugs reales por IV estático, ECB en cookies de sesión y hash sin salt.
  • Identificar primitiva, modo y formato del criptograma
  • ¿Falta integridad/autenticidad? (sin MAC → maleabilidad)
  • ¿ECB? → buscar fuga de patrones con bloques repetidos
  • ¿IV/nonce reutilizado o predecible?
  • Probar oráculos (padding, error, timing)
  • Passwords: ¿hash lento con salt o crackeable?
  • Tokens/claves: ¿CSPRNG o predecibles? (ver Aleatoriedad débil (RNG))
  • ¿Se aceptan algoritmos débiles (downgrade)?