Esquemas de Criptografia Híbrida em Criptografia

LinuxBeginner
Pratique Agora

Introdução

No mundo da criptografia, frequentemente enfrentamos uma troca (trade-off) entre velocidade e segurança. Algoritmos de criptografia simétrica, como o AES, são muito rápidos e ideais para criptografar grandes volumes de dados, mas exigem uma chave secreta compartilhada que deve ser distribuída de forma segura tanto para o remetente quanto para o destinatário. Algoritmos de criptografia assimétrica, como o RSA, são excelentes para a troca segura de chaves usando um par de chaves pública/privada, mas são computacionalmente intensivos e lentos demais para criptografar dados em massa.

A criptografia híbrida resolve este problema combinando os pontos fortes de ambos os métodos. Ela utiliza a abordagem do "melhor dos dois mundos":

  1. Criptografia assimétrica é usada para criptografar e compartilhar de forma segura uma chave simétrica temporária e de uso único (frequentemente chamada de "chave de sessão").
  2. Criptografia simétrica é então usada com esta chave de sessão para criptografar os dados da mensagem reais e maiores de forma rápida e eficiente.

Neste laboratório, você implementará um esquema completo de criptografia híbrida do zero usando a ferramenta de linha de comando openssl. Você gerará um par de chaves RSA, criará uma chave de sessão AES aleatória, usará o RSA para criptografar a chave de sessão, usará o AES para criptografar uma mensagem e, finalmente, reverterá o processo para descriptografar a mensagem.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 100%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Visão Geral da Criptografia Híbrida

Nesta etapa, revisaremos brevemente os conceitos centrais que tornam a criptografia híbrida uma técnica poderosa e amplamente utilizada. Não há comandos para executar nesta etapa; o objetivo é construir uma base conceitual sólida antes de começarmos o trabalho prático.

Criptografia Simétrica (ex: AES)

  • Como funciona: Utiliza uma única chave secreta compartilhada tanto para criptografia quanto para descriptografia.
  • Força: Muito rápida e eficiente, tornando-a perfeita para criptografar grandes arquivos ou fluxos de dados.
  • Fraqueza: Distribuição da chave. Como você entrega a chave secreta compartilhada ao destinatário de forma segura? Se um invasor interceptar a chave, ele poderá descriptografar toda a comunicação.

Criptografia Assimétrica (ex: RSA)

  • Como funciona: Utiliza um par de chaves: uma chave pública para criptografia e uma chave privada para descriptografia. A chave pública pode ser compartilhada livremente, enquanto a chave privada deve ser mantida em segredo pelo seu proprietário.
  • Força: Resolve o problema da distribuição de chaves. Qualquer pessoa pode usar sua chave pública para criptografar uma mensagem para você, mas somente você pode descriptografá-la com sua chave privada.
  • Fraqueza: É matematicamente complexa e, portanto, muito mais lenta que a criptografia simétrica. É impraticável para criptografar grandes volumes de dados.

A Solução Híbrida

A criptografia híbrida combina esses dois métodos para obter a segurança da criptografia assimétrica e a velocidade da criptografia simétrica. Aqui está o fluxo de trabalho típico:

  1. O remetente (Alice) deseja enviar uma mensagem segura para o destinatário (Bob).
  2. Alice gera uma nova chave de sessão simétrica aleatória.
  3. Alice criptografa sua mensagem real usando esta rápida chave de sessão simétrica.
  4. Alice obtém a chave pública de Bob. Ela a utiliza para criptografar apenas a pequena chave de sessão simétrica.
  5. Alice envia tanto a mensagem criptografada simetricamente quanto a chave de sessão criptografada assimetricamente para Bob.
  6. Bob recebe os dois itens. Ele primeiro usa sua chave privada para descriptografar a chave de sessão criptografada.
  7. Agora que Bob possui a chave de sessão simétrica original, ele a utiliza para descriptografar rapidamente a mensagem real.

Este processo garante que os dados em massa sejam criptografados de forma eficiente, e a chave usada para essa criptografia seja trocada com segurança máxima. Nas etapas seguintes, implementaremos exatamente este fluxo de trabalho.

Gerar Chaves RSA e AES

Nesta etapa, geraremos os dois conjuntos de chaves necessários para o nosso esquema de criptografia híbrida: um par de chaves RSA (pública e privada) para a parte assimétrica, e uma chave de sessão aleatória para a parte simétrica (AES). Todas as operações serão realizadas no diretório ~/project.

Primeiro, vamos gerar uma chave privada RSA de 2048 bits. Esta chave deve ser mantida em segredo pelo destinatário.

openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048

Você verá alguma saída enquanto a chave está sendo gerada. Em seguida, precisamos extrair a chave pública correspondente da chave privada que acabamos de criar. Esta chave pública pode ser compartilhada com qualquer pessoa que queira lhe enviar uma mensagem criptografada.

openssl rsa -pubout -in private_key.pem -out public_key.pem

O comando exibirá writing RSA key.

Agora, vamos criar uma chave de sessão aleatória de 256 bits (32 bytes). Esta chave será usada com o algoritmo AES para criptografar nossos dados reais. Usamos openssl rand para gerar dados aleatórios criptograficamente fortes e os codificamos em Base64 para facilitar o manuseio.

openssl rand -base64 32 > session_key.key

Vamos listar os arquivos em nosso diretório para ver as chaves que criamos.

ls -l

Você deverá ver os três arquivos de chave que acabou de gerar, juntamente com o arquivo message.txt criado durante a configuração.

-rw-rw-r-- 1 labex labex   57 Oct 20 15:12 message.txt
-rw------- 1 labex labex 1704 Oct 20 15:14 private_key.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 15:14 public_key.pem
-rw-rw-r-- 1 labex labex   45 Oct 20 15:14 session_key.key

Criptografar Chave de Sessão com RSA

Nesta etapa, realizaremos uma parte crítica do processo de criptografia híbrida: criptografar a chave de sessão simétrica. Para garantir que apenas o destinatário pretendido possa usar a chave de sessão, a criptografaremos usando a chave pública RSA dele.

Usaremos o comando openssl pkeyutl, que é uma ferramenta para operações de chave pública. Vamos utilizá-lo para criptografar o arquivo session_key.key com a public_key.pem.

Execute o seguinte comando:

openssl pkeyutl -encrypt -pubin -inkey public_key.pem -in session_key.key -out encrypted_session_key.bin

Vamos detalhar este comando:

  • pkeyutl: A ferramenta de utilidade de chave pública (public key utility tool).
  • -encrypt: Especifica que queremos realizar uma operação de criptografia.
  • -pubin: Indica que a chave de entrada (-inkey) é uma chave pública.
  • -inkey public_key.pem: Especifica a chave pública a ser usada para criptografia.
  • -in session_key.key: O arquivo de entrada a ser criptografado (nossa chave de sessão AES).
  • -out encrypted_session_key.bin: O arquivo de saída onde a chave criptografada será armazenada.

Este comando cria um novo arquivo, encrypted_session_key.bin, que contém a chave de sessão em formato criptografado. Este arquivo pode agora ser transmitido com segurança, pois somente o proprietário da chave privada correspondente pode descriptografá-lo.

Vamos verificar a existência do arquivo recém-criado:

ls -l encrypted_session_key.bin

Você verá o arquivo binário contendo a chave criptografada.

-rw-rw-r-- 1 labex labex 256 Oct 20 15:14 encrypted_session_key.bin

Criptografar Dados com AES

Agora que protegemos nossa chave de sessão, podemos usar a chave de sessão original, não criptografada, para criptografar rapidamente nosso arquivo de dados principal, message.txt. Usaremos o cipher simétrico AES-256-CBC para esta tarefa.

O comando openssl enc exige que a chave (key) e o Vetor de Inicialização (Initialization Vector - IV) sejam fornecidos em formato hexadecimal. Nosso session_key.key está em Base64, então primeiro precisamos decodificá-lo e convertê-lo para hex. Também geraremos um IV aleatório. Armazenaremos ambos em variáveis de ambiente por conveniência.

Primeiro, converta a chave de sessão e armazene-a na variável AES_KEY:

export AES_KEY=$(cat session_key.key | base64 -d | xxd -p -c 32)

Em seguida, gere um IV aleatório de 128 bits (16 bytes) e armazene-o na variável AES_IV. Um IV é usado para garantir que a criptografia do mesmo texto simples múltiplas vezes resulte em textos cifrados diferentes.

export AES_IV=$(openssl rand -hex 16)

Com a chave e o IV prontos, podemos agora criptografar message.txt usando openssl enc:

openssl enc -aes-256-cbc -in message.txt -out encrypted_message.dat -K $AES_KEY -iv $AES_IV

Vamos revisar as opções do comando:

  • -aes-256-cbc: Especifica o cipher AES-256 no modo CBC.
  • -in message.txt: O arquivo de dados de entrada.
  • -out encrypted_message.dat: O arquivo de saída para os dados criptografados.
  • -K $AES_KEY: A chave de criptografia em formato hex (K maiúsculo).
  • -iv $AES_IV: O vetor de inicialização em formato hex.

Neste ponto, o remetente empacotaria encrypted_message.dat, encrypted_session_key.bin e o IV ($AES_IV) para enviar ao destinatário. Para este laboratório, temos todos os arquivos em nosso diretório, prontos para a etapa de descriptografia.

Vamos verificar se o arquivo de dados criptografado foi criado:

ls -l encrypted_message.dat
-rw-rw-r-- 1 labex labex 64 Oct 20 15:14 encrypted_message.dat

Descriptografar Mensagem

Nesta etapa final, simularemos as ações do destinatário. O destinatário recebeu os dados criptografados (encrypted_message.dat), a chave de sessão criptografada (encrypted_session_key.bin) e o IV. Ele usará sua chave privada secreta para reverter o processo e recuperar a mensagem original.

Primeiro, o destinatário deve descriptografar a chave de sessão usando sua private_key.pem.

openssl pkeyutl -decrypt -inkey private_key.pem -in encrypted_session_key.bin -out decrypted_session_key.key

Este comando usa pkeyutl com o flag -decrypt e a chave privada para recuperar a chave de sessão AES original, salvando-a em decrypted_session_key.key.

Podemos verificar rapidamente se a chave descriptografada é idêntica à original que criamos na Etapa 2. O comando diff não deve produzir nenhuma saída se os arquivos forem iguais.

diff session_key.key decrypted_session_key.key

Agora que temos a chave de sessão, podemos descriptografar a mensagem principal. Assim como na etapa de criptografia, precisamos primeiro converter a chave para o formato hex.

export DECRYPTED_AES_KEY=$(cat decrypted_session_key.key | base64 -d | xxd -p -c 32)

Finalmente, use openssl enc com o flag -d (decrypt/descriptografar), fornecendo a mesma chave e IV que foram usados para criptografar. (A variável $AES_IV ainda está definida em nosso shell a partir da etapa anterior).

openssl enc -d -aes-256-cbc -in encrypted_message.dat -out decrypted_message.txt -K $DECRYPTED_AES_KEY -iv $AES_IV

O processo está completo! A mensagem original foi recuperada e salva em decrypted_message.txt. Vamos visualizar seu conteúdo para confirmar nosso sucesso.

cat decrypted_message.txt

Você deverá ver a mensagem secreta original impressa no seu terminal:

This is a secret message that needs to be sent securely.

Resumo

Neste laboratório, você implementou com sucesso um fluxo completo de criptografia e descriptografia híbrida usando OpenSSL. Você adquiriu experiência prática com os conceitos fundamentais que protegem grande parte da nossa comunicação digital.

Você aprendeu a:

  • Gerar um par de chaves RSA para criptografia assimétrica.
  • Criar uma chave de sessão AES aleatória para criptografia simétrica.
  • Proteger a chave de sessão usando a chave pública RSA.
  • Criptografar eficientemente grandes volumes de dados usando a chave de sessão AES.
  • Inverter o processo descriptografando a chave de sessão com a chave privada RSA e, em seguida, descriptografando os dados.

Esta abordagem de "o melhor dos dois mundos", que combina a segurança da criptografia assimétrica para troca de chaves com a velocidade da criptografia simétrica para criptografia de dados, é um pilar dos protocolos de segurança modernos como TLS/SSL que protegem seus dados na internet todos os dias.