Encriptación autenticada con datos asociados (AEAD de transmisión)
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
El tipo primitivo de AEAD de transmisión proporciona encriptación autenticada para la transmisión de datos. Es útil cuando los datos que se van a encriptar son demasiado grandes para procesarse 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. Los textos simples parciales se pueden obtener sin procesar todo el texto cifrado.
Las implementaciones de AEAD de transmisión cumplen con la definición de AEAD y son seguras con NOAE. Tienen las siguientes propiedades:
Secrecy: No se sabe nada sobre el texto simple, excepto su longitud.
Authenticity: Es imposible cambiar el texto simple encriptado que subyace al texto cifrado sin que se detecte.
Symmetric: 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
La primitiva de 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.
Tener al menos 80 bits de seguridad de autenticación
La capacidad de encriptar al menos 264 mensajes3 con un total de 251 bytes2 . Ningún ataque con hasta 232 textos simples o textos cifrados elegidos tiene una probabilidad de éxito mayor que 2-32.
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 los ataques de reversión, en los que el atacante puede intentar restablecer una versión anterior del archivo sin detección. ↩
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. ↩
La transmisión de AEAD se vuelve insegura cuando se repite una combinación de clave derivada (128 bits) y prefijo de 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. ↩
[null,null,["Última actualización: 2025-07-25 (UTC)"],[[["\u003cp\u003eStreaming AEAD encrypts large data streams or files securely in segments, ensuring authenticity and confidentiality.\u003c/p\u003e\n"],["\u003cp\u003eIt offers strong security guarantees, including CCA2 security, at least 80-bit authentication strength, and resistance to common attacks.\u003c/p\u003e\n"],["\u003cp\u003eAssociated data is authenticated but not encrypted, preventing unauthorized data manipulation but not revealing its content.\u003c/p\u003e\n"],["\u003cp\u003eTink recommends AES128_GCM_HKDF_1MB for most use cases due to its speed and large data capacity, with alternative options for memory-constrained environments.\u003c/p\u003e\n"],["\u003cp\u003eModifying existing ciphertext requires re-encryption of the entire stream, maintaining data integrity and preventing rollback attacks.\u003c/p\u003e\n"]]],["Streaming AEAD encrypts large data streams in segments, ensuring authenticity and secrecy, but only the plaintext is encrypted, associated data is not. Encryption segments are bound to their location and cannot be reordered or moved. Decryption allows partial ciphertext processing. The recommended key type is AES128_GCM_HKDF_1MB. Streaming AEAD offers CCA2 security, at least 80-bit authentication strength, and can encrypt at least 2^64 messages with a total of 2^51 bytes. Re-encrypting the whole stream is needed to modify the ciphertext.\n"],null,["# Streaming Authenticated Encryption with Associated Data (Streaming AEAD)\n\nThe Streaming AEAD primitive provides authenticated encryption for streaming\ndata. It is useful when the data to be encrypted is too large to be processed in\na single step. Typical use cases include encryption of large files or live data\nstreams.\n\nEncryption is done in segments, which are bound to their location within a\nciphertext and cannot be removed or reordered. Segments from one ciphertext\ncannot be inserted into another ciphertext. To modify an existing ciphertext,\nthe entire data stream must be re-encrypted.^[1](#fn1)^\n\nDecryption is fast because only a portion of the ciphertext is decrypted and\nauthenticated at a time. Partial plaintexts are obtainable without processing\nthe entire ciphertext.\n\nStreaming AEAD implementations fulfill the [AEAD\ndefinition](https://www.cs.ucdavis.edu/%7Erogaway/papers/ad.html) and are\n[nOAE-secure](https://eprint.iacr.org/2015/189.pdf). They have the following\nproperties:\n\n- **Secrecy**: Nothing about the plaintext is known, except its length.\n- **Authenticity**: It is impossible to change the encrypted plaintext underlying the ciphertext without being detected.\n- **Symmetric**: Encrypting the plaintext and decrypting the ciphertext is done with the same key.\n- **Randomization**: Encryption is randomized. Two messages with the same plaintext yield different ciphertexts. Attackers cannot know which ciphertext corresponds to a given plaintext.\n\n### Associated data\n\n| **Caution:** Associated data is authenticated but *NOT* encrypted.\n\nThe Streaming AEAD primitive can be used to [tie ciphertext to specific\nassociated data](/tink/bind-ciphertext). Suppose you have a database with the\nfields `user-id` and `encrypted-medical-history`: In this scenario, `user-id`\ncan be used as associated data when encrypting `encrypted-medical-history`. This\nprevents an attacker from moving medical history from one user to another.\n\n### Choose a key type\n\nWe recommend **AES128_GCM_HKDF_1MB** for most uses. Generally:\n\n- [AES-GCM-HKDF](/tink/streaming-aead/aes_gcm_hkdf_streaming)\n - AES128_GCM_HKDF_1MB (or AES256_GCM_HKDF_1MB) is the faster option. It can encrypt 2^64^ files with up to 2^64^ bytes each. \\~1 MB of memory is consumed during the encryption and decryption process.\n - AES128_GCM_HKDF_4KB consumes \\~4 KB of memory and is a good choice if your system doesn't have a lot of memory.\n- [AES-CTR HMAC](/tink/streaming-aead/aes_ctr_hmac_streaming)\n - AES128_CTR_HMAC_SHA256_1MB (or AES256_CTR_HMAC_SHA256_1MB) is a more conservative option.\n\n| **Note:** For 1 MB schemes, the plaintext may have any length within 0 to 2^51^ bytes.^[2](#fn2)^\n\n### Security guarantees\n\nStreaming AEAD implementations offer:\n\n- CCA2 security.\n- At least 80-bit authentication strength.\n- The ability to encrypt at least 2^64^ messages^[3](#fn3)^ with a total of 2^51^ bytes[^2^](#fn2) . No attack with up to 2^32^ chosen plaintexts or chosen ciphertexts has a probability of success larger than 2^-32^.\n\n| **Caution:** **Streaming AEAD offers no secrecy guarantees for associated data.**\n\n### Example use case\n\nSee [I want to encrypt large files or data\nstreams](/tink/encrypt-large-files-or-data-streams). \n\n*** ** * ** ***\n\n1. A reason for this restriction is the use of the AES-GCM cipher. Encrypting a different plaintext segment at the same location would be equivalent to reusing the IV, which violates the security guarantees of AES-GCM. Another reason is that this prevents roll-back attacks, where the attacker may try to restore a previous version of the file without detection. [↩](#fnref1)\n\n2. 2^32^ segments are supported, with each segment containing `segment_size - tag_size` bytes of plaintext. For 1 MB segments, the total plaintext size is 2^32^ \\* (2^20^-16) \\~= 2^51^ bytes. [↩](#fnref2)\n\n3. Streaming AEAD becomes insecure when a derived key (128-bit) and nonce prefix (independent random 7-byte value) combination is repeated. We have 184-bit collision resistance, which roughly translates to 2^64^ messages if we want success probability to be less than 2^-32^. [↩](#fnref3)"]]