Troca Básica de Chaves com Diffie-Hellman em Criptografia

LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, você explorará os fundamentos da troca de chaves Diffie-Hellman (DH), um pilar da criptografia moderna. O protocolo DH permite que duas partes, que não têm conhecimento prévio uma da outra, estabeleçam conjuntamente uma chave secreta compartilhada através de um canal de comunicação inseguro. Este segredo compartilhado pode então ser usado para criptografar comunicações subsequentes usando um cifrador de chave simétrica.

Você utilizará a poderosa ferramenta de linha de comando openssl para simular todo o processo DH. Isso inclui a geração dos parâmetros públicos, a criação de chaves privadas e públicas para duas partes separadas e, finalmente, a derivação e verificação do segredo compartilhado. Ao final deste laboratório, você terá uma compreensão prática de como funciona este aperto de mão criptográfico essencial.

Princípio da Troca de Chaves Diffie-Hellman

Nesta etapa, abordaremos o princípio teórico da troca de chaves Diffie-Hellman. Não há comandos para executar nesta etapa; o objetivo é entender o conceito antes de implementá-lo.

O processo funciona da seguinte forma:

  1. Acordo sobre Parâmetros Públicos: Duas partes, chamemos de Alice e Bob, primeiro concordam com dois números públicos: um número primo grande p (o módulo) e uma base g (o gerador). Esses números não são secretos e podem ser transmitidos por um canal inseguro.

  2. Geração da Chave Privada:

    • Alice escolhe um inteiro privado secreto a. Ela mantém este número para si.
    • Bob escolhe um inteiro privado secreto b. Ele mantém este número para si.
  3. Cálculo da Chave Pública:

    • Alice calcula sua chave pública A usando a fórmula: A = g^a \mod p. Ela envia esta chave pública A para Bob.
    • Bob calcula sua chave pública B usando a fórmula: B = g^b \mod p. Ele envia esta chave pública B para Alice.
  4. Derivação do Segredo Compartilhado:

    • Alice recebe a chave pública B de Bob e calcula o segredo compartilhado S usando sua própria chave privada a: S = B^a \mod p.
    • Bob recebe a chave pública A de Alice e calcula o segredo compartilhado S usando sua própria chave privada b: S = A^b \mod p.

Devido às propriedades da aritmética modular, tanto Alice quanto Bob chegarão exatamente ao mesmo valor para S.

  • Cálculo de Alice: S = (g^b \mod p)^a \mod p = g^{ba} \mod p
  • Cálculo de Bob: S = (g^a \mod p)^b \mod p = g^{ab} \mod p

Um espião no canal pode ver p, g, A e B, mas não pode facilmente calcular as chaves privadas a ou b. Essa dificuldade é conhecida como o problema do logaritmo discreto, que forma a base da segurança da troca Diffie-Hellman.

Nas etapas seguintes, você usará o openssl para executar estas ações.

Gerar Parâmetros Diffie-Hellman

Nesta etapa, você gerará os parâmetros DH públicos (p e g) que ambas as partes usarão. A ferramenta openssl pode lidar com a matemática complexa de encontrar um primo e um gerador adequados para você. Todas as operações neste laboratório serão realizadas no diretório padrão ~/project.

Use o comando openssl dhparam para gerar os parâmetros. Especificaremos um tamanho de chave de 2048 bits, que é um comprimento comum e seguro para este propósito.

Execute o seguinte comando no seu terminal:

openssl dhparam -out dhparam.pem 2048

Vamos analisar este comando:

  • openssl dhparam: Invoca a ferramenta de gerenciamento de parâmetros DH no OpenSSL.
  • -out dhparam.pem: Esta flag especifica que a saída deve ser salva em um arquivo chamado dhparam.pem.
  • 2048: Este é o comprimento em bits desejado para o módulo primo p.

Este comando pode levar um minuto para ser concluído, pois ele procura por um número primo forte. Você verá uma saída semelhante à seguinte enquanto ele estiver em execução:

Generating DH parameters, 2048 bit long safe prime

Após a conclusão, um arquivo chamado dhparam.pem será criado no seu diretório atual. Este arquivo contém os parâmetros públicos que ambas as partes usarão para a troca de chaves.

Gerar Chaves da Parte A

Nesta etapa, você simulará as ações da primeira parte, a "Parte A". A Parte A usará os parâmetros DH compartilhados da etapa anterior para gerar sua própria chave privada e, em seguida, derivar uma chave pública correspondente.

Primeiro, gere a chave privada da Parte A. Esta chave é o número secreto a do nosso exemplo teórico. Usaremos o comando openssl genpkey, que é uma utilidade de geração de chaves de propósito geral.

Execute o seguinte comando para gerar a chave privada da Parte A:

openssl genpkey -paramfile dhparam.pem -out a_private_key.pem
  • genpkey: O comando para gerar uma chave privada.
  • -paramfile dhparam.pem: Isso instrui o genpkey a usar os parâmetros do nosso arquivo dhparam.pem para criar uma chave DH.
  • -out a_private_key.pem: Isso salva a chave privada gerada no arquivo a_private_key.pem.

Em seguida, a Parte A precisa derivar sua chave pública a partir da chave privada. A chave pública é o que será compartilhado com a Parte B.

Execute este comando para extrair a chave pública:

openssl pkey -in a_private_key.pem -pubout -out a_public_key.pem
  • pkey: Um comando para gerenciar chaves públicas e privadas.
  • -in a_private_key.pem: Especifica a chave privada de entrada.
  • -pubout: Esta flag instrui o comando a gerar a parte pública da chave.
  • -out a_public_key.pem: Salva a chave pública resultante em a_public_key.pem.

Agora você tem dois novos arquivos: a_private_key.pem, que a Parte A deve manter em segredo, e a_public_key.pem, que a Parte A enviaria para a Parte B através do canal inseguro.

Gerar Chaves da Parte B

Nesta etapa, você executará as mesmas ações para a segunda parte, a "Parte B". A Parte B opera independentemente da Parte A, mas usa os mesmos parâmetros DH públicos de dhparam.pem.

Primeiro, gere a chave privada da Parte B. Isso corresponde ao número secreto b em nosso exemplo teórico.

Execute o seguinte comando:

openssl genpkey -paramfile dhparam.pem -out b_private_key.pem

Este comando é idêntico em estrutura ao usado para a Parte A, mas estamos salvando a saída em b_private_key.pem para distingui-la.

Em seguida, assim como a Parte A, a Parte B deve derivar sua chave pública de sua nova chave privada.

Execute este comando para extrair a chave pública da Parte B:

openssl pkey -in b_private_key.pem -pubout -out b_public_key.pem

Neste ponto de uma troca no mundo real, a Parte A teria a chave pública da Parte B (b_public_key.pem), e a Parte B teria a chave pública da Parte A (a_public_key.pem). Ambas as partes mantiveram suas respectivas chaves privadas em segredo. Você simulou com sucesso a porção de geração e troca de chaves do protocolo.

Calcular Segredo Compartilhado

Esta é a etapa final e mais importante. Aqui, ambas as partes usarão sua própria chave privada e a chave pública da outra parte para calcular independentemente o segredo compartilhado. Se o protocolo for bem-sucedido, ambas chegarão exatamente ao mesmo valor secreto.

Primeiro, vamos calcular o segredo compartilhado da perspectiva da Parte A. A Parte A usa sua chave privada (a_private_key.pem) e a chave pública da Parte B (b_public_key.pem).

Execute o seguinte comando:

openssl pkeyutl -derive -inkey a_private_key.pem -peerkey b_public_key.pem -out a_shared_secret.bin
  • pkeyutl: Uma utilidade para realizar operações de chave pública.
  • -derive: Esta ação instrui a utilidade a derivar um segredo compartilhado.
  • -inkey a_private_key.pem: Especifica a chave privada da própria Parte A.
  • -peerkey b_public_key.pem: Especifica a chave pública da outra parte (o "par" ou "peer").
  • -out a_shared_secret.bin: Salva o segredo binário resultante em um arquivo.

Em seguida, calcule o segredo compartilhado da perspectiva da Parte B. A Parte B usa sua chave privada (b_private_key.pem) e a chave pública da Parte A (a_public_key.pem).

Execute o seguinte comando:

openssl pkeyutl -derive -inkey b_private_key.pem -peerkey a_public_key.pem -out b_shared_secret.bin

Agora, você tem dois arquivos, a_shared_secret.bin e b_shared_secret.bin. Para verificar o sucesso da troca de chaves, esses dois arquivos devem ser idênticos. Você pode usar o comando cmp (comparar) para verificar isso.

cmp a_shared_secret.bin b_shared_secret.bin

Se os arquivos forem idênticos, este comando não produzirá nenhuma saída e será encerrado silenciosamente. Esse silêncio significa sucesso!

Para uma confirmação mais visual, você também pode calcular o hash criptográfico de ambos os arquivos. Os hashes devem corresponder.

sha256sum *.bin

Você deverá ver uma saída onde ambos os arquivos têm exatamente o mesmo hash SHA256. Os valores de hash reais variarão entre as execuções, mas eles devem ser idênticos para ambos os arquivos:

e3705a4ab5ae5d86f59dfe968f0177b49d5144e2d731dbd8d41b2eda318412ec  a_shared_secret.bin
e3705a4ab5ae5d86f59dfe968f0177b49d5144e2d731dbd8d41b2eda318412ec  b_shared_secret.bin

Parabéns, você realizou com sucesso uma troca de chaves Diffie-Hellman!

Resumo

Neste laboratório, você simulou com sucesso uma troca de chaves Diffie-Hellman completa usando a ferramenta de linha de comando openssl. Você adquiriu experiência prática com as etapas fundamentais deste protocolo criptográfico crucial.

Você aprendeu a:

  • Gerar parâmetros DH públicos compartilhados (openssl dhparam).
  • Criar pares de chaves privada e pública para duas partes separadas com base nesses parâmetros (openssl genpkey e openssl pkey).
  • Derivar um segredo compartilhado a partir da chave privada de um e da chave pública de um par (openssl pkeyutl -derive).
  • Verificar que ambas as partes calcularam independentemente o mesmo segredo exato, provando o sucesso da troca.

Este processo é um bloco de construção fundamental para sistemas de comunicação seguros, como TLS/SSL, que protegem dados na internet. Você agora tem uma compreensão prática de como duas partes podem estabelecer um canal seguro para comunicação, mesmo começando em uma rede insegura.