Encriptación autenticada con datos asociados (AEAD de transmisión)

El tipo primitivo de AEAD de transmisión proporciona encriptación autenticada para datos de transmisión. Resulta útil cuando los datos que se encriptarán son demasiado grandes para procesarlos en un solo paso. Los casos prácticos típicos incluyen la encriptación de archivos grandes o transmisiones de datos en vivo.

La encriptación se realiza en segmentos, que están vinculados a su ubicación dentro de un texto cifrado y no se pueden quitar ni reordenar. Los segmentos de un texto cifrado no se pueden insertar en otro texto cifrado. Para modificar un texto cifrado existente, se debe volver a encriptar todo el flujo de datos.1

La desencriptación es rápida porque solo se desencripta y autentica una parte del texto cifrado a la vez. El texto simple parcial se puede obtener sin procesar todo el texto cifrado.

Las implementaciones de transmisión de AEAD cumplen con la definición de AEAD y son seguras para OAE2. Tienen las siguientes propiedades:

  • Confidencialidad: No se conoce nada sobre el texto simple, excepto su longitud.
  • Autenticidad: Es imposible cambiar el texto simple encriptado subyacente al texto cifrado sin que se lo detecte.
  • Simétrica: la encriptación y la desencriptación del texto cifrado se realizan con la misma clave.
  • Aleatorización: La encriptación es aleatoria. Dos mensajes con el mismo texto simple generan textos cifrados diferentes. Los atacantes no pueden saber qué texto cifrado corresponde a un determinado texto simple.

Datos asociados

El AEAD de transmisión se puede usar para vincular texto cifrado a datos asociados específicos. Supongamos que tienes una base de datos con los campos user-id y encrypted-medical-history. En esta situación, user-id se puede usar como datos asociados cuando se encripta encrypted-medical-history. De esta manera, se evita que un atacante transfiera la historia clínica de un usuario a otro.

Elige un tipo de clave

Recomendamos AES128_GCM_HKDF_1MB para la mayoría de los usos. Generalmente:

  • AES128_GCM_HKDF_1MB (o AES256_GCM_HKDF_1MB) es la opción más rápida. Puede encriptar 264 archivos de hasta 264 bytes cada uno. Se consume alrededor de 1 MB de memoria durante el proceso de encriptación y desencriptación.
  • AES128_GCM_HKDF_4KB consume aproximadamente 4 KB de memoria y es una buena opción si tu sistema no tiene mucha memoria.
  • AES128_CTR_HMAC_SHA256_1MB (o AES256_CTR_HMAC_SHA256_1MB) es una opción más conservadora.

Garantías de seguridad

Las implementaciones de transmisión de AEAD ofrecen lo siguiente:

  • Seguridad CCA2.
  • Seguridad de autenticación de 80 bits como mínimo
  • Encriptar al menos 264 mensajes3 con un total de 251 bytes2 Ningún ataque con hasta 232 textos sin formato elegidos o texto cifrado elegido tiene una probabilidad de éxito mayor que 2-32.

Ejemplo de caso de uso

Consulta Deseo encriptar archivos grandes o transmisiones de datos.


  1. Un motivo para esta restricción es el uso del algoritmo de cifrado AES-GCM. Encriptar un segmento de texto sin formato diferente en la misma ubicación sería equivalente a reutilizar el IV, lo cual infringe las garantías de seguridad de AES-GCM. Otro motivo es que esto evita los ataques de reversión, en los que el atacante puede intentar restablecer una versión anterior del archivo sin detección. 

  2. Se admiten 232 segmentos, y cada uno contiene segment_size - tag_size bytes de texto simple. Para segmentos de 1 MB, el tamaño total del texto sin formato es de 232 * (220-16) ~= 251 bytes.

  3. El AEAD de transmisión se vuelve inseguro cuando se repite una combinación de clave derivada (128 bits) y prefijo nonce (valor aleatorio independiente de 7 bytes). Tenemos una resistencia a la colisión de 184 bits, lo que se traduce aproximadamente en 264 mensajes si queremos que la probabilidad de éxito sea menor que 2-32