Criptografia autenticada de streaming com dados associados (Streaming AEAD)

O primitivo AEAD de streaming fornece 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 reordenados. Os segmentos de um texto criptografado não podem ser inseridos em outro texto criptografado. Para modificar um texto criptografado, o fluxo de dados inteiro 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 acessados sem processar todo o texto criptografado.

As implementações de AEAD de streaming atendem à definição de AEAD e são não seguras para o NOAE. Eles têm as seguintes propriedades:

  • Confidencialidade: nada sobre o texto simples é conhecido, exceto o tamanho dele.
  • Autenticidade: é impossível mudar o texto simples que foi criptografado sem ser detectado.
  • Simetria: a criptografia do texto simples e a descriptografia 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 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:

  • AES128_GCM_HKDF_1MB (ou AES256_GCM_HKDF_1MB) é a opção mais rápida. Ele pode criptografar 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.
  • AES128_CTR_HMAC_SHA256_1 MB (ou AES256_CTR_HMAC_SHA256_1MB) é uma opção mais conservadora.

Garantias de segurança

As implementações de streaming de AEAD oferecem:

  • Segurança da 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 escolhidos ou texto criptografado 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