Utilizando chaves assimétricas GnuPG para troca de mensagens criptografadas

por Danilo Magrini – Twitter: @DaniloMagrini

Todos sabemos que nossas informações não estão completamente seguras quando trafegam pela internet. Seja uma mensagem de texto ou um arquivo, qualquer um deles pode ser interceptado por um “pirata da internet”.

Quando essa mensagem ou arquivo não necessitam de segurança, não precisamos nos preocupar. O problema começa quando essas mensagens passam a ter certa relevância e consequentemente exigem um maior sigilo e segurança. É nesse momento que criptografar mensagens torna-se algo necessário.

Chaves assimétricas

Não vou me ater muito em explicar sobre criptografia, tipos de criptografia e dos diversos recursos que temos para utilizar criptografia. Vou focar principalmente no assunto que estamos tratando.

chave assimétrica, também conhecido por criptografia de chave pública, consiste na troca de mensagens criptografadas através de um par de chaves crioptograficas. A primeira, chamada de chave pública, serve para que qualquer pessoa, de posse desta, codifique mensagens e/ou arquivos para o proprietário da chave pública; a segunda, chamada de chave privada, deve ser mantida em absoluto sigilo e serve para que o proprietário desta decodifique as mensagens criptografadas por meio da sua chave pública equivalente.

Existem funcionalidades extras como assinar uma mensagem ou marcar uma chave de terceiro como confiável e assim por diante. Algumas dessas funcionalidades extras serão tratadas mais adiante.

Gerando as chaves assimétricas

Para a geração das chaves de criptografia iremos utilizar um aplicativo chamado GnuPG que é uma implementação do projeto GNU, 100% compatível com o padrão OpenPGP definido pela RFC4880 e que vem instalada por padrão na maioria das distribuições Linux. Também existe uma versão para Windows® que pode ser encontrada no site oficial do GnuPG.

Iremos utilizar uma interface gráfica sempre que possível, porém isso gera um problema, pois cada pessoa utiliza uma distribuição e um gerenciador de janelas. Como minha distribuição atual é o Ubuntu, então vou fazer esse tutorial baseado na versão 10.10 dessa distribuição.

Para podermos criar as chaves, vamos inicialmente abrir o “Gerenciador de Senhas e Chaves de Criptografia” que na versão pt_BR do Ubuntu pode ser encontrado no menu SISTEMA -> PREFERÊNCIAS -> SENHAS E CHAVES DE CRIPTOGRAFIA.

Agora siga os procedimentos abaixo para a criação das chaves:

1) Selecione ARQUIVO -> NOVO;



2) Em seguida CHAVE PGP e CONTINUAR;

3) Preencha os campos solicitados com seus dados e clique em CRIAR:

4) Digite preferencialmente uma senha forte (com letras maiúsculas e minúsculas, números e símbolos) e clique em OK para dar início a geração da chave de criptografia.

Obs.: O processo de criação das chaves vai depender do poder de processamento do seu hardware, mas via de regra é normal que demore um pouco.

Importante: Durante a criação das chaves é importante que você fique digitando, aleatoriamente, letras e números no seu teclado e movimentando o mouse. Isso faz com que o nível de entropia aumente, ou seja, você da mais poder de criptografia a sua chave. Mais sobre entropia aqui.

6) Pronto. Chave gerada! Agora é só clicar na aba MINHAS CHAVES PESSOAIS e confirmar se sua chave foi gerada.

O conceito de criptografia usando chaves assimétricas

Uma vez que o par de chaves (pública e privada) foram criadas, estamos pronto para trocar mensagens criptografadas, porém é importante entendermos o a teoria antes de irmos para a prática.

Para que uma mensagem (entenda por mensagem um texto qualquer ou um arquivo) seja criptografada precisamos de uma chave pública, ou seja, se eu quero enviar uma mensagem criptografada a alguém eu preciso da chave pública dessa pessoa. A recíproca também é verdadeira. Se alguém deseja me mandar uma mensagem criptografada, essa pessoa precisa ter a minha chave pública. Nesse caso, para que serve a chave privada?

Bom, a chave privada será a responsável pela descriptografia, ou seja, é através da chave privada que você irá decifrar a mensagem fazendo com que seja possível a visualização da mensagem original. É por isso que a chave primária (e sua senha é claro) devem ser guardadas com muito cuidado pois de posse dela e da senha um indivíduo mal-intencionado pode abrir suas mensagem cifradas.

Reparem que o nível de segurança é elevado pois mesmo de posse da sua chave privada ainda é necessário descobrir a senha para que essa chave privada tenha alguma utilidade. Ainda assim é de extrema importância guardar a sete chaves a sua chave privada bem como o backup da mesma.

Já com a chave pública não é necessário tanto zelo, pois o máximo que poderão fazer com sua chave pública é enviar mensagens criptografadas que somente você com sua chave privada poderá abrir. Isso mesmo! Nem mesmo a própria pessoa que acabou de criptografar uma mensagem pra você conseguirá decifrá-la novamente. Lembrando que a chave pública não possui nenhuma informação sobre sua chave privada, portanto é impossível descobrir ou regerar uma chave privada a partir de uma chave pública.

Sendo assim, o mais comum é que a chave pública seja enviada para um servidor de chaves para que fique disponível e acessível para qualquer pessoa, a menos que você queira restringir as pessoas que poderão lhe enviar mensagens criptografadas.

Nesse caso o melhor mesmo é utilizar uma outra forma de envio da chave como uma mídia removível (pen-drive, cd, dvd, sd card, etc) ou através de um e-mail, porém em qualquer um dos casos a garantia de sigilo da chave pública não é garantido (e nem precisa!).

Como compartilhar minha chave pública?

O que vamos fazer agora é gerar um arquivo com a nossa chave pública a partir do nosso “chaveiro” ou melhor, do gerenciador de Senhas e Chaves de Criptografia. O procedimento é bem simples, basta clicar com o botão direito do mouse sobre a chave que você deseja exportar a chave pública e selecionar EXPORTAR…

Selecione o local para onde a chave deve ser gravada e clique em SALVAR. Pronto! Sua chave pública já pode ser compartilhada da forma que você achar melhor. Se você preferir disponibilizá-la em um servidor de chaves também é possível, basta selecionar o menu REMOTO -> SINCRONIZAR E PUBLICAR CHAVES:

Se o seu botão SINCRONIZAR estiver desabilitado, significa que você deverá selecionar qual o servidor que você deseja subir e baixar as chaves públicas. No meu caso eu utilizo o http://keyserver.ubuntu.com/ que já vem disponível por padrão, basta clicar em SERVIDOR DE CHAVES e na opção PUBLICA CHAVES PARA: selecionar hkp://keyserver.ubuntu.com:11371

A seleção da opção SINCRONIZAR AUTOMATICAMENTE… é opcional, porém eu acho importante selecionar para que possíveis alterações ou revogações de chaves que vocẽ já possua possam ser sincronizadas. Veremos sobre revogação mais a frente.

Agora basta clicar em FECHAR e selecionar a opção SINCRONIZAR.

Pronto. Sua chave pública já está no servidor pronta para ser compartilhada. Se o interessado na sua chave pública também usar o seahorse (também conhecido por nós como “gerenciador de Senhas e Chaves de Criptografia) então ele pode simplesmente abrir a opção LOCALIZAR CHAVES REMOTAS localizada no menu REMOTO.

Para localizar uma chave pública, basta digitar o ID ou Nome da Chave. Uma outra janela vai abrir contendo o resultado da sua busca. Basta selecionar e clicar em IMPORTAR. Lembrando que as chaves públicas importadas ficam localizadas na aba OUTRAS CHAVES.

Caso você queira o link direto para a sua chave pública, acesse o site http://keyserver.ubuntu.com digite o nome da sua chave pública (ou o ID precedido de “0x”) e clique em ENVIAR DADOS.

Na página de retorno, basta clicar na sua chave pública e copiar a URL que abrir, ou clique com o direito do mouse sobre o link da sua chave pública e selecione COPIAR LINK. O link em questão é o do tipo pub.

A URL para a sua chave pública deve ser próxima disso: http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0xC5A74806E08EEF28

Cifrando e Decifrando Mensagens

Como eu já disse anteriormente, vou tentar ao máximo utilizar telas gráficas para todos os procedimentos do artigo. Essa bobagem de associar “tela preta” ou “linha de comando” com o Linux está na hora de terminar e a velha máxima de “Usuário bom mesmo trabalha na linha de comando” tem que cair.

Algumas configurações avançadas de mail server, file server, web server, ldap e afins são feitos na linha de comando por não possuirem uma interface visual que atenda todas as exigências, porém quando temos disponível uma GUI para executar uma determinada tarefa, vamos utilizá-la, por que não?

Para isso vamos instalar alguns plugins do seahorse que habilitam as opções de criptografia e assinatura de arquivos através do Nautilus e criptografia e assinatura através do gedit (editor de texto padrão no Ubuntu). O nome do pacote a ser instalado para ativar as funcionalidades descritas acima é seahorse-plugins, que pode ser instalado de forma visual pelo Synaptic ou via linha de comando através do apt-get. Não vou entrar em detalhes de como fazer a instalação, pois isso pode ser encontrado facilmente na web. Vou apenas colocar um screenshot do pacote no Synaptic e considerar que os plugins foram instalados.

No meu caso, após a instalação do pacote acima, o menu do Nautilus não habilitou as funcionalidades desejadas. Isso é porque é necessário que a gente execute um deamon do Seahorse que no caso poderiamos fazer manualmente, mas acho que a forma mais simples é reiniciar a sessão do usuário ou se preferir reiniciar o Ubuntu.

Considerando que já reiniciamos a sessão do usuário ou o Ubuntu, vamos dar início a parte prática de cifrar e decifrar mensagens. Vamos inicialmente aprender como criptografar arquivos para depois irmos para a criptografia de textos.

Cifrando e Decifrando Arquivos

Abra o seu gerenciador de arquivos Nautilus e selecione um arquivo qualquer de sua preferência. Vale lembrar que quanto maior o arquivo mais tempo demora para a criptografá-lo. Eu abri o diretório Exemplos que por padrão já vem com dois arquivos, um de vídeo e outro de áudio, ambos do tipo OGG, porém o tipo de arquivo aqui é irrelevante pois você pode cifrar arquivos texto ou binário sem problemas.

Clique com o botão direito do mouse sobre o arquivo que você deseja criptografar e selecione a opção CRIPTOGRAFAR… , uma tela irá aparecer solicitando para que você selecione um ou mais destinatários, ou seja, irá aparecer para você todas as chaves públicas existentes no seu chaveiro Seahorse. No meu caso apareceram 3 opções, pois são as chaves públicas que eu tenho, mas se no seu caso aparecer apenas uma não tem problema pois iremos criptograr a mensagem para nós mesmos utilizando o par de chaves que criamos a pouco.

O ideal é entender o conceito e depois realizar testes reais de troca de mensagens cifradas com outras pessoas. No final do artigo eu adicionei o link para a minha chave pública caso alguém queira fazer alguns testes.

Segue abaixo a imagem da tela descrita:

Repare que o item ASSINAR MENSAGEM COMO está selecionada a opção NENHUM pois ainda não vamos assinar a mensagem. Agora basta clicar OK e um outro arquivo com extensão .GPG será criado no mesmo diretório. Vale lembrar que em alguns casos o arquivo pode ter o seu tamanho reduzido consideravelmente já que é aplicado um algoritmo de criptografia e portanto o conteúdo anterior do arquivo foi substituído por um conteúdo criptografado. Porém assim que o destinatário descriptografar o arquivo, este volta ao tamanho original… é claro!

Nesse momento temos concluída a primeira etapa do processo de criptografia, isso quer dizer que se você fosse enviar um arquivo criptografado para alguém, o procedimento estaria encerrado bastando você decidir qual forma de envio utilizar, que nesse momento já não importa muito já que a mensagem está criptografada e somente o destinatário de posse da chave privada poderá decifrá-la novamente.

Vamos agora para o outro procedimento que é abrir uma mensagem cifrada. Lembrando que no nosso caso nós iremos abrir a mesma mensagem que a gente criptografou, mas na prática poderiamos ter recebido esse arquivo criptografado por alguém que possuia a nossa chave pública.

Para descriptografar, basta dar dois cliques sobre o arquivo com extensão .GPG ou clicar o botão direito do mouse e selecionar a primeira opção do menu que é ABRIR COM DESCRIPTOGRAFAR ARQUIVO , tradução um pouco estranha mas é essa a opção.

Uma tela se abrirá solicitando o nome e o diretório de destino para o arquivo que será decifrado. Terminando é só clicar em SALVAR e a tela abaixo irá se abrir solicitando a senha da sua chave primária que será utilizada para descriptografar o arquivo em questão:

É só digitar a senha corretamente o pronto, o arquivo descriptografado estará no diretório selecionado anteriormente. Isso conclui o primeiro processo de troca de arquivos criptografados. Porém ainda temos que voltar na opção de assinatura de mensagem.

Assinar uma mensagem antes de enviá-la não é um procedimento obrigatório como já vimos, porém assinar uma mensagem criptografada é uma forma de dizer ao destinatário quem enviou realmente aquela mensagem.

Imagine que eu sou uma pessoa má intencionada e sei que você troca arquivos criptografados com outras pessoas e portanto provavelmente confia na origem desses arquivos.

O que eu poderia fazer é pegar sua chave pública (que provavelmente estará disponível), criptografar um arquivo com código malicioso, e enviar a você me passando talvez por outra pessoa. Você provavelmente abriria o arquivo e talvez o executaria ou confiaria no seu conteúdo caso fosse um documento falso.

É aí que entra a assinatura de mensagens; o remetente utiliza sua chave pública para criptografar um arquivo pra você e logo em seguida assina essa mensagem com a chave privada e quando você receber o arquivo e for descriptografá-lo, pode ter plena certeza de que foi o remetente X quem enviou a mensagem para você. Parece complicado, mas na prática não muda muita coisa (são as vantagens de usar uma interface gráfica).

Execute o mesmo procedimento que executou para criptografar um arquivo, porém agora basta selecionar em ASSINAR MENSAGEM COMO a sua chave privada. No nosso exemplo, teremos o mesmo par de chaves pública e privada, porém quando trocar mensagens criptografadas com um terceiro você irá cifrar a mensagem com a chave pública do destinatário mas irá assinar a mensagem com sua chave privada:

Ao clicar em OK a senha da sua chave privada será solicitada e o restante do processo é exatamente o mesmo de quando não assinamos a mensagem. Para descriptografar o arquivo cifrado e assinado o procedimento também é exatamente o mesmo, porém uma mensagem de notificação é exibida informando dados da assinatura da mensagem:

Cifrando e Decifrando Textos

Para cifrar textos, iremos utilizar o gedit pois ao instalarmos o pacotes seahorse-plugins o plugin para criptografia de textos no gedit já foi instalado, bastando para isso ativá-lo no gedit. Abre o gedit através do menu APLICATIVOS -> ACESSÓRIOS -> EDITOR DE TEXTO. Uma vez aberto vá no menu EDITAR -> PREFERÊNCIAS e selecione a aba PLUGINS. Procure pelo plugin chamado CRIPTOGRAFIA DE TEXTO, selecione e clique em FECHAR conforme figura abaixo:

Agora é só começar. Digite um texto qualquer (ou copie e cole de um lugar qualquer), selecione o texto todo ou digite CTRL+A e abra o menu EDITAR. Como você pode ver, temos praticamente as mesmas opções que tinhamos no menu de criptografia do Nautilus. Nesse caso o processo é o mesmo, basta clicar em CRIPTOGRAFAR… e seguir os mesmos passos do que fizemos quando ciframos arquivos. O resultado do texto criptografado será algo similar a imagem abaixo, variando de acordo com o tamanho do texto criptografado:

Uma vez que o texto foi criptografado podemos enviar para o destinatário por e-mail ou de um outro meio eletrônico qualquer. Para descriptografar a mensagem, basta fazer o mesmo processo, ou seja, selecionar todo o texto, abrir o menu EDITAR -> DESCRIPTOGRAFAR/VERIFICAR. O resultado será a mensagem original e a notificação caso a mensagem tenha sido assinada.

CONCLUSÃO

Concluimos assim todo o processo de criptografia e descriptografia de mensagens (texto e arquivo) usando chaves assimétricas. Obviamente que o assunto criptografia usando GPG está longe de chegar ao fim. Ainda temos alguns assuntos que não fazem parte do escopo desse artigo como Revogação de chaves, Impressão Digital, Atribuição de confiança da chave, Assinar uma chave pública, Data de expiração, Adição de nomes e e-mail a uma chave, etc.

Existem alguns aplicativos e plugins que facilitam ainda mais a troca de mensagens criptografadas como por exemplo:

  1. FireGPG : é um complemento do Firefox sob MPL que gera apenas uma interface integrada para aplicar operações GnuPG para o texto de qualquer página da web, incluindo criptografar, descriptografar e verificar assinaturas. Esse complemento também se integrava com o Gmail tornando automática e transparente a troca de e-mails e anexos criptografados. Infelizmente o projeto foi descontinuado e atualmente não oferece mais suporte ao Gmail.
  2. Evolution : o cliente de e-mail Evolution também tem suporte ao GPG, o que torna a troca de mensagens criptografadas muito simples, fácil e rápida. Ele automaticamente criptografa os textos do e-mail e também os anexos, basta que você informe as configurações necessárias.
  3. Enigmail : é um complemento do cliente de e-mail Thunderbird e/ou SeaMonkey que também torna transparente a troca de mensagens criptografadas através do GPG.

Provavelmente existem muitos outros plugins, clientes de e-mail ou complementos que ajudem nesse processo, porém os que eu já utilizei e garanto a funcionalidade são os mencionados acima.

Como eu havia citado acima, segue minha chave pública caso alguém queira me mandar alguma mensagem cifrada para testes ou não. Meu e-mail é danilo.magrini(AT)gmail(DOT)com. Comentem, opinem, divulguem esse artigo e me sigam @DaniloMagrini ! Espero que tenham gostado.

Obs.: Jamais saberão o que escrevi abaixo (lol):

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.10 (GNU/Linux)

hQEMA1dBL5dLEYl7AQgAiFrG0mUGjexai3zmirJEnyUn46l0UFy3OgOlassSnJmE
z02EegFFKTTu73GvExqvXmraflxR6AFaXad54z1DtCU8cpHDtlTwM1QucN3M/dy1
qxRjgCishKB8fvpgqzz0NB/RNaa+uvIhP8SQ61SNT5oMasn8v1ASGUU1t1irq9ek
zJqOWRUneBjhfA/0BewT85tfNeH/fK20jQuMcV6WucyMZmyBhcexjmtn8d99u+e9
qX+itEfb/AiWgwxBjgGmhXf/tUf2c9X918zkuJAEknSoleRbQALw8+Ex8KEjKYem
tJP0RUhfs18HCFLIefmnhJ82UD2Hiwub1o5/gKTZydLAyAGT4gyo322COsrQO4HL
czD65cPZR4cJero2M3kpSdmpJO4zmEfsFv5pGzufY6j701jaGFsMog6fGWgIkWaX
gnieY/sQFW78n2L/RKH2Z33Grp6RnpRF2KzybxZLgBNIioCtPRhWBtfZRY1RVE+U
XU1OKt/WJfo8eJXV5P7n679L1UA0C42vTdum6cpJT9nywJbo3zm2nZhq/wI1f7DK
GdC/6IFZmmkMSlCYaaN480t4UUdwX+dIT0XrUH7EtKyqjKnk2XXiFNhnr6l/WLHe
kvRvibsHw8x3/Uo5TrQlo3W8ajINlUV05FlVlxbzb4gozO/QU8oxUbdyNCsGKl2c
NYsMTCL/qsGkJbwv4oaDUqEi/1vjX+3/ACusDfej1tfY4iU5uITAN0natOQ6Kjfs
Kwxn06LsaelJ+QiuWmVWdGZYdYj8L5JLhQIUJpgrAggSws8Nr0vrReJiozpX/9I2
6HxjqLRGoeige0SBXBU4wxbTabo4OukJC7qPM5JKIOTDHbdg/9k4tEPV
=2uom
-----END PGP MESSAGE-----