Saltearse al contenido

Simétrica vs asimétrica

Entender la diferencia entre cifrado simétrico y asimétrico —y, sobre todo, los modos de operación— es la base para explotar la mayoría de fallos criptográficos del mundo real. La teoría es simple; lo explotable está en los detalles de uso.

SIMÉTRICA (AES, ChaCha20)
misma clave para cifrar y descifrar; rápida; para grandes volúmenes de datos
problema: ¿cómo comparten la clave las dos partes?
ASIMÉTRICA (RSA, ECC)
par de claves: pública (cifra/verifica) + privada (descifra/firma); lenta
resuelve el reparto de clave y permite firma digital
HÍBRIDO (lo real: TLS, PGP, Signal)
asimétrica para intercambiar una clave de sesión -> simétrica para los datos

AES cifra bloques de 128 bits. El modo dice cómo encadenar bloques, y ahí están los fallos:

ECB cada bloque independiente -> bloques de texto plano iguales = cifrado igual
FUGA de patrones (el "pingüino ECB"); permite cortar/pegar bloques. NUNCA usar.
CBC encadena con XOR del bloque anterior; necesita IV aleatorio
maleable sin MAC (bit-flipping); vulnerable a padding oracle (ver crypto-padding)
CTR convierte AES en cifrado de flujo (keystream XOR texto)
reutilizar (clave,nonce) = CATÁSTROFE: XOR de dos textos revela ambos
GCM CTR + autenticación (AEAD) -> confidencialidad + integridad. RECOMENDADO
nonce ÚNICO por clave: repetir el nonce rompe la autenticación (forja)
# oráculo de cifrado: enviar bloques repetidos y ver criptograma repetido
AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA -> dos bloques cifrados IDÉNTICOS = ECB
# "ECB byte-at-a-time": si el servidor cifra ENTRADA‖SECRETO en ECB,
# se recupera el secreto byte a byte alineando bloques (reto clásico de cryptopals)

Reutilización de keystream (CTR/stream con nonce repetido)

Sección titulada «Reutilización de keystream (CTR/stream con nonce repetido)»
C1 = P1 XOR KS C2 = P2 XOR KS (mismo nonce -> mismo KS)
C1 XOR C2 = P1 XOR P2 -> con "crib dragging" se recuperan ambos textos sin la clave
# alterar un byte del bloque de IV/cifrado de CBC cambia de forma controlada
# el texto descifrado del bloque siguiente -> p. ej. flip de "role=user" a "role=admin"
  • PyCryptodome para montar los oráculos y ataques; CyberChef para prototipar.
  • openssl enc para cifrar/descifrar y reproducir modos; sets de cryptopals para practicar.
  • AEAD por defecto: AES-GCM o ChaCha20-Poly1305; nunca CBC/CTR “a pelo” sin MAC.
  • Nonce único por clave (contador o aleatorio de 96 bits en GCM); IV aleatorio en CBC.
  • Prohibir ECB. Encrypt-then-MAC si no se usa AEAD. Rotación de claves y gestión con KMS/HSM.
  • ECB en cookies/tokens: fuga de estructura y corte-pegado de bloques, recurrente en auditorías web.
  • Nonce reuse en GCM: rotura de la autenticación; documentado en implementaciones TLS y VPN mal configuradas.
  • Zerologon (CVE-2020-1472) nace de un uso incorrecto de AES-CFB8 con IV fijo en Netlogon.
  • Identificar algoritmo y modo (tamaño de bloque = 16 → AES)
  • Test ECB: bloques repetidos → criptograma repetido
  • ECB byte-at-a-time si hay oráculo ENTRADA‖SECRETO
  • CTR/stream: buscar reutilización de nonce (XOR de textos)
  • CBC sin MAC: probar bit-flipping y padding oracle (Padding oracle)
  • GCM: ¿se repite el nonce? → forja de tags
  • Verificar que la defensa usa AEAD y nonce único