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":
- 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").
- 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.
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:
- O remetente (Alice) deseja enviar uma mensagem segura para o destinatário (Bob).
- Alice gera uma nova chave de sessão simétrica aleatória.
- Alice criptografa sua mensagem real usando esta rápida chave de sessão simétrica.
- Alice obtém a chave pública de Bob. Ela a utiliza para criptografar apenas a pequena chave de sessão simétrica.
- Alice envia tanto a mensagem criptografada simetricamente quanto a chave de sessão criptografada assimetricamente para Bob.
- Bob recebe os dois itens. Ele primeiro usa sua chave privada para descriptografar a chave de sessão criptografada.
- 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.



