Pular para o conteúdo
01/10/2007 / Thiago

GnuPG

Muito tempo que não publico nada? Verdade, mas para tudo existe um motivo. Desde o dia 4 de setembro estou morando em outro país para a realização de um curso de Mestrado em Engenharia Informática. Esse curso com certeza irá me ocupar um bom tempo. Mas sempre que puder estarei por aqui escrevendo algo interessante que aprender. Porém minha intenção aqui é falar hoje sobre o GnuPG e descrever seu uso simples.

O GnuPG (GNU Privacy Guard), de maneira simples, é um software livre que permite o uso de criptografia PGP (Pretty Good Privacy). O GNU Privacy Guard, como o nome sugere, é um software vinculado ao projeto GNU, fazendo parte das principais ferramentas de código aberto disponíveis. Vou demonstrar o uso cotidiano de algumas funções dessa ferramenta.

Criando Par de Chaves

O GnuPG utiliza um esquema de criptografia assimétrica, o que significa que em uma transação criptografada, são utilizadas um par de chaves, uma privada e outra pública. A geração das chaves pode ser feito de maneira simples em uma console através da ferramenta GnuPG, que é invocada através do comando gpg. O comando abaixo irá iniciar o processo interativo de criação das chaves. Caso seja a primeira vez a executar o comando, será também criado os arquivos necessários para o armazenamento das chaves geradas e importadas.

$ gpg –gen-key
gpg (GnuPG) 1.4.6; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

gpg: diretório `/home/usuario/.gnupg’ criado
gpg: novo arquivo de configuração `/home/usuario/.gnupg/gpg.conf’ criado
gpg: AVISO: as opções em `/home/usuario/.gnupg/gpg.conf’ não estão ativas ainda durante este funcionamento
gpg: chaveiro `/home/usuario/.gnupg/secring.gpg’ criado
gpg: chaveiro `/home/usuario/.gnupg/pubring.gpg’ criado

A primeira interação com o usuário será no momento que for necessário escolher qual o tipo de algoritmo criptográfico a ser utilizado. Ao menos que possua necessidades específicas, o padrão poderá ser aceito. O mesmo vale para o comprimento das chaves ElGamal, que possui uma chave padrão de 2048 bits.

Por favor selecione o tipo de chave desejado:
(1) DSA e Elgamal (padrão)
(2) DSA (apenas assinatura)
(5) RSA (apenas assinar)
Sua opção? 1
par de chaves DSA vai ter 1024 bits.
ELG-E chaves podem ter o seu comprimento entre 1024 e 4096 bits.
Que tamanho de chave você quer? (2048)
O tamanho de chave pedido é 2048 bits

Logo após isso, o usuário deverá fornecer o tempo para que sua chave seja tida como expirada. É possível, pelo padrão, que as chaves não tenham data de expiração. Após isso, confirme caso todos os dados tenham sido fornecidos corretamente.

Por favor especifique por quanto tempo a chave deve ser válida.
0 = chave não expira
<n> = chave expira em n dias
<n>w = chave expira em n semanas
<n>m = chave expira em n meses
<n>y = chave expira em n anos
A chave é valida por? (0) 0
A chave não expira nunca
Está correto (s/N)? s

A chave deverá possuir um User-ID, ou seja, um nome. Esse nome deverá, de preferência, o nome completo do possuir das chaves. Também precisaremos informar um endereço eletrônico para o User-ID. O e-mail poderá ser também utilizado como identificador de uma chave. Por fim, poderá ser fornecido um comentário à chave, que normalmente é preenchido com algum apelido ou nickname do dono da chave. Ao final é possível voltar e corrigir algum dos campos, caso tenham sido preenchidos incorretamente.

Você precisa de um identificador de usuário para identificar sua chave; o
programa constrói o identificador a partir do Nome Completo, Comentário e
Endereço Eletrônico desta forma:
“Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>”

Nome completo: Usuario do Computador
Endereço de correio eletrônico: usuario@computador.info
Comentário: Apelido
Você selecionou este identificador de usuário:
“Usuario do Computador (Apelido) <usuario@computador.info>”

Muda (N)ome, (C)omentário, (E)ndereço ou (O)k/(S)air? o
Você precisa de uma frase secreta para proteger sua chave.

Por fim, chega o momento em que o GnuPG irá realizar a geração das chaves. Para que seja um processo altamente confiável, é utilizado variáveis do próprio ambiente para a inclusão no algoritmo. Sendo assim, é solicitado ao usuário que o mesmo realize operações que façam uso de dispositivos de entrada e saída e processamento do sistema. Com todos os dados randômicos coletados, é realizado, através de entropia, a geração da chave. Abaixo está indicado o key-ID, que é o número hexadecimal que representa a chave.

Precisamos gerar muitos bytes aleatórios. É uma boa idéia realizar outra
atividade (digitar no teclado, mover o mouse, usar os discos) durante a
geração dos números primos; isso dá ao gerador de números aleatórios
uma chance melhor de conseguir entropia suficiente.
..+++++++++++++++++++++++++.+++++.+++++..++++++++++.++++++++++++ ++++++++++++++++++..+++++++++++++++.++++++++++.+++++++++++++++ +++++++++++++++.+++++..>+++++…………….+++++
gpg: /home/usuario/.gnupg/trustdb.gpg: banco de dados de confiabilidade criado
gpg: chave 4A2DE02C marcada como plenamente confiável
chaves pública e privada criadas e assinadas.

gpg: checando o trustdb
gpg: 3 parcial(is) necessária(s), 1 completa(s) necessária(s), modelo de confiança PGP
gpg: profundidade: 0 válidas: 1 assinadas: 0 confiança: 0-, 0q, 0n, 0m, 0f, 1u
pub 1024D/4A2DE02C 2007-09-25
Impressão digital da chave: CFED 30DB BB7E F698 CB76 54A5 4BB6 23A4 4A2D E02C
uid Usuario do Computador (Apelido) <usuario@computador.info>
sub 2048g/B3FEF4CE 2007-09-25

Pronto! Suas chaves foram criadas! Para verificar todas as chaves que possuíamos em nosso chaveiro, como é chamado o gerenciamento de chaves, basta o comando abaixo.

$ gpg –list-keys
/home/usuario/.gnupg/pubring.gpg
——————————
pub 1024D/4A2DE02C 2007-09-25
uid Usuario do Computador <usuario@computador.info>
sub 2048g/F2395D9D 2007-09-25

Exportação da Chave Pública

Seria muito complicado utilizar o sistema de chaves assimétricas se não houvesse um ponto controlador intermediando as relações de confiança. Esse ponto controlador tem um papel simples. Hospedar as chaves públicas de quem estiver disposto a enviar suas chaves. Ou seja, o ponto central, podendo ser confiável ou não, irá apenas armazenar as chaves públicas de várias pessoas. Existem diversos servidores na Internet que recebem as chaves de milhares de pessoas. Alguns exemplos de servidores públicos de chaves abaixo.

  • CryptNET Keyserver Network

    • gnv.keyserver.cryptnet.net

  • pgp.net

    • wwwkeys.us.pgp.net

    • wwwkeys.nl.pgp.net

    • wwwkeys.ch.pgp.net

    • wwwkeys.uk.pgp.net

    • wwwkeys.cz.pgp.net

    • wwwkeys.de.pgp.net

    • wwwkeys.dk.pgp.net

    • wwwkeys.es.pgp.net

  • http://www.keyserver.net Network

    • search.keyserver.net

    • seattle.keyserver.net

    • germany.keyserver.net

    • belgium.keyserver.net

    • finland.keyserver.net

    • thailand.keyserver.net

  • pgp.mit.edu

  • pgp.cc.gatech.edu

  • pgp.es.net

  • pgp.rediris.es

  • pgp.uk.demon.net

  • pgp.uni-mainz.de

  • pgp.nic.ad.jp

  • ds.carnet.hr

Para exportar para um keyserver, o comando abaixo é suficiente.

$ gpg –keyserver pgp.mit.edu –send-keys 4A2DE02C
gpg: enviando chave 4A2DE02C para hkpervidor pgp.mit.edu

Onde a opção keyserver especifica a qual servidor enviar as chaves, send-keys especifica qual chave enviar, seja identificando-a através do key-ID ou user-ID. Caso não seja especificado o keyserver, a chave pública é enviada para subkeys.pgp.net.

Importar Chaves Públicas

Outro recurso feito através do GnuPG é a importação de chaves para o nosso chaveiro de maneira que possamos utilizar as chaves importadas para o envio de mensagens criptografadas para os respectivos destinatários. Isso é feito de maneira semelhante ao processo de exportação. Vamos ao exemplo.

$ gpg –keyserver pgp.mit.edu –recv-keys B3936E14
gpg: requisitando chave
B3936E14 de servidor hkp – pgp.mit.edu
gpg: chave B3936E14: “Usuario do Computador (Apelido) <usuario@computador.info>”
gpg: Número total processado: 1
gpg: importados: 1

Podemos verificar o resultado da importação com o comando gpg com a opção list-keys, já utilizada anteriormente.

Assinar Chave Pública

Ao importar uma chave pública, é possível que utilizemos a nossa própria chave para assinarmos a chave. É como se estivermos confiando a credibilidade de minha própria chave afirmando que outra chave é válida. Para a assinatura da chave importada anteriormente, o comando abaixo é necessário. Será solicitado ao usuário apenas que o mesmo digite a frase secreta para a realização da operação.

$ gpg –sign-key B3936E14

pub 1024D/B3936E14 criado: 2007-09-25 expira: nunca uso: SC
confiança: desconhecida validade: desconhecida
sub 2048g/F1394D9D criado: 2007-09-25 expira: nunca uso: E
[ desconhecida] (1).
Usuario do Computador (Apelido) <usuario@computador.info>

pub 1024D/B3936E14 criado: 2007-09-25 expira: nunca uso: SC
confiança: desconhecida validade: desconhecida
Impressão digital da chave primária: 474C B70A 4455 9AF4 ADF7 8933 19BD B9EF 9E62 4869

Usuario do Computador (Apelido) <usuario@computador.info>

Você tem certeza de que quer assinar esta
chave com sua chave “Usuario do Computador (Apelido) <usuario@computador.info>” (B3936E14)

Realmente assinar? (s/N) s

Você precisa de uma frase secreta para destravar a chave secreta do usuário: “Usuario do Computador (Apelido) <usuario@computador.info>”
1024-bit DSA chave, ID
4A2DE02C, criada 2007-09-26

Quando assinamos outra chave pública, podemos definir que grau de confiança possuímos nesta chave. O grau de confiança é chamado de ownertrust. Vamos ao exemplo.

$ gpg –update-trustdb
gpg: 3 parcial(is) necessária(s), 1 completa(s) necessária(s), modelo de confiança PGP
gpg: profundidade: 0 válidas: 1 assinadas: 1 confiança: 0-, 0q, 0n, 0m, 0f, 1u
gpg: profundidade: 1 válidas: 1 assinadas: 0 confiança: 0-, 0q, 0n, 1m, 0f, 0u

A opção update-trustdb lista as relações de confiança existentes com todas as chaves do nosso chaveiro. Para editarmos esses valores, podemos recorrer ao modo interativo de edição de chaves. Reparem no exemplo.

$ gpg –edit-key 9E624869
gpg (GnuPG) 1.4.6; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

pub 1024D/9E624869 criado: 2007-09-25 expira: nunca uso: SC
confiança: desconhecida validade: completo
sub 2048g/F1394D9D criado: 2007-09-25 expira: nunca uso: E
[ total ] (1). Usuario do Computador (Apelido) <usuario@computador.info>

A opção edit-key necessita do argumento do key-ID da chave que será modificada. Depois disso, é realizado a entrada no modo interativo, onde existem um conjunto específico de comandos. Para uma listagem completa de todos os comandos existentes nesse terminal, execute help. Vamos modificar a confiança na chave selecionada. Para tanto, iremos utilizar o comando trust.

Comando> trust
pub 1024D/9E624869 criado: 2007-09-25 expira: nunca uso: SC
confiança: desconhecida validade: completo
sub 2048g/F1394D9D criado: 2007-09-25 expira: nunca uso: E
[ total ] (1). Usuario do Computador (Apelido) <usuario@computador.info>

Por favor decida quanto você confia neste usuário para
verificar corretamente as chaves de outros usuários
(olhando em passaportes, checando impressões digitais
de outras fontes…)

1 = Eu não sei ou nem direi
2 = Eu NÃO confio
3 = Eu tenho pouca confiança
4 = Eu confio totalmente
5 = Eu confio ao extremo
m = voltar ao menu principal

Sua decisão? 5
Você quer realmente definir esta chave à confiança final? s

pub 1024D/9E624869 criado: 2007-09-25 expira: nunca uso: SC
confiança: plena validade: completo
sub 2048g/F1394D9D criado: 2007-09-25 expira: nunca uso: E
[ total ] (1). Usuario do Computador (Apelido) <usuario@computador.info>
Por favor não se esqueça que a validade da chave mostrada não é necessáriamente correcta
a não ser que você reinicie o programa.

Comando> quit

Será pedido, através de um menu interativo, qual o nível de confiança que será dado a chave. Se certifique que caso seja realizado uma alta confiança na chave, haja documentos para comprovar a identidade do dono da chave. Para a finalização do modo de edição de chaves, utilize o comando quit.

Criptografar Mensagem

Utilizando o esquema de criptografia assimétrica, podemos utilizar as chaves criadas para a criptografia de dados utilizando as chaves públicas. Vamos criptografar um arquivo chamado arquivo.txt. Lembrando que apenas estamos criptografando, não evitando então não-repudiação pelo remetente.

$ gpg -r 9E624869 –encrypt arquivo.txt
$ ls
arquivo.txt arquivo.txt.gpg
$ file arquivo.txt.gpg
arquivo.txt.gpg: GPG encrypted data

Ao final é gerado um arquivo chamado arquivo.txt.gpg, como demonstrado anteriormente. Esse arquivo poderá ser tranqüilamente enviado através de um canal inseguro de transmissão, pois apenas quem possuir a chave privada referente a chave pública 9E624869 poderá descriptografar o arquivo. Veremos a seguir como realizar o processo inverso.

Desencriptografar Mensagem

Para a realização da desencriptação de um arquivo, devemos ser o portador da chave privada necessária. Do contrário, será retornado um erro como demonstrado abaixo.

$ gpg -o arquivo.txt.out –decrypt arquivo.txt.gpg
gpg: criptografado com 2048-bit ELG-E chave, ID F1394D9D, criado 2007-09-25
“Usuario do Computador (Apelido) <usuario@computador.info>”
gpg: descriptografia falhou: chave secreta não disponível

Considerando agora que temos a chave privada necessária.

$ gpg -o arquivo.txt.out –decrypt arquivo.txt.gpg

Você precisa de uma frase secreta para destravar a chave secreta do usuário: “Usuario do Computador (Apelido) <usuario@computador.info>”
2048-bit ELG-E chave, ID F1394D9D, criada 2007-09-25 (ID principal da chave 9E624869)

gpg: gpg-agent não está disponivel nesta sessão
gpg: criptografado com 2048-bit ELG-E chave, ID F1394D9D, criado 2007-09-25
“Usuario do Computador (Apelido) <usuario@computador.info>”

Será solicitado a frase secreta para a abertura do arquivo. Após isso, será gerado um novo arquivo, chamado arquivo.txt.out, que conterá o conteúdo claro original.

Enviar Mensagem Assinada

Realizar a assinatura de um arquivo tem o objetivo de garantir a integridade e não-repúdio do mesmo. Para tanto, vamos utilizar mais um exemplo, como os anteriores.

$ gpg –sign mensagem.txt

Você precisa de uma frase secreta para destravar a chave secreta do usuário: “Usuario do Computador (Apelido) <usuario@computador.info>”
1024-bit DSA chave, ID B3936E14, criada 2007-09-26

gpg: gpg-agent não está disponivel nesta sessão
usuario@thigu-laptop:~$ ls
mensagem.txt mensagem.txt.gpg
usuario@thigu-laptop:~$ file mensagem.txt.gpg
mensagem.txt.gpg: data

É necessário o uso da frase secreta, pois estaremos fazendo uso da chave privada para a geração do código que irá acompanhar a mensagem.

Verificar Assinatura de Mensagem Recebida

Tudo bem! Até então fizemos o trabalho do remetente, que será assinar a mensagem que irá enviar com sua chave privada. Quem receber a mensagem precisará agora realizar a verificação da integridade e da assinatura.

$ gpg –verify mensagem.txt.gpg
gpg: Assinatura feita Seg 01 Out 2007 16:43:32 WEST usando DSA chave ID B3936E14
gpg: Assinatura correta de “Usuario do Computador (Apelido) <usuario@computador.info>”
gpg: AVISO: Esta chave não está certificada com uma assinatura confiável!
gpg: Não há indicação de que a assinatura pertence ao dono.
Impressão digital da chave primária: 7BEF 66DF 164B 2CCA 3DDD 20FE 049B 0541 B393 6E14

Poderá surgir uma mensagem advertindo quando o arquivo foi assinado com uma assinatura que não possui verificação por nenhuma outra assinatura. Caso contrário, será mostrado quantas pessoas confiam na credibilidade dessa chave.

Concluindo

Para finalizar, podemos associar o uso do método de assinatura ao de criptografia, de maneira a prover uma maior segurança aos usuários, sejam eles os remetentes ou destinatários. O GnuPG é fundamentado no bom uso das chaves e relações de confiança, de maneira que ele só vem a ter sentido caso tenha uma boa difusão entre os usuários. Para facilitar seu uso, um plugin bem interessante desenvolvido para o Firefox foi desenvolvido, chamado FireGPG. Recomendo seu uso, já que ele integra de maneira simples tarefas como assinatura, criptografia, verificação e desencriptação, além de ser personalizado para uso integrado ao GMail.

Qualquer dúvida que possuir a respeito do texto, sintam-se a vontade para enviá-las como comentários para cá.

Até mais! 🙂

5 Comentários

Deixe um comentário
  1. savit / out 2 2007 8:23

    me fala do seu mestrado, onde ta fazendo, como conseguiu

  2. ThigU / out 2 2007 10:55

    Olá savit,

    Estou estudando em Coimbra, em Portugal. Consegui vir para cá graças à um programa de bolsas para latinos irem para a Europa. O programa se chama AlBan e abre as inscrições sempre no início de novembro até dezembro. Porém, esse programa não fará mais seleções, sendo que esta que eu estou participando é a última convocatória.

    Existem outros programas de bolsas, caso tenha interesse, me mande um e-mail que podemos conversar sobre isso.

    Abraços!

  3. Lindomar / out 4 2007 14:37

    Eae ThigU miguxo !!! heheheheh

    Dá um Add no gtalk: lindomar@gmail.com

    Tá gostando ae de ficar no meio dos patrícios ?

    Agração !

  4. ThigU / out 4 2007 14:43

    Graaaande pequeno Lindomar, também conhecido como Lindinho! hohoho

    Adicionado! Vamos trocar idéias depois, mas estou gostando sim, cara! Não sei se estou gostando porque tudo ainda é novidade ou porque realmente é bom 😛 Mas irei descobrir em breve! Hoje faz exatamente 1 mês que estou aqui. 🙂

    Falô rapá!

  5. Maurício Silva / jan 16 2008 8:23

    Veja, por favor, se consegue me ajudar: criei uma chave conforme descrito acima, exportei o arquivo .key e enviei-o por e-mail para um órgão. De posse disso, esse órgão me mandou uma arquivo.pgp. Meu problema: eu criei tudo a partir do Linux rodando de um CD e parece que tudo se apaga após sair do Linux. Tenho o arquivo.key e anotei aquele monte de dados que aparecem após a criação da chave, tais como finger print, etc. E agora, como decriptografar o arquivo.pgp que recebi?
    Grande abraço.

Deixe um comentário