0Pricing
Cryptology Academy · Lección

Cifrado y descifrado AES-GCM en Python

Implemente cifrado autenticado con una gestión adecuada de nonces.

Cifrado y descifrado AES-GCM en Python es una lección gratuita de Cryptology Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Cryptology Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Cryptology Academy incluye 4 lecciones en total.

¿Por qué AES-GCM?

AES-GCM es un esquema de cifrado autenticado con datos asociados (AEAD). Proporciona confidencialidad (AES-CTR) e integridad y autenticidad (MAC GHASH) en una sola pasada; es el estándar para el cifrado moderno.

Componentes de GCM: CTR + GHASH

AES-GCM = AES en modo contador (cifrado) + MAC polinómico GHASH (autenticación). La etiqueta de autenticación de 128 bits cubre tanto el texto cifrado como los datos adicionales autenticados (AAD) opcionales.

Requisitos de los nonces

El nonce de 96 bits nunca debe reutilizarse con la misma clave. La reutilización de nonces rompe por completo GCM: un atacante recupera la clave de autenticación y puede falsificar textos cifrados. Utilice nonces aleatorios o un contador con rotación de claves.

Cifrado con AES-GCM en Python

Uso de la capa hazmat:

import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

# Generate a 256-bit key
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)

# Fresh 96-bit nonce per encryption
nonce = os.urandom(12)

plaintext = b"sensitive payload"
aad = b"user_id=42"  # authenticated but not encrypted

ciphertext = aesgcm.encrypt(nonce, plaintext, aad)
print("Nonce:", nonce.hex())
print("Ciphertext+tag:", ciphertext.hex())

Descifrado con AES-GCM en Python

El descifrado verifica automáticamente la etiqueta; genera InvalidTag si falla:

from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.exceptions import InvalidTag

# key, nonce, ciphertext, aad from previous step
try:
    recovered = aesgcm.decrypt(nonce, ciphertext, aad)
    print("Decrypted:", recovered)
except InvalidTag:
    print("Authentication failed — ciphertext tampered!")

Almacenamiento del nonce y el texto cifrado

Anteponer el nonce al texto cifrado antes de almacenarlo. Al descifrar, divida en el byte 12:

def encrypt_blob(key: bytes, data: bytes, aad: bytes = b"") -> bytes:
    aesgcm = AESGCM(key)
    nonce = os.urandom(12)
    ct = aesgcm.encrypt(nonce, data, aad or None)
    return nonce + ct  # prepend nonce

def decrypt_blob(key: bytes, blob: bytes, aad: bytes = b"") -> bytes:
    aesgcm = AESGCM(key)
    nonce, ct = blob[:12], blob[12:]
    return aesgcm.decrypt(nonce, ct, aad or None)

Datos adicionales autenticados (AAD)

Los AAD se autentican, pero no se cifran. Utilícelos para vincular el texto cifrado al contexto: ID de usuario, ID de registro o versión de la API. Esto impide que un atacante traslade un texto cifrado válido a un contexto diferente.

Uso de la API de cifrado de bajo nivel

Para el cifrado en streaming o en el mismo lugar, utilice directamente la API Cipher con el modo GCM:

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

key = os.urandom(32)
nonce = os.urandom(12)
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce))
encryptor = cipher.encryptor()
encryptor.authenticate_additional_data(b"aad-value")
ct = encryptor.update(b"hello world") + encryptor.finalize()
tag = encryptor.tag
print("Tag:", tag.hex())

Resistencia al uso incorrecto de nonces: AES-GCM-SIV

AES-GCM-SIV (RFC 8452) resiste el uso incorrecto de nonces: su reutilización revela que dos textos sin cifrar son idénticos, pero NO rompe la autenticidad. Prefiéralo cuando sea difícil garantizar la unicidad de los nonces.

Derivación de claves antes del cifrado

Nunca utilice una contraseña directamente como clave AES. Derive una clave con Argon2 o HKDF:

from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
import os

master_secret = b"shared_secret_from_ECDH"
salt = os.urandom(16)
kdf = HKDF(algorithm=hashes.SHA256(), length=32, salt=salt, info=b"aes-gcm-key")
aes_key = kdf.derive(master_secret)
print("Derived AES key:", aes_key.hex())

Consideraciones de rendimiento

La aceleración de hardware AES-NI hace que AES-GCM sea extremadamente rápido (~1-4 GB/s en las CPU modernas). Python cryptography utiliza OpenSSL, que aprovecha AES-NI. Para archivos de más de 100 MB, utilice streaming por bloques con la API Cipher de bajo nivel.

Comprobación de conocimientos

¿Qué ocurre si se utiliza dos veces el mismo nonce con AES-GCM y la misma clave?

Resumen de la lección

AES-GCM proporciona cifrado autenticado en una sola pasada. Utilice un nonce aleatorio nuevo de 96 bits para cada cifrado. Anteponer el nonce al texto cifrado para almacenarlo. Los AAD vinculan el texto cifrado al contexto. AES-GCM-SIV resiste el uso incorrecto de nonces. Derive las claves con HKDF; nunca utilice contraseñas directamente.

Preguntas frecuentes

¿La lección «Cifrado y descifrado AES-GCM en Python» es gratis?

Sí — el texto completo de «Cifrado y descifrado AES-GCM en Python» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Cryptology Academy, actualiza a CoddyKit PRO. El curso de Cryptology Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Cifrado y descifrado AES-GCM en Python»?

Implemente cifrado autenticado con una gestión adecuada de nonces. Practicas Cryptology Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Cryptology Academy?

No se requiere experiencia previa. Cryptology Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Cifrado y descifrado AES-GCM en Python»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Cryptology Academy?

Sí. Cada lección de Cryptology Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Introducción a la biblioteca cryptography de Python
  2. Cifrado y descifrado AES-GCM en Python
  3. Pares de claves RSA y ECDSA en Python
  4. Errores habituales de criptografía en Python y patrones seguros
← Volver a Cryptology Academy