Criptografia autenticada de streaming com dados associados (Streaming AEAD)

A primitiva AEAD de streaming oferece criptografia autenticada para dados de streaming. É útil quando os dados a serem criptografados são muito grandes para serem processados em uma única etapa. Os casos de uso típicos incluem a criptografia de arquivos grandes ou transmissões de dados ao vivo.

A criptografia é feita em segmentos, que são vinculados ao local em um texto criptografado e não podem ser removidos nem reorganizados. Os segmentos de um texto criptografado não podem ser inseridos em outro texto criptografado. Para modificar um texto criptografado, todo o fluxo de dados precisa ser criptografado novamente.1

A descriptografia é rápida porque apenas uma parte do texto criptografado é descriptografada e autenticada por vez. Textos simples parciais podem ser obtidos sem processar todo o texto criptografado.

As implementações de AEAD em streaming atendem à definição de AEAD e são seguras contra ataques de OEA (nOAE). Eles têm as seguintes propriedades:

  • Secrecy: nada sobre o texto simples é conhecido, exceto o tamanho dele.
  • Authenticity: é impossível mudar o texto simples que foi criptografado sem ser detectado.
  • Symmetric: a criptografia do texto simples e a descriptografia do texto criptografado são feitas com a mesma chave.
  • Ordem aleatória: a criptografia é aleatória. Duas mensagens com o mesmo texto simples geram textos criptografados diferentes. Os invasores não podem saber qual texto criptografado corresponde a um determinado texto simples.

Dados associados

A primitiva AEAD de streaming pode ser usada para vincular o texto criptografado a dados associados específicos. Suponha que você tenha um banco de dados com os campos user-id e encrypted-medical-history. Nesse cenário, user-id pode ser usado como dados associados ao criptografar encrypted-medical-history. Isso impede que um invasor mova o histórico médico de um usuário para outro.

Escolher um tipo de chave

Recomendamos AES128_GCM_HKDF_1MB para a maioria dos usos. De modo geral:

  • AES-GCM-HKDF
    • AES128_GCM_HKDF_1MB (ou AES256_GCM_HKDF_1MB) é a opção mais rápida. Ele pode codificar 264 arquivos com até 264 bytes cada. Cerca de 1 MB de memória é consumido durante o processo de criptografia e descriptografia.
    • AES128_GCM_HKDF_4KB consome cerca de 4 KB de memória e é uma boa escolha se o sistema não tiver muita memória.
  • AES-CTR HMAC
    • AES128_CTR_HMAC_SHA256_1MB (ou AES256_CTR_HMAC_SHA256_1MB) é uma opção mais conservadora.

Garantias de segurança

As implementações de AEAD em streaming oferecem:

  • Segurança CCA2.
  • Força de autenticação de pelo menos 80 bits.
  • A capacidade de criptografar pelo menos 264 mensagens3 com um total de 251 bytes2 . Nenhum ataque com até 232 textos simples ou textos cifrados escolhidos tem uma probabilidade de sucesso maior que 2-32.

Exemplo de caso de uso:

Consulte Quero criptografar arquivos grandes ou fluxos de dados.


  1. Uma razão para essa restrição é o uso da cifra AES-GCM. Criptografar um segmento de texto simples diferente no mesmo local seria equivalente a reutilizar o IV, o que viola as garantias de segurança do AES-GCM. Outra razão é que isso evita ataques de reversão, em que o invasor pode tentar restaurar uma versão anterior do arquivo sem ser detectado. 

  2. Há suporte para 232 segmentos, com cada segmento contendo segment_size - tag_size bytes de texto simples. Para segmentos de 1 MB, o tamanho total de texto simples é 232 * (220-16) ~= 251 bytes. 

  3. O streaming AEAD se torna inseguro quando uma combinação de chave derivada (128 bits) e prefixo de valor de uso único (valor aleatório independente de 7 bytes) é repetida. Temos uma resistência a colisões de 184 bits, o que equivale a 264 mensagens se quisermos que a probabilidade de sucesso seja menor que 2-32