Café y Código

2. Cifrado Simétrico: Compartiendo una Sola Clave 🔑

Conceptos Clave del Cifrado Simétrico

El cifrado simétrico destaca por su gran velocidad y bajo consumo de recursos. Esto lo hace el estándar absoluto para proteger datos masivos (bases de datos completas, archivos en disco o conexiones TLS).

El algoritmo moderno por excelencia es AES (Advanced Encryption Standard). Usar AES-256 significa que hay $2^256$ combinaciones de claves posibles, haciendo imposible un ataque por fuerza bruta hoy en día.

⚠️ El peligro del modo ECB y por qué elegimos GCM

Nunca uses el modo de cifrado ECB (Electronic Codebook). ECB cifra cada bloque por separado de forma idéntica; si hay patrones repetidos en el archivo original, el texto cifrado revelará esos patrones (el famoso ejemplo del pingüino de Linux Tux). En su lugar, usamos GCM (Galois/Counter Mode), que es un modo de Cifrado Autenticado (AEAD). GCM no solo cifra los datos, sino que genera un tag de autenticación de 128 bits que garantiza que los datos no han sido modificados ni manipulados.

La importancia del IV o Nonce

El Vector de Inicialización (IV) o Nonce (número de un solo uso) es un valor aleatorio no secreto de 12 bytes. Su único propósito es asegurar que si cifras el mensaje "Hola" dos veces con la misma contraseña, los resultados cifrados sean totalmente distintos.

Regla de oro: NUNCA reutilices el mismo IV con la misma clave. Si lo haces, el modo GCM pierde sus propiedades de seguridad y un atacante podría descifrar la comunicación.

Implementación en Código

Compara cómo se configura e implementa AES-256-GCM en diferentes lenguajes. Nota que todos generan un IV aleatorio y validan el tag de autenticación.

Cifrar y Descifrar con AES-256-GCM
PYTHON
1 # Requisitos: pip install cryptography
2 import os
3 from cryptography.hazmat.primitives.ciphers.aead import AESGCM
4
5 # 1. Generar una clave segura de 256 bits (32 bytes)
6 clave = AESGCM.generate_key(bit_length=256)
7 aesgcm = AESGCM(clave)
8
9 mensaje_plano = b"Este es un secreto confidencial cifrado con AES"
10
11 # 2. Generar un IV/Nonce unico de 96 bits (12 bytes)
12 # IMPORTANTE: Nunca reutilices el mismo nonce con la misma clave
13 nonce = os.urandom(12)
14
15 # 3. Cifrar (GCM genera internamente el tag de autenticidad y lo concatena al final)
16 mensaje_cifrado = aesgcm.encrypt(nonce, mensaje_plano, None)
17 print(f"Cifrado (hex): {mensaje_cifrado.hex()}")
18
19 # 4. Descifrar (valida automaticamente la integridad usando el tag)
20 mensaje_descifrado = aesgcm.decrypt(nonce, mensaje_cifrado, None)
21 print(f"Descifrado: {mensaje_descifrado.decode('utf-8')}")

Ponte a prueba

Demuestra lo aprendido sobre vectores de inicialización y el estándar AES.

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.