AES (Advanced Encryption Standard) es un algoritmo de cifrado simétrico que se convirtió en el estándar de cifrado del gobierno de Estados Unidos en 2001.

¿Qué es AES?

AES es un algoritmo de cifrado de bloque que utiliza claves de 128, 192 o 256 bits para cifrar y descifrar datos en bloques de 128 bits.

Características Principales

Longitudes de Clave

  • AES-128: Clave de 128 bits
  • AES-192: Clave de 192 bits
  • AES-256: Clave de 256 bits

Tamaño de Bloque

  • 128 bits: Tamaño fijo de bloque
  • Eficiente: Procesamiento rápido
  • Estándar: Ampliamente soportado

Modos de Operación

ECB (Electronic Codebook)

  • Simple: Cifrado directo por bloques
  • Inseguro: Patrones visibles
  • No recomendado: Para datos sensibles

CBC (Cipher Block Chaining)

  • IV: Vector de inicialización
  • Cadenado: Cada bloque depende del anterior
  • Seguro: Ampliamente utilizado

GCM (Galois/Counter Mode)

  • Autenticado: Cifrado + autenticación
  • Eficiente: Paralelizable
  • Recomendado: Para aplicaciones modernas

CTR (Counter Mode)

  • Stream: Funciona como cifrado de flujo
  • Paralelo: Procesamiento paralelo
  • Seguro: Sin propagación de errores

Implementación

Generación de Clave

1
2
3
4
5
6
7
# Ejemplo de generación de clave AES
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import os

# Generar clave aleatoria de 256 bits
key = os.urandom(32)  # 32 bytes = 256 bits

Cifrado CBC

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# Cifrado AES-CBC
from cryptography.hazmat.primitives import padding

# Generar IV aleatorio
iv = os.urandom(16)  # 16 bytes = 128 bits

# Crear cifrador
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()

# Aplicar padding PKCS7
padder = padding.PKCS7(128).padder()
padded_data = padder.update(data)
padded_data += padder.finalize()

# Cifrar
ciphertext = encryptor.update(padded_data) + encryptor.finalize()

Cifrado GCM

1
2
3
4
5
6
# Cifrado AES-GCM (recomendado)
cipher = Cipher(algorithms.AES(key), modes.GCM(iv), backend=default_backend())
encryptor = cipher.encryptor()

# Cifrar con autenticación
ciphertext = encryptor.update(data) + encryptor.finalize()

Seguridad

Fortalezas

  • Estándar: Aprobado por NIST
  • Resistente: Ataques criptoanalíticos conocidos
  • Eficiente: Implementación rápida
  • Widely adopted: Ampliamente adoptado

Consideraciones

  • Longitud de clave: Usar al menos 128 bits
  • Modo seguro: Preferir GCM o CBC
  • IV único: Nunca reutilizar IVs
  • Gestión de claves: Proteger claves adecuadamente

Aplicaciones

Cifrado de Datos

  • Archivos: Cifrado de archivos sensibles
  • Bases de datos: Cifrado de campos sensibles
  • Backups: Cifrado de respaldos
  • Comunicaciones: Cifrado de canales

Protocolos

  • TLS/SSL: Cifrado de comunicaciones web
  • IPsec: Cifrado de tráfico de red
  • WPA2/WPA3: Cifrado de redes WiFi
  • BitLocker: Cifrado de discos

Estándares

  • FIPS 140-2: Certificación gubernamental
  • Common Criteria: Evaluación de seguridad
  • PCI DSS: Cumplimiento de tarjetas de pago

Rendimiento

Hardware

  • AES-NI: Instrucciones de CPU especializadas
  • Aceleración: Cifrado/descifrado rápido
  • Eficiencia: Menor consumo de energía

Software

  • Optimizaciones: Implementaciones optimizadas
  • Lookup tables: Tablas de consulta
  • Bit slicing: Técnicas de optimización

Mejores Prácticas

Configuración

  • Longitud: Usar AES-256 para datos críticos
  • Modo: Preferir GCM para autenticación
  • IV: Generar IVs criptográficamente seguros
  • Padding: Usar PKCS7 para CBC

Implementación

  • Librerías: Usar librerías probadas
  • Testing: Probar implementaciones
  • Auditoría: Revisar código criptográfico
  • Actualizaciones: Mantener actualizado

Gestión

  • Rotación: Rotar claves regularmente
  • Almacenamiento: Proteger claves adecuadamente
  • Backup: Respaldar claves de forma segura
  • Revocación: Revocar claves comprometidas

Conceptos Relacionados

Referencias