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

El tipo primitivo de AEAD de transmisión proporciona encriptación autenticada para la transmisión de datos. Resulta útil cuando los datos para encriptar son demasiado grandes para procesarlos en un solo paso. Entre los casos de uso típicos, se incluye 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. 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. Se pueden obtener textos simples parciales sin procesar todo el texto cifrado.

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

  • Secrecy: no se conoce nada sobre el texto simple, excepto su longitud.
  • Autenticidad: Es imposible cambiar el texto sin formato encriptado subyacente al texto cifrado sin ser detectado.
  • Simétrica: La encriptación del texto simple 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 texto simple determinado.

Datos asociados

El AEAD de transmisión se puede usar para vincular el texto cifrado a datos asociados específicos. Supongamos que tienes una base de datos con los campos user-id y encrypted-medical-history. En este caso, user-id se puede usar como datos asociados cuando se encripta encrypted-medical-history. Esto evita que un atacante mueva los antecedentes médicos de un usuario a otro.

Elige un tipo de clave

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

  • AES128_GCM_HKDF_1MB (o AES256_GCM_HKDF_1MB) es la opción más rápida. Puede encriptar 264 archivos con hasta 264 bytes cada uno. Se consume aproximadamente 1 MB de memoria durante el proceso de encriptación y desencriptación.
  • AES128_GCM_HKDF_4KB consume alrededor de 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 AEAD de transmisión ofrecen lo siguiente:

  • Seguridad CCA2.
  • Seguridad de al menos 80 bits.
  • La capacidad de encriptar al menos 264 mensajes3 con un total de 251 bytes2 . Ningún ataque con hasta 232 textos sin formato elegidos o cifrados elegidos tiene una probabilidad de éxito mayor que 2-32.

Ejemplo de caso de uso

Consulta Quiero encriptar archivos grandes o flujos de datos.


  1. Un motivo de esta restricción es el uso del algoritmo de cifrado AES-GCM. Encriptar un segmento de texto simple diferente en la misma ubicación equivaldría a volver a usar el IV, lo que infringe las garantías de seguridad de AES-GCM. Otra razón es que esto evita ataques de reversión, en los que el atacante puede intentar restablecer una versión anterior del archivo sin ser detectado. 

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

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