AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79485697
Accepted
Gary
Gary
Asked: 2025-03-05 15:03:00 +0800 CST2025-03-05 15:03:00 +0800 CST 2025-03-05 15:03:00 +0800 CST

Comprimento da tag e aad do OpenSSL aes-256-gcm?

  • 772

Na criptografia OpenSSL em PHP usando aes-256-gcm, o tag_lengthvalor é 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.

openssl
  • 1 1 respostas
  • 82 Views

1 respostas

  • Voted
  1. Best Answer
    Topaco
    2025-03-05T16:47:36+08:002025-03-05T16:47:36+08:00

    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_lengthe é 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 exemplo IV|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):

    $ct = openssl_encrypt('my secret data', 'aes-128-gcm', '0123456789012345', 0, '012345678901', $tag, "my aad", 12); // 12 bytes tag
    print('Tag: ' . bin2hex($tag) . PHP_EOL); // Tag: 095c111ecb13b0d411878dfd
    $dt = openssl_decrypt($ct, 'aes-128-gcm', '0123456789012345', 0, '012345678901', $tag, "my aad");
    print('Decrypted: ' . $dt); // Decrypted: my secret data
    

    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.

    • 2

relate perguntas

  • Como converter uma chave pública PEM PKCS#8 em DER/Raw-Binary

  • Convertendo chave pública DER em PEM e vice-versa

  • Crie um certificado e CSR a partir da chave pública exportada do HSM

  • OpenSSL: tente decodificar dados DER

  • openssl: falha EVP_PKEY_derive

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve