Na criptografia OpenSSL em PHP usando aes-256-gcm, o tag_length
valor é escolhido pelo codificador ou é escolhido pelo método e retornado ao ponteiro como feito com o tag
? Ele lê que pode ser entre 4 e 16. O tag_length inserido na função de criptografia é garantido como o comprimento da tag retornada?
Além disso, como os aad
("Dados autenticados adicionais") são usados e por que seriam usados?
Obrigado.
GCM é uma criptografia autenticada e garante confidencialidade e autenticidade. Para esta última, uma tag de autenticação é usada.
A garantia de autenticidade significa que os dados (texto cifrado, IV, AAD) não podem ser alterados sem que isso seja percebido (pela verificação de autenticidade por meio da tag de autenticação durante a descriptografia).
A tag de autenticação é gerada automaticamente durante a criptografia e pode ser referenciada via
$tag
. O comprimento da tag pode ser especificado com$tag_length
e é de 16 bytes por padrão, s.openssl_encrypt()
. De acordo com a especificação GCM (s. NIST SP 800-38D , sec. 5.2.1.2 Dados de saída ), tamanhos de tag de 16, 15, 14, 13, 12 e em casos especiais 8 e 4 bytes são permitidos (diferentemente disso, PHP/OpenSSL suporta todos os tamanhos entre 4 e 16 bytes). Quanto maior o comprimento da tag, maior a segurança.Durante a descriptografia, a tag deve ser especificada, s.
openssl_decrypt()
. A tag (assim como o IV) não é secreta e é passada junto com o texto cifrado (e o IV) para o lado de descriptografia, geralmente concatenada, por exemploIV|ciphertext|tag
.AAD (dados autenticados adicionais) são dados autenticados, mas não criptografados (podem ser quaisquer informações que você queira garantir que não sejam alteradas, mas que não são secretas e, portanto, não precisam ser criptografadas).
Exemplo (criptografia/descriptografia GCM com tag de 12 bytes e com AAD):
Editar - Em relação às perguntas dos comentários:
Por que a tag não é secreta?
A tag de autenticação (ou MAC ) é, em última análise, um tipo de soma de verificação que é gerada durante a criptografia do texto cifrado, IV e AAD usando um algoritmo específico e a chave. Durante a descriptografia, a tag é recalculada e comparada com a tag de criptografia (s. NIST SP 800-38D , sec. 7 GCM Specification ).
Se as tags de criptografia e descriptografia forem idênticas, a autenticação é bem-sucedida. Em contraste, se um invasor manipulou os dados (texto cifrado e/ou IV e/ou AAD), uma tag diferente é gerada durante a descriptografia, o que revela a manipulação dos dados.
A tag não é secreta, pois um invasor não pode forjá-la, pois o invasor não está em posse da chave. Portanto, a tag pode ser passada junto com o texto cifrado para o lado da descriptografia.
Por que o IV não é secreto e aleatório?
O propósito do IV é evitar que criptografias de textos simples idênticos gerem textos cifrados idênticos (veja também segurança semântica no modo ECB). Isso significa que um par chave/IV diferente deve ser usado para cada criptografia.
Com uma chave fixa (o que é o caso normal), um IV diferente deve ser usado para cada criptografia. Caso contrário, como já mencionado, textos simples idênticos geram textos cifrados idênticos e, dependendo do modo, também podem gerar vulnerabilidades mais ou menos sérias (por exemplo, a reutilização de pares chave/IV para modos baseados em CTR, como GCM, é uma vulnerabilidade séria, s. aqui ). Um IV gerado aleatoriamente para cada criptografia é uma maneira comum de gerar pares chave/IV diferentes para cada criptografia.
Como o IV é necessário para a descriptografia, os algoritmos são projetados para que o IV não precise ser secreto ou, em outras palavras, um IV conhecido não reduza a segurança do algoritmo. Portanto, o IV pode ser passado para o lado da descriptografia junto com o texto cifrado.