Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
UNIVERSIDADE FEDERAL DE GOIAS – UFG
CAMPUS CATALAO – CAC
DEPARTAMENTO DE CIENCIA DA COMPUTACAO – DCC
Bacharelado em Ciencia da Computacao
Projeto Final de Curso
Aplicacao do Algoritmo Diffie-Hellman no
Compartilhamento de Volumes Criptografados do
TrueCrypt
Autor: Rayner de Melo Pires
Orientador: Vaston Goncalves da Costa
Catalao – 2010
Rayner de Melo Pires
Aplicacao do Algoritmo Diffie-Hellman no Compartilhamento de Volumes
Criptografados do TrueCrypt
Monografia apresentada ao Curso de
Bacharelado em Ciencia da Computacao da
Universidade Federal de Goias – Campus Catalao
como requisito parcial para obtencao do tıtulo de
Bacharel em Ciencia da Computacao.
Area de Concentracao: Seguranca da informacao
Orientador: Vaston Goncalves da Costa
Catalao – 2010
Pires, Rayner M.
Aplicacao do Algoritmo Diffie-Hellman no Compartilhamento de Volumes
Criptografados do TrueCrypt / Rayner de Melo Pires – Catalao – 2010
Numero de paginas: 48
Projeto Final de Curso (Bacharelado) – Universidade Federal de Goias, Campus
Catalao, Curso de Bacharelado em Ciencia da Computacao, 2010.
Palavras-Chave: 1. Criptografia de Dados. 2. Acordo de Chaves. 3. Diffie-Hellman
Rayner de Melo Pires
Aplicacao do Algoritmo Diffie-Hellman no Compartilhamento de Volumes
Criptografados do TrueCrypt
Monografia apresentada e aprovada em de
pela Banca Examinadora constituıda pelos professores:
Vaston Goncalves da Costa – Presidente da Banca
Roberto Mendes Finzi Neto
Marcio Antonio Duarte
Para meus pais Fabio e Jussara,
e meus irmaos Plınio e Fabio.
Um filho nao poderia pedir
por uma famılia melhor.
Para minha namorada Taynara.
Obrigado pelo apoio e
pela compreensao enquanto
trabalhava neste projeto.
AGRADECIMENTOS
Agradeco primeiramente aos meus pais Fabio e Jussara por terem me dado a base
familiar que tenho hoje. Quero ser como voces quando eu crescer!
Aos meus irmaos Plınio e Fabio por me darem exemplo de como ser hoje melhor do
que fui ontem.
A minha namorada Taynara por tanto me apoiar, por me dar tantas provas de amor
e por me transmitir tanta paz, mesmo nos momentos mais difıceis.
Agradeco a todos que me acompanharam nessa jornada da graduacao, aos meus colegas
de sala de aula e aos bons professores que colaboraram todo esse tempo. Voces todos
fizeram parte de uma fase muito importante na minha vida, e foram fundamentais para
o meu sucesso alcancado hoje.
Agradeco tambem a minha amiga Gabriela que comigo caminhou ate o final, e ao meu
amigo Salviano que me escutou, me apoiou e me divertiu tanto em todos esses cinco anos.
Voces dois foram “compadres”de verdade!
E agradeco tambem ao nosso pai la do ceu por ter me ajudado a enfrentar os meus me-
dos, por ter me carregado ate aqui e ter me dado nesse ultimo semestre motivos para tanta
felicidade.
A todos voces o meu sincero agradecimento. Voces estarao sempre em minhas lem-
brancas!
Por ter acreditado que posso!
RESUMO
Pires, R. M. Aplicacao do Algoritmo Diffie-Hellman no Compartilhamento
de Volumes Criptografados do TrueCrypt. Curso de Ciencia da Computacao, Cam-
pus Catalao, UFG, Catalao, Brasil, 2010, 48p.
O transporte de informacoes necessita, muitas vezes, de ambientes que garantam a sua
seguranca contra acesso nao autorizado. O TrueCrypt e um programa que implementa
a criptografia simetrica para cifrar informacoes. Contudo torna-se difıcil compartilhar a
informacao cifrada sem divulgar a chave que a cifra. Este problema e conhecido como o
problema de troca de chaves. Neste trabalho e apresentada a tecnica do Acordo de Chaves
de Diffie-Hellman, que pode ser utilizada para estabelecer um acordo entre dois parceiros
e solucionar o problema da troca de chaves. Tambem foi desenvolvido um prototipo que
implementa tal tecnica e que gera uma senha compartilhada, permitindo ao TrueCrypt
que seus volumes cifrados possam ser compartilhados com seguranca.
Palavras-Chaves: Criptografia de Dados, Acordo de Chaves, Diffie-Hellman
i
Sumario
Introducao 2
1 Estado da Arte 3
1.1 Informacao e Seguranca da Informacao . . . . . . . . . . . . . . . . . . . . 3
1.2 Requisitos para a seguranca da informacao . . . . . . . . . . . . . . . . . . 3
1.3 Solucoes para seguranca . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Gestao de Identidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Defesa contra ataques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.6 Criptografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.7 A historia da criptografia atual . . . . . . . . . . . . . . . . . . . . . . . . 6
1.8 Produtos disponıveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2 Tipos de criptografia 12
2.1 Criptografia Simetrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Criptografia Assimetrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3 O Problema da Distribuicao de Chaves 16
3.1 Uso de chaves publicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Envelope digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3 O Acordo de Chaves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.1 O algoritmo Diffie-Hellman . . . . . . . . . . . . . . . . . . . . . . . 18
4 Aplicacao da tecnica 22
4.1 O software TrueCrypt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2 Aplicacao da tecnica de DH no TrueCrypt . . . . . . . . . . . . . . . . . . 23
4.3 A senha compartilhada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
ii
5 O Prototipo 26
5.1 O prototipo desenvolvido . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.2 A implementacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6 Conclusao 32
Referencias 34
Apendices 36
A Codigos Fonte 36
A.1 A classe GeradorDH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
A.2 A classe Transferencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
B Diagrama UML 47
C Codigos Fontes e Javadoc 48
iii
Lista de Figuras
1.1 Tela principal do TrueCrypt . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1 Criptografia Simetrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Criptografia Assimetrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.1 O funcionamento do algoritmo de Diffie-Hellman. . . . . . . . . . . . . . . 19
3.2 Geracao do valor secreto de DH . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1 TrueCrypt requisitando a senha para cifrar/decifrar um volume. . . . . . . 24
5.1 Painel onde e gerado um par de chaves DH com novos parametros. . . . . . 27
5.2 Painel onde e gerado um par de chaves DH, com os mesmos parametros da
chave publica fornecida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.3 Painel onde e gerada a senha. . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.4 Obtencao da senha a partir do vetor de bytes do segredo. . . . . . . . . . . 29
5.5 Copia da senha gerada para a area de transferencia do sistema operacional. 29
5.6 Insercao de senha para acessar volume do TrueCrypt. . . . . . . . . . . . . 30
B.1 Diagrama de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
iv
Lista de Codigos
A.1 A classe GeradorDH.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
A.2 A classe Transferencia.java . . . . . . . . . . . . . . . . . . . . . . . . . 45
v
Lista de Abreviacoes
3DES Triple DES
a.C. Antes de Cristo
ACM Association for Computing Machinery
AES Advanced Encryption Standard
BSAFE Biblioteca de criptografia, fornecida pela RSA
CA Certification Authority ; Autoridade Certificadora
CAST5 O mesmo que CAST-128; Cifra de bloco
DES Data Encryption Standard
FBI Federal Bureau of Investigation; Escritorio Federal de Investigacao
americano
IBM International Business Machines
ID Identificacao do usuario; login
IDEA International Data Encryption Algorithm
NBS National Bureau of Standards
NIST National Insitute of Standards and Technology
NSA National Security Agency
PBKDF2 Password-Based Key Derivation Function, version 2 ; Funcao de
Derivacao de Chave Baseada em Senha
PGP Pretty Good Privacy ; Software criptografico
vi
PKC Public Key Cryptography ; Criptografia de Chave Publica
PKCS Public Key Cryptography Standard
PKI Public Key Infrastructure; Infraestrutura de Chave Publica
RC2, RC4, RC5 Rivest Cipher ; Algoritmos de cifragem
RSA Cifra de chave publica; Rivest, Shamir, Adleman
TI Tecnologia da Informacao
UML Unified Modeling Language; Conjunto de padroes de modelagem
de sistemas
vii
Introducao
Seguranca da informacao em uma organizacao, nos dias atuais, abrange todas as
areas, desde a selecao de funcionarios, passando pela escolha dos equipamentos onde
as informacoes serao armazenadas, seja em forma digital ou nao, ate as regras de com-
partilhamento dessas informacoes.
O compartilhamento de dados passou por um longo processo de evolucao antes de
chegar aos padroes praticados atualmente. Com a evolucao constante surgem os dispo-
sitivos portateis, os quais possuem, atualmente, grande capacidade de armazenamento.
Com esses dispositivos vieram tambem os riscos oferecidos pela facilidade em carregar
dados de um lado para outro, que podem fazer com que nao seja mantida a seguranca da
informacao contida nestes dispositivos.
Uma das ferramentas mais importantes, quando se fala em seguranca da informacao,
e a criptografia. Desenvolvedores e engenheiros precisam entender a criptografia a fim
de construir eficazmente os seus produtos. O pessoal do marketing e de vendas precisa
entender a criptografia a fim de provar que os seus produtos sao seguros. Os clientes
que compram esses produtos, sejam eles usuarios finais ou agentes de empresas, precisam
entender a criptografia para que possam tomar a melhor decisao e assim utilizar esses
produtos corretamente. Os profissionais de TI (Tecnologia da Informacao) precisam en-
tender a criptografia a fim de distribuı-la adequadamente entre os seus sistemas. Mesmo
os advogados precisam entender a criptografia, visto que os governos locais, estaduais e
federal estao aprovando novas leis que definem as responsabilidades das entidades que
detem as informacoes privadas do publico.
Na pratica, a criptografia pode ser entendida como um conjunto de metodos e tecnicas
para cifrar ou codificar informacoes legıveis por meio de um algoritmo, convertendo um
texto original em um texto ilegıvel, sendo possıvel recuperar as informacoes originais
mediante o processo inverso. Independentemente do algoritmo criptografico utilizado,
1
sempre ocorrera transformacoes de um texto legıvel em um ilegıvel.
A criptografia pode ser a ferramenta mais importante de seguranca, mas de modo
algum resolvera todos os problemas de seguranca.
O objetivo deste trabalho foi estudar tecnicas de compartilhamento de informacoes
criptografadas e oferecer uma solucao para o problema de troca de chaves existente na
criptografia simetrica. Atraves da tecnica do Acordo de Chaves de Diffie-Hellman – que
nao e uma tecnica criptografica mas que utiliza a criptografia – mostrou-se que o problema
pode ser resolvido, e que tal tecnica tambem pode ser empregada no software criptografico
chamado TrueCrypt, permitindo o compartilhamento dos arquivos criptografados por ele.
Tambem foi desenvolvido um prototipo de aplicacao que implementa tal tecnica e que
fornece uma senha em formato de texto puro, que pode ser utilizado para finalidades
outras alem da aplicacao no TrueCrypt.
O trabalho descrito neste texto foi dividido em 6 capıtulos.
O Capıtulo 1 e o estado da arte. Comeca definindo os termos Informacao e Segu-
ranca da Informacao. Aborda os requisitos para se garantir a seguranca da informacao;
define e fala sobre criptografia e faz um apanhado geral da historia da criptografia ate os
tempos de hoje, ilustrando o cenario de softwares criptograficos disponıveis atualmente.
O Capıtulo 2 esta mais focado no assunto Criptografia, e resume os tipos de cripto-
grafia: as criptografias de chave secreta, de chave publica, e a criptografia mista.
O Capıtulo 3 trata do Problema de Distribuicao de Chaves, que surge ao comparti-
lhar informacoes cifradas com terceiros, e ainda trata de duas tecnologias que atacam o
problema: a tecnica do Envelope Digital e a tecnica do Acordo de Chaves.
Tendo em mente o Problema de Distribuicao de Chaves, e apresentado no Capıtulo
4 uma maneira de aplicar a tecnica de acordo de chaves de Diffie-Hellman no software
TrueCrypt. E explicada tambem a questao da Senha Compartilhada, utilizada para com-
partilhar um volume do TrueCrypt entre partes geograficamente distantes.
No Capıtulo 5 e mostrado e explicado o prototipo implementado neste trabalho, e
ainda sao comentados alguns trechos da implementacao.
Por fim, no Capıtulo 6 ha uma conclusao do trabalho realizado, levantando os obje-
tivos alcancados, pontos positivos, pontos negativos, dificuldades encontradas e trabalhos
futuros. Ainda e possıvel encontrar, no apendice desta monografia, o diagrama de classes
e o codigo fonte comentado das principais classes implementadas.
2
Capıtulo 1
Estado da Arte
1.1 Informacao e Seguranca da Informacao
As pessoas,os governos, todos um dia tiveram ou tem motivos para querer sigilo so-
bre alguma informacao. No passado a questao Seguranca da Informacao era muito mais
simples, pois os arquivos contendo inumeros papeis podiam ser trancados fisicamente.
Contudo, com a chegada das tecnologias da informacao e comunicacao o assunto ficou
bem mais complexo. Hoje a maioria dos computadores conecta-se a Internet e, con-
sequentemente, a Internet conecta-se a eles. Alem disto, sabemos que dados em formato
digital sao portateis. Este fato fez com que estes ativos tornassem novos atrativos para
ladroes.
Informacao compreende qualquer conteudo que possa ser armazenado ou transferido
de algum modo, servindo a determinado proposito e sendo de utilidade ao ser humano
[Filho, 2004].
Seguranca da Informacao, em seu conceito mais abrangente, e uma soma de dife-
rentes metodos e tecnicas para, literalmente, garantir a seguranca de alguma informacao.
1.2 Requisitos para a seguranca da informacao
A seguranca da informacao em um sistema computacional ou em um sistema de ar-
mazenamento, em seu sentido mais abrangente, envolve requisitos voltados a garantia de
origem, uso e transito da informacao, buscando certificar todas as etapas do seu ciclo de
vida. Estes requisitos podem ser resumidos na forma dos itens a seguir [CERT.BR, 2006]:
3
• A confidencialidade diz que a informacao so esta disponıvel para aqueles devida-
mente autorizados;
• A integridade diz que a informacao nao foi destruıda ou corrompida e o sistema
tem um desempenho correto;
• A disponibilidade diz que os servicos/recursos do sistema estao disponıveis sempre
que forem necessarios.
Alguns exemplos de violacoes a cada um desses requisitos sao:
Confidencialidade: alguem obtem acesso nao autorizado ao seu computador e le todas
as informacoes contidas na sua declaracao de Imposto de Renda;
Integridade: alguem obtem acesso nao autorizado ao seu computador e altera in-
formacoes da sua declaracao de Imposto de Renda, momentos antes de voce envia-la a
Receita Federal;
Disponibilidade: o seu provedor sofre uma grande sobrecarga de dados ou um ataque
de negacao de servico e por este motivo voce fica impossibilitado de enviar sua declaracao
de Imposto de Renda a Receita Federal.
Algumas abordagens agregam ainda os dois ultimos [Marciano, 2006]:
• A autenticidade da a garantia de que a informacao e de fato originaria da proce-
dencia alegada.
• A irretratabilidade ou nao repudio e a garantia de que nao se pode negar a
autoria da informacao, ou o trafego por ela percorrido.
Aplicando a pratica de autenticacao, podemos verificar as identidades. Isso e com-
paravel ao ID (Identificacao do usuario) requerido para retirar dinheiro de uma conta
bancaria (ou conduzir uma transacao com um corretor on-line). O nao repudio e uma im-
posicao legal que orienta e impele as pessoas a honrar as suas palavras [Burnett e Paine, 2002].
1.3 Solucoes para seguranca
A seguranca da informacao requer ferramentas especıficas para a implementacao das
regras contidas em polıticas de seguranca de informacao. Os principais blocos de solucoes
sao [Promon, 2005]:
4
• Identidade;
• Defesa contra ataques;
• Criptografia.
1.4 Gestao de Identidade
A gestao de identidade e amparada por ferramentas que permitem a correta identi-
ficacao de um usuario para lhe conferir acesso de acordo com seu perfil. A Identificacao ou
a Autenticacao permite identificar unicamente um usuario e verificar a autenticidade da
sua identidade atraves de mecanismos variados, como, por exemplo, senhas pre-definidas,
certificados digitais, biometria ou dispositivos portateis (tokens, smart cards). A Au-
torizacao e o Controle de acesso possibilitam especificar as acoes permitidas e nıveis de
privilegio diferenciados para cada usuario atraves do estabelecimento de polıticas de uso.
Com a PKI (Infraestrutura de Chave Publica), a CA (Autoridade Certificadora) realiza a
geracao e gestao de chaves e certificados digitais que conferem autenticidade aos usuarios
ou a informacao. Outra aplicacao dessa categoria de ferramentas e o fornecimento de
chaves para suportar solucoes de criptografia.
1.5 Defesa contra ataques
A defesa contra ataques consiste em diversas solucoes atuando, de forma preventiva
ou corretiva, na defesa contra ameacas a seguranca de um sistema. Ela divide-se em
[Promon, 2005]:
• Protecao de perımetro;
• Deteccao de anomalias e intrusao;
• Protecao contra infeccao;
• Identificacao de vulnerabilidades;
• Backup e Recovery.
5
1.6 Criptografia
A criptografia das informacoes consiste de mecanismos que garantem a confiden-
cialidade da informacao em diversas camadas [Promon, 2005], atraves da aplicacao de
algoritmos de criptografia. Esses mecanismos variam desde a criptografia das informacoes
gravadas em dispositivos de armazenamento (ex.: discos rıgidos, pen drives) ate cripto-
grafia das informacoes em transito visando a comunicacao segura.
A criptografia, como forma de implementacao de mecanismos de seguranca em sistemas
de informacao ou dispositivos de armazenamento, e utilizada como prevencao ou solucao
para falhas em seguranca na ampla maioria dos casos [Marciano, 2006].
1.7 A historia da criptografia atual
O habito de utilizar tecnicas de codificar mensagens ou esconder informacoes foi her-
dado de nossos antepassados. Na era a.C. (antes de Cristo) ja se utilizavam destas tecnicas.
Uma prova disso e que a criptografia ja estava presente na escrita hieroglıfica dos egıpcios,
e em codigos secretos entre assırios, hebreus, hititas, persas e outros [Moreira, 2001].
A criptografia, ou a criptologia, que e a arte de ocultar informacoes [Weiszflog, 2008],
faz parte da historia humana porque sempre houve formulas secretas, informacoes confi-
denciais e interesses os mais diversos que nao deveriam cair no domınio publico ou na mao
de inimigos. As guerras e a necessidade de manter ou conquistar novos territorios sempre
foram subsıdios para a Criptologia. E guerra e disputa sempre estiveram presentes na
historia da humanidade.
Essa historia foi marcada por grandes nomes que fizeram da arte e ciencia de escrever
mensagens em codigos a criptografia que se tem hoje. Julio Cesar, Blaise de Vigenere,
Frederici, Samuel Morse, Charles Babbage, Joseph Oswald Mauborgne, Marian Rejewski,
Alan Turing, Gordon Welchman e outros, todos fizeram de seus trabalhos em criptografia
e criptoanalise grandes contribuicoes para algoritmos mais recentes criados por Claude
Elwood Shannon, Whitfield Diffie, Martin Hellman, e Rivest, Shamir e Adleman, que por
suas vezes, contribuem muito para a evolucao da criptografia na computacao quantica,
hoje sendo muito estudada [Information, 2009].
A seguir sao listadas as fases importantes na historia da criptografia atual, baseadas
nas obras de [Moreno et al., 2005], [Information, 2009] e [Tkotz, 2009]:
6
Entre 1933 e 1945, a maquina Enigma, que havia sido criada por Arthur Scherbius, nao
foi um sucesso comercial e foi aperfeicoada ate se transformar na ferramenta criptografica
mais importante da Alemanha nazista.
No ano de 1943 a maquina Colossus, projetada pela equipe liderada por Alan Turing e
Gordon Welchman em Betcheley Park, um centro de estudos criptologicos da Inglaterra,
foi posta em acao para quebrar codigos.
Em 1969 James Ellis desenvolve um sistema de chaves publicas e chaves privadas
separadas.
Em 1976 Whitfield Diffie e Martin Hellman publicam o livro New Directions in Crypto-
graphy, introduzindo a ideia de uma criptografia de chave publica. Tambem reforcaram
a concepcao da autenticacao atraves de uma funcao de via unica (one way function).
Terminaram o texto do livro com a observacao modesta e sabia:
“A habilidade de produzir criptoanalise esteve sempre acentu-
adamente do lado de profissionais, mas a inovacao, particularmente
no desenvolvimento de novos tipos de sistemas criptograficos, veio
basicamente de amadores.”
No mesmo ano a IBM apresentou a cifra Lucifer ao NBS (National Bureau of Stan-
dards). Essa cifra sofreu algumas modificacoes recomendadas pela NSA (National Security
Agency) e a NBS a adotou como padrao de criptografia de dados nos EUA. Hoje a NBS e
conhecida como NIST (National Insitute of Standards and Technology), e a cifra evoluiu
para DES (Data Encryption Standard).
Em 1977, inspirados no texto publicado por Diffie e Hellman e apenas principiantes na
criptografia, Ronald L. Rivest, Adi Shamir e Leonard M. Adleman comecaram a discutir
como poderiam criar um sistema de chave publica que fosse pratico. Ron Rivest concebeu
a grande ideia: o sistema era uma cifra de chave publica, assim como tinham pensado,
que servia tanto para confidencialidade quanto para assinaturas digitais, baseada na difi-
culdade da fatoracao de numeros grandes. Essa cifra foi batizada de RSA, de acordo com
as primeiras letras dos sobrenomes dos autores. Confiantes no sistema, em 4 de Abril de
1970 os tres entregaram o texto para Martin Gardner, para que fosse publicado na revista
Scientific American. O artigo apareceu na edicao de Setembro de 1977 e incluıa a oferta
de enviar o relatorio tecnico completo para qualquer um que mandasse um envelope selado
7
com o proprio endereco. Foram recebidos milhares de pedidos provenientes dos quatro
cantos do mundo.
A NSA contestou a distribuicao deste relatorio para estrangeiros e, durante algum
tempo, os autores suspenderam a correspondencia. Como a NSA nao se deu ao trabalho
de informar a base legal desta proibicao, solicitada pelos autores, os tres voltaram a
enviar os relatorios solicitados. Dois jornais internacionais, “Cryptologia”e “The Journal
of Cryptology”, foram fundados logo apos esta tentativa da NSA de censurar publicacoes.
Rivest, Shamir e Adleman nao publicaram a cifra antes de patentea-la. Alias, foi uma
grande novidade conseguir patentear um algoritmo.
Em 1978 o algoritmo RSA e publicado na “Communication”da ACM (Association for
Computing Machinery).
A partir da decada de 90 comecam os trabalhos com computacao quantica e cripto-
grafia quantica. Tambem ganham maior forca trabalhos com biometria voltada a auten-
ticacao [Almeida, 2009].
Em 1990 Xuejia Lai e James Massey publicam na Suıca A Proposal for a New Block
Encryption Standard (Uma Proposta para um Novo Padrao de Encriptacao de Bloco),
o que viria a ser o IDEA (International Data Encryption Algorithm), para substituir o
DES [Burnett e Paine, 2002]. O IDEA utiliza uma chave de 128 bits e emprega operacoes
adequadas para computadores de uso geral, tornando as implementacoes em software mais
eficientes.
Em 1990 Charles H. Bennett, Gilles Brassard e colaboradores publicam seus resultados
experimentais sobre Criptografia Quantica, a qual usa fotons unicos para transmitir um
fluxo de bits chave para uma posterior cifragem da mensagem (no caso a cifragem Vernam).
Considerando as leis que a mecanica quantica possui, a Criptografia Quantica nao so
oferece a possibilidade do segredo como tambem uma indicacao positiva caso ocorra uma
interceptacao e uma medida do numero maximo de bits que possam ter sido interceptados.
Uma limitacao e que a Criptologia Quantica necessita de um cabeamento de fibra otica
entre as partes que se comunicam.
Um ano depois o FBI impoe o direito de acessar qualquer texto claro trocado entre
usuarios que conversam por meio de uma rede de comunicacao digital. Como resposta
ao FBI, Phil Zimmermann torna publica, no mesmo ano, sua primeira versao do PGP
(Pretty Good Privacy). O PGP oferece alta seguranca para o cidadao comum e, como tal,
e um forte concorrente de produtos comerciais pois alem de sua notavel confiabilidade,
8
ele e distribuıdo como freeware, e como resultado, tornou um padrao mundial.
Em 1993 a criptoanalise diferencial e desenvolvida por Eli Biham e Adi Shamir.
“E a criptoanalise dos novos tempos.” por Biham e Shamir.
O metodo utilizado por Biham e Shamir baseia-se em ataque por mensagens escolhi-
das, as quais sao tomadas aos pares e cuja diferenca entre os respectivos criptogramas
e analisada. O metodo pode ser estendido para ataque de mensagens conhecidas. A
criptoanalise e realizada sobre pares de criptogramas cifrados com a mesma chave e cujos
textos em claro correspondentes possuem um certo valor particular de diferenca. O efeito
desta diferenca e analisado atraves das n iteracoes do algoritmo resultando em parametros
que permitem inferir possıveis valores da chave utilizada no processo de criptografia.
Em 1994 o professor Ron Rivest, autor dos algoritmos RC2 e RC4 incluıdos na biblio-
teca de criptografia BSAFE da RSA Data Security Inc., publica a proposta do algoritmo
RC5 na Internet. Este algoritmo usa rotacao dependente de dados como sua operacao
nao linear e e parametrizado de modo que o usuario possa variar o tamanho do bloco, o
numero de estagios e o comprimento da chave. Neste mesmo ano o algoritmo Blowfish,
uma cifra de bloco de 64 bits com uma chave de ate 448 bits de comprimento, e projetado
por Bruce Schneier [Moreno et al., 2005].
Em 1997 O PGP Freeware e atualizado para a versao 5.0 e e amplamente distribuıdo
para uso nao comercial. Ainda em 97 o padrao de encriptacao DES de 56 bits, base da
criptografia dos EUA naquele ano, e quebrado por uma rede de 14.000 computadores.
Em 1998 o padrao de encriptacao DES de 56 bits e quebrado em 56 horas por
pesquisadores da Electronic Frontier Foundation - EFF do Vale do Silıcio. No ano seguinte
a EFF quebrou novamente o DES em apenas 22 horas e 15 minutos, juntamente com a
Distributed.Net, reunindo em torno de 100.000 computadores pessoais a maquina DES
Cracker pela internet.
No ano de 2000 o NIST anunciou um novo padrao de uma chave secreta de cifragem,
escolhido entre 15 candidatos. Esse novo padrao foi criado para substituir o algoritmo
DES, cujo tamanho das chaves tornou-se insuficiente para conter ataques de forca bruta. O
algoritmo Rijndael, cujo nome e uma abreviacao dos nomes dos autores Rijmen e Daemen,
foi escolhido para se tornar o futuro AES (Advanced Encryption Standard)[Tkotz, 2009].
No seculo 21 muitos professores e profissionais da computacao com vınculo em centros
de pesquisa, universidades e empresas comecam a pesquisar novas formas de implementar
9
algoritmos e solucoes de seguranca. Nos anos 2000 a criptografia comeca a ser encarada
realmente como uma ciencia.
Com esse resumo sobre os principais acontecimentos na historia da criptografia pode-
mos ressaltar que a maior motivacao para todas essas pesquisas, descobertas e atualizacoes
na criptografia e criptoanalise foi a questao sobre a seguranca da informacao, ou da segu-
ranca de dados.
1.8 Produtos disponıveis
As solucoes para seguranca experimentam uma fase de intensa inovacao tecnologica
e de crescente sofisticacao motivadas, principalmente, pelo aumento constante das ativi-
dades maliciosas. O mercado de solucoes de seguranca e relativamente novo e apresenta
um elevado nıvel de fragmentacao em termos de produtos disponıveis. Nele coexistem
diversas empresas, oferecendo diferentes solucoes para diversas areas.
Com relacao a criptografia de dispositivos de armazenamento, seja os removıveis ou
nao, o mercado e amplo, e dentre os softwares mais conceituados hoje estao:
• EncryptOnClick;
• Rohos Mini Drive;
• Kruptos;
• TrueCrypt.
Os itens acima foram destacados por serem freeware.
O EncryptOnClick e produzido pela 2Bright Sparks. O seu funcionamento basea-se em
encriptar arquivos ou diretorios avulsos com uma senha determinada. Os novos arquivos
encriptados ganham a extensao (.eoc). Eles ficam espalhados pela unidade, onde podem
ser novamente abertos com o software EncryptOnClick.
O Rohos Mini Drive e o TrueCrypt utilizam o conceito de unidade virtual. Eles criam
uma unidade criptografada dentro da unidade real, onde os arquivos privados ficam dentro
dessas unidades criptografadas. Ha a opcao de esconder/ocultar essas unidades para uma
maior seguranca. O TrueCrypt ainda oferece o recurso de se criar uma unidade oculta
dentro de uma unidade criptografada, e cada unidade com uma senha secreta diferente
10
da outra. Isso faz com que a primeira unidade proteja ainda mais os dados da segunda
unidade. Caso a protecao da primeira seja violada, a segunda ainda permanecera intacta.
O Kruptos acrescenta a funcionalidade do EncryptOnClick a facilidade de criar ar-
quivos executaveis (.exe) autodecifraveis, onde recupera-se o arquivo original apenas
fornecendo a senha correta. Acrescenta ainda um poderoso picotador de arquivos, onde
pode-se apagar um arquivo do disco sem deixar rastros para programas de recuperacao
de dados apagados.
Dentre os quatros mencionados, o mais amplamente utilizado e o TrueCrypt. A jus-
tificativa se da pela sua eficiencia, pela facilidade de uso, pela documentacao abrangente
que possui, pelas atualizacoes constantes oferecidas pela fundacao responsavel pelo seu de-
senvolvimento e tambem por ser de codigo aberto (open source), possibilitando alteracoes.
A Figura 1.1 mostra a tela principal deste software.
Figura 1.1: Tela principal do TrueCrypt
O TrueCrypt e desenvolvido e mantido pela TrueCrypt Foundation, nos Estados
Unidos. Uma copia do programa pode ser baixada da internet no endereco
http://www.truecrypt.org/downloads.
11
Capıtulo 2
Tipos de criptografia
Ha dois tipos de criptografia, a de chave secreta e a de chave publica.
Ha tambem uma terceira abordagem, que na verdade nao e um novo tipo de criptogra-
fia, mas sim uma tecnica onde utiliza-se os dois tipos anteriores, chamada de criptografia
mista.
O termo “chave”aqui e um numero secreto ou um conjunto desses numeros, que faz
analogia a chave convencional que utilizamos em cadeados e fechaduras.
Na criptografia, para proteger o conteudo dos seus arquivos, voce instala uma fechadura
(um algoritmo de criptografia) na sua porta (o computador). Para operar a fechadura
(encriptar os dados), voce insere a chave (o numero secreto) e a gira (executa o programa
fazendo-o encriptar). O algoritmo realiza seus passos utilizando a chave para alterar o
texto simples e converte-lo em texto cifrado. Para desbloquear o arquivo encriptado voce
insere a mesma chave e executa o programa. O algoritmo inverte os passos e converte o
texto cifrado de volta no texto simples original [Burnett e Paine, 2002].
Se um algoritmo criptografico e bom entao ele e conhecido e difundido. Por isso
mesmo, por sua difusao ampla e por varias pessoas conhecerem o seu funcionamento e
que utilizam-se as chaves. A chave protege a informacao cifrada. Nao basta conhecer
o algoritmo para acessar a informacao criptografada. E necessario tambem alimenta-lo
com a chave correta, que e unica. Daı a importancia de manter a chave em sigilo. Toda
criptografia moderna e computadorizada opera com chaves.
Ha duas classes de criptografia que operam com chaves: a criptografia de chave secreta
e a criptografia de chave publica.
12
2.1 Criptografia Simetrica
O algoritmo de criptografia simetrica ou de chave secreta utiliza uma chave para
transformar ou converter uma informacao em um conjunto de bits que parecem estar
dispostos de forma aleatoria. Nessa abordagem a mesma chave utilizada para cifrar os
dados e utilizada para decifra-los. Tanto o remetente quanto o destinatario usam a mesma
chave.
Figura 2.1: Criptografia Simetrica
Os algoritmos de chave simetrica podem ser divididos em cifras de fluxo (ou contınuas)
e em cifras por bloco. As cifras de fluxo cifram os bits da mensagem um a um, enquanto
que as cifras por bloco pegam um numero de bits e cifram como uma unica unidade.
Tipicamente sao utilizados blocos de 128, 192 ou 256 bits e chaves de 128, 192 ou 256 bits.
Alguns exemplos de algoritmos simetricos populares e bem reputados incluem Twofish,
13
Serpent, AES, Blowfish, CAST5, RC4, 3DES, e IDEA.
O “calcanhar de Aquiles”da criptografia simetrica esta na distribuicao da chave simetrica.
2.2 Criptografia Assimetrica
A criptografia assimetrica ou de chave publica contorna o problema da distribuicao
de chaves mediante o uso de chaves publicas. Neste novo sistema, cada pessoa detem um
par de chaves denominado chave publica e chave privada.
A chave publica e divulgada, e serve para cifrar uma mensagem, enquanto a chave
privada e mantida em segredo, e e usada para recuperar o conteudo original da mensagem
cifrada. A seguranca da criptografia de chave publica reside no fato de que as mensagens
codificadas com a chave publica so podem ser decodificadas com a chave privada corres-
pondente. Desta forma, nao e possıvel decifrar a mensagem com a mesma chave que a
cifrou (a chave publica), como acontece na criptografia simetrica. A Figura 2.2 ilustra
esse processo.
Figura 2.2: Criptografia Assimetrica
14
Apesar de existirem duas classes de algoritmos para cifrar informacoes, elas nao sao
utilizadas com a mesma frequencia. A justificativa esta relacionada ao desempenho: algo-
ritmos de chave publica sao lentos, ao passo que a criptografia de chave simetrica pode en-
criptar dados em grande quantidade bem mais rapidamente. Dependendo da plataforma,
alguns algoritmos simetricos podem operar em velocidades de 10MBps, 20MBps, 50MBps
(ou mais). Ao contrario, um algoritmo de chave publica provavelmente opera de 20KBps
a 200KBps por segundo, dependendo do algoritmo, da plataforma e de outros fatores
[Burnett e Paine, 2002].
15
Capıtulo 3
O Problema da Distribuicao de
Chaves
A criptografia de chave simetrica pode manter seguros os nossos dados, mas quando
o compartilhamento desses dados secretos com outras pessoas se faz necessario, entao,
tambem sera necessario compartilhar a chave utilizada para encripta-los. Ja que o pro-
blema de envio de informacoes sigilosas pode ser resolvido com a criptografia, fica agora
o problema de envio das chaves com seguranca. Como podemos enviar chaves secretas de
maneira segura para outras pessoas? Esse problema e conhecido como o problema de dis-
tribuicao de chaves : como duas ou mais pessoas podem, de maneira segura, compartilhar
chaves por vias inseguras?
Para cada classe de criptografia ha uma abordagem diferente para solucionar o pro-
blema da distribuicao de chaves. A criptografia de chave publica, por princıpio de fun-
cionamento, ja resolve esse problema com a publicacao da chave que criptografa. A cripto-
grafia de chave simetrica faz uso da tecnica de Acordo de Chaves para distribuir chaves
de criptografia. Ha ainda um metodo conhecido como Envelope Digital. Essa tecnica
faz uso das criptografias de chave publica e chave secreta ao mesmo tempo, metodo mais
conhecido como criptografia mista.
A Secao 3.2 apresenta o esquema conhecido como Envelope Digital, e a Secao 3.3.1
define a tecnica criada por Diffie e Hellman, adotada neste trabalho como solucao para o
compartilhamento de dados criptografados pelo software TrueCrypt.
16
3.1 Uso de chaves publicas
A criptografia de chave publica, por seu proprio princıpio de funcionamento, nao
utiliza a mesma chave para os processos de cifragem e decifragem de conteudos. Com
a seguranca matematica oferecida pela PKC 1 torna-se possıvel distribuir as chaves de
criptografia com seguranca, visto que o processo de decifragem so pode ser feita pela
chave privada correspondente a chave publica que cifrou o conteudo.
Dessa maneira, utilizando a chave que e publica para cifrar e a chave que e particular
(privada) para decifrar, pode-se contornar o problema da distribuicao de chaves.
3.2 Envelope digital
Como citado mais acima, os algoritmos de criptografia de chave assimetrica exigem
um esforco computacional muito maior que os algoritmos de chave simetrica, entao o ideal
e que se utilize os algoritmos mais rapidos para cifrar grandes quantidades de dados, e
os mais lentos para cifrar quantidades de dados menores, como 128 bits – o tamanho
provavel de uma chave simetrica.
Essa tecnica requer a utilizacao de dois algoritmos diferentes para concretizar seu
esquema. No envelope digital utilizamos a criptografia simetrica para cifrar a informacao
a ser compartilhada, e a criptografia assimetrica para cifrar a chave de sessao 2.
Sua operacao se da, por exemplo, do seguinte modo: com a chave simetrica – que
chamamos aqui de chave de sessao – ciframos o conteudo de um e-mail e criamos um
envelope criptografado. Essa chave de sessao e entao colocada em outro envelope, que
por sua vez, e cifrado utilizando a chave publica do seu destinatario, tornando-se um
envelope criptografado com chave publica, que protege uma chave de sessao. Este pacote
– o envelope digital – formado por ambos envelopes sao, enfim, enviados por e-mail. O
destinatario, ao receber o pacote, descriptografa um envelope utilizando sua chave privada,
obtendo acesso a chave de sessao. Tambem encontra outro envelope cifrado, e entao o
abre com esta ultima chave. Consegue, por fim, ter acesso a informacao original.
Assim, a informacao e a chave de sessao so estarao acessıveis para quem realmente
pode ter acesso a informacao: o proprietario da chave privada.
1Public Key Cryptography. Criptografia de Chave Publica.2A chave de sessao e a chave simetrica utilizada para cifrar os dados.
17
3.3 O Acordo de Chaves
Outra maneira de se resolver o problema da distribuicao de chaves e utilizar o Acordo
de Chaves, mais discutido na literatura como Key Agreement, sua forma no idioma Ingles.
Um Acordo de Chaves propoe que duas ou mais partes possam, literalmente, acordar a
respeito de um segredo em comum, nao sendo necessario o armazenamento desse segredo
por nenhuma das partes. Um acordo propoe ainda que ambas as partes possam gerar o
segredo compartilhado apenas utilizando um par de chaves correspondentes 3.
Sua utilizacao e ideal em cenarios onde se compartilha informacao cifrada com cripto-
grafia simetrica.
Uma das tecnicas que implementa a tecnica do Acordo de Chaves e o conhecido “Diffie-
Hellman Key Agreement”, amplamente conhecido pela sua eficiencia.
3.3.1 O algoritmo Diffie-Hellman
Como ja citado na Secao 1.7, em 1976 Whitfield Diffie e Martin Hellman, os cri-
adores do algoritmo, publicaram a tecnica em seu livro New Directions in Cryptography,
nomeando-a com suas iniciais.
Em 2002, Hellman sugeriu que o algoritmo Diffie-Hellman fosse chamado de Algoritmo
de Acordo de Chaves Diffie-Hellman-Merkle, em reconhecimento ao antecessor e funda-
mental trabalho feito por Ralph Merkle na invencao da PKC (Public Key Cryptography -
Criptografia de Chave Publica) [WordIq, 2010], [Stewart, 2000].
O algoritmo DH, como tambem e chamado, nao executa nenhuma tecnica de cifragem
de dados. Ao inves disso, ele utiliza a tecnologia de chave publica para gerar uma chave
de sessao simetrica [Ide et al., ]. Na realidade, ele so pode ser usado para estabelecer um
segredo compartilhado, que geralmente e usado como uma chave simetrica compartilhada
[Stamp, 2006].
Duas partes podem gerar o mesmo segredo desde que possuam suas proprias chaves
privadas e a chave publica de sua contraparte, que esta, obviamente, publicamente disponı-
vel. Esse e o acordo de chaves. Se combinarmos um valor privado com o outro valor
publico, cada indivıduo gerara o mesmo valor secreto [Burnett e Paine, 2002], como ilustra
a Figura 3.1.
3O Acordo de Chaves faz uso da PKI (Public Key Infrastructure).
18
Figura 3.1: O funcionamento do algoritmo de Diffie-Hellman.
No envelope digital, uma chave e gerada para cifrar o conteudo, e depois essa chave e
enviada, dessa vez cifrada, juntamente com o conteudo.
Com o DH nao se faz mais necessario a cifragem de dados utilizando a criptografia
assimetrica. Isto e ideal nos casos onde se tem limitacoes tecnicas ou computacionais e so
esta disponıvel ou so e possıvel utilizar a criptografia simetrica.
Com essa tecnica basta utilizar o valor secreto resultante dos calculos de DH como
sendo a chave de sessao. Para decifrar, o destinatario precisa apenas gerar o mesmo valor
secreto.
Vantagens da utilizacao desta tecnica:
• Nenhuma chave e enviada ou armazenada, entao melhoramos a garantia de segu-
ranca da informacao cifrada;
• Nenhuma chave e enviada e ainda sim pode-se ter um acordo de chaves eficaz e
eficiente;
• Elimina-se alguns bytes da mensagem, entao ganha-se no tamanho;
• A complexidade computacional e reduzida ao utilizar somente criptografia simetrica
para cifrar e decifrar conteudo;
19
• Solucionamos o problema motivador deste trabalho: o problema da distribuicao de
chaves na criptografia simetrica.
A seguranca do DH reside no problema de determinar logaritmos discretos para
numeros grandes.
Para exemplificar melhor a tecnica, imagine Alice e Bob dois parceiros de negocio, e
que haja entre eles a necessidade de uma troca de correspondencias confidenciais sobre
seus negocios. O DH funciona da seguinte forma:
Sejam q um numero primo e α uma raız primitiva de q . Isto e, a partir de α podemos
gerar todos os elementos de {1, 2, . . . , q − 1} como potencias da forma αi mod q para
i = 1, . . . q − 1.
1 Alice gera um valor privado Xa e Bob gera um valor privado Xb ;
2 Alice envia Ya = αXa mod q para Bob e Bob envia Yb = αXb mod q para Alice;
3 A chave secreta K = (Yb)(Xa) mod q de Alice e a chave secreta K = (Ya)
(Xb) mod q
de Bob sao iguais.
Xa e Xb sao ditas as chaves privadas de Alice e de Bob, respectivamente. Enquanto,
Ya e Yb sao ditas chaves publicas do acordo.
A seguranca do DH e garantia pela complexidade matematica em resolver o problema
a seguir:
Dados αXi mod q e αXj mod q, encontre αXi Xj .
Uma pessoa que esteja monitorando o canal de comunicacao entre Alice e Bob con-
seguiria obter as chaves publicas geradas, contudo nao conseguiria gerar a chave secreta
K, visto que para gera-la e necessario tambem uma das chaves privadas Xa ou Xb. Com
a chave secreta K Alice e Bob podem cifrar seus conteudos e ter confidencialidade nas
suas correspondencias.
20
A Figura 3.2 ilustra os valores das chaves secretas K. Com base nela, pode-se concluir
a igualdade αXb (Xa) mod q = αXa (Xb) mod q.
Figura 3.2: Geracao do valor secreto de DH
Para que os pares de chaves (Xa, Ya) e (Xb, Yb) sejam compatıveis e possam manter um
acordo entre si, eles tambem precisam compartilhar os mesmos parametros α e q. Para
que isso seja garantido, e necessario que ambos os pares tenham sido gerado pela mesma
entidade, e que esta entidade seja de confianca, visto que um ataque “man in the middle”
poderia ocorrer [Burnett e Paine, 2002].
A responsabilidade da entidade geradora dos pares de chaves e garantir que os parametros
sejam identicos para ambos os pares de chaves, e que estes pares sejam entregues corre-
tamente para seus devidos portadores.
Estabelecido o acordo e intercambiadas as chaves publicas, os parceiros participantes
desse acordo ja estao prontos para gerar o segredo, cifrar os dados e, entao, compartilha-
los.
21
Capıtulo 4
Aplicacao da tecnica
As solucoes para seguranca experimentam uma fase de intensa inovacao tecnologica
e de crescente sofisticacao motivadas, principalmente, pelo aumento constante das ativi-
dades maliciosas. O mercado de solucoes de seguranca e relativamente novo e apresenta
uma grande fragmentacao em termos de produtos disponıveis. Nele coexistem diversas
empresas, oferecendo solucoes para diversas areas.
Este capıtulo mostra uma maneira de aproveitar a tecnica Diffie-Hellman no software
TrueCrypt. Dentre os softwares disponıveis, o TrueCrypt foi o escolhido para este trabalho
por ser multiplataforma, freeware, e tambem pelas outras justificativas ja apresentadas
na Secao 1.8.
4.1 O software TrueCrypt
Com relacao a criptografia de dispositivos de armazenamento o mercado e amplo, e
dentre os softwares livres (freeware) mais conceituados hoje estao o EncryptOnClick, o
Rohos Mini Drive, o Kruptos e o TrueCrypt. Dos quatro softwares mencionados, o mais
eficiente e o mais utilizado e o TrueCrypt.
A sua eficiencia se da pela utilizacao de tecnologias como pipelining, que permite que
dados sejam lidos e escritos em um drive criptografado tao rapidamente quanto seria se o
drive nao o fosse, e parallelization, que permite que os dados sejam processados em paralelo
por todos os processadores ou nucleos presentes no sistema, tornando a manipulacao dos
dados muito mais rapida. O uso dessas tecnologias favorece em muito o recurso on-the-
fly 1 do software. On-the-fly e um recurso do software que faz com que as operacoes de
1Criptografia e descriptografia em tempo de execucao.
22
cifragem e decifragem do conteudo armazenado nos volumes criptografados acontecam em
tempo de execucao, isto e, ao mesmo tempo em que os dados sao lidos ou escritos pelo
sistema operacional do usuario. Esse recurso e possıvel atraves do uso das tecnologias de
pipelining e parallelization. Esse recurso torna transparente, e muito mais simples para o
usuario, o processo de cifragem e decifragem dos dados em um volume.
O TrueCrypt hoje, na sua versao mais atual 7.0, trabalha somente com algoritmos de
encriptacao de chave simetrica, nao oferecendo os algoritmos de chave assimetrica. Os
algoritmos disponıveis sao: AES, Serpent, Twofish. Para aumentar ainda mais o nıvel
da complexidade da criptografia aplicada aos seus volumes, o TrueCrypt ainda utiliza de
tecnicas de iteracao de algoritmos, ou aplicacao de algoritmos em cascata, como descrito na
propria documentacao do software [TrueCrypt-Foundation, 2009]. Dessa maneira pode-
se utilizar combinacoes de algoritmos para criptografar os dados, acrescentando a lista
de algoritmos inicial os seguintes: AES-Twofish, AES-Twofish-Serpent, Serpent-AES,
Serpent-Twofish-AES, Twofish-Serpent. Essa aplicacao de um algoritmo sobre o outro e
uma tentativa de aumentar a dificuldade de interpretacao dos bits do volume, suprindo a
falta de algoritmos assimetricos, mais sofisticados.
Este trabalho propoe a integracao entre a tecnica do Acordo de Chaves de Diffie-
Hellman e o TrueCrypt, a fim de permitir o compartilhamento do volume criptografado
por esse software entre varias pessoas. Isso e util quando o acesso ao volume criptografado
precisa ser feito por duas ou mais pessoas, que podem ou nao estar separadas geografica-
mente.
4.2 Aplicacao da tecnica de DH no TrueCrypt
O TrueCrypt trabalha com elementos chamados volumes, os quais sao montados pelo
software e, entao, interpretados pelo sistema operacional como se fossem discos fısicos
propriamente ditos. Esses volumes podem ser um dispositivo inteiro, uma particao em
um dispositivo de armazenamento, ou um arquivo dentro de algum disco (conectado local
ou remotamente). Eles sao os conteineres onde os dados criptografados sao armazenados.
Para criar esses volumes criptografados o TrueCrypt oferece um assistente, onde sao
selecionadas varias opcoes, tais como: tipo de volume, local a ser salvo, algoritmo de
criptografia, tamanho do volume, tipo de sistema de arquivos e outras. Uma dessas opcoes
e a keyfile. O termo keyfile remete simplesmente a um arquivo, que pode ser utilizado para
23
reforcar o mecanismo de criptografia do volume. Segundo [TrueCrypt-Foundation, 2009],
e recomendavel que se use pelo menos uma keyfile, e que esta seja de pelo menos 64bytes.
O proprio TrueCrypt oferece um recurso onde pode ser gerado um arquivo keyfile com
bits aleatorios. Todavia, este recurso nao e util no cenario que propomos – um cenario
onde existe a necessidade de compartilhamento desse volume criado –, visto que o segundo
usuario desse volume criptografado tambem necessitaria do mesmo arquivo original uti-
lizado como keyfile. Isto se faz necessario pois o software necessita sempre do mesmo
arquivo original. Uma copia do arquivo original nao funciona como keyfile valida.
Uma outra opcao disponıvel e a senha. No TrueCrypt a utilizacao de senha e obri-
gatoria, como mostra a Figura 4.1. Tal obrigatoriedade existe pois o software uti-
liza o metodo PBKDF2 (Password-Based Key Derivation Function) de criptografia. O
PBKDF2 esta especificado na PKCS #5 v2.0 (Public Key Cryptography Standard)
[Laboratories, 2005], e e utilizado no TrueCrypt para gerar as Header Keys, que pro-
tegem as Master Keys, que, por suas vezes, sao a chave que cifram os volumes. A PKCS
#5 v2.0 e um Padrao de Criptografia de Chave Publica Baseado em Senha e, conforme
esta disposto em [Laboratories, 2005], o metodo PBKDF2 e uma funcao de derivacao de
chaves utilizada para derivar uma chave de criptografia a partir de uma senha, de um
valor pseudo-aleatorio – comumente conhecido como salt – e de um contador de iteracoes.
Header Keys e Master Key sao termos utilizados pelo TrueCrypt para referenciar as chaves
utilizadas por esse software para cifrar os volumes.
E neste ponto que se insere este trabalho. Para que dois parceiros possam compartilhar
e utilizar o mesmo volume e necessario que haja um consenso entre as partes com relacao
a senha de protecao do volume. E necessario que a senha seja acordada entre as partes,
e nao que ela seja repassada de um lado para outro, colocando em risco a seguranca das
informacoes no volume. Entao, trata-se do acordo de chaves! Neste caso, melhor dizendo,
um acordo de senha.
Figura 4.1: TrueCrypt requisitando a senha para cifrar/decifrar um volume.
24
4.3 A senha compartilhada
Pensando nisso e que desenvolvemos uma aplicacao para gerar essa senha. Se pre-
cisamos de uma senha eficiente para acessar o volume criptografado e nao podemos envia-
la junto com esse volume, entao todos os participantes do acordo podem utilizar o algo-
ritmo Diffie-Hellman para gera-la. Basta que sejam obedecidos os requisitos do algoritmo:
estar de posse da sua chave privada, da chave publica de sua contraparte e ambas as chaves
terem sido geradas com os mesmos parametros – o numero primo q e α a raiz primitiva
de q, como citado na secao 3.3.1.
E importante enfatizar que no TrueCrypt a senha nao funciona como a chave de
criptografia, mas e uma parte do conjunto de todos os itens que compoem o segredo que
cifra os volumes. Caso essa parte esteja ausente (ou seja incorreta), bem como outras
partes (a keyfile, a semente, o hash, as header keys e a master key), os volumes nao
podem ser abertos, mantendo, assim, o sigilo dos dados.
O assistente de criacao de volumes do TrueCrypt informa que uma senha ideal contem
pelo menos 20 caracteres, e, em [TrueCrypt-Foundation, 2009], consta que a melhor segu-
ranca pode ser atingida utilizando-se o tamanho maximo do campo senha: 64 caracteres
alfanumericos.
25
Capıtulo 5
O Prototipo
Foi desenvolvido um prototipo que implementa o algoritmo DH e gera um acordo
entre duas partes, levando em conta os detalhes do TrueCrypt. A senha de 64 caracteres
alfanumericos e obtida a partir deste acordo. Ele tambem gera pares de chaves DH,
funcionando como uma entidade geradora de chaves.
5.1 O prototipo desenvolvido
O primeiro passo para se definir um acordo de chaves de DH e gerar os dois pares de
chaves de DH, um para cada parceiro no acordo. Para que gerem o mesmo segredo, esses
pares de chaves precisam ser compatıveis, isto e, devem possuir alguns parametros em
comum (o numero primo q e a raiz primitiva α de q), como descrito na Secao 4.3. E para
conseguirem os mesmos parametros, os geradores de pares de chaves de ambos os parceiros
devem utilizar o mesmo provedor de parametros. A aplicacao desenvolvida neste trabalho
tambem e um gerador de par de chaves, e utiliza o provedor SunJCE, que e fornecido pela
propria linguagem Java, a partir da versao 6.0. Na linguagem Java, um provedor deve
implementar a interface java.security.Provider. Os provedores de chaves disponıveis
na Internet e mais utilizados em Java sao o SunJCE e o Bouncy Castle.
Como nao ha estabelecida uma entidade externa provedora de chaves de confianca para
fornecer os pares de chaves de DH, faz-se necessario gerar esses pares com o prototipo
desenvolvido.
Sendo assim, utilizando este aplicativo, um dos parceiros deve gerar o primeiro par de
chaves, onde novos parametros serao definidos pelo Provider estabelecido. Em seguida,
a segunda parte gera o seu proprio par de chaves, a partir da chave publica do primeiro
26
parceiro.
Vejamos um exemplo desse processo:
(1) Bob gera seu par de chaves DH, e envia a chave publica para Alice;
(2) Alice, com a chave publica de Bob, gera seu proprio par de chaves DH. Logo
apos, envia sua chave publica para Bob;
(3) A partir de agora, ambas as partes possuem pares de chaves DH compatıveis,
e estao de posse da chave publica de seus parceiros. Para gerarem a senha, basta
informar sua chave privada e a chave publica do outro (processo ilustrado pelas
figuras 3.1 e 3.2).
Como podemos perceber em (2), uma DH Public Key contem informacoes suficientes
para que um novo par de chaves DH seja criado a partir dela.
O passo (1) e executado no painel ilustrado pela Figura 5.1 abaixo.
Figura 5.1: Painel onde e gerado um par de chaves DH com novos parametros.
27
O passo (2) e executado no painel do aplicativo, como ilustrado abaixo pela Figura 5.2.
Figura 5.2: Painel onde e gerado um par de chaves DH, com os mesmos parametros da
chave publica fornecida.
O passo (3) e executado no seguinte painel da aplicacao (Figura 5.3):
Figura 5.3: Painel onde e gerada a senha.
As chaves geradas com a aplicacao tem 1024 bits de comprimento, e sao fornecidas a
partir do provedor SunJCE. As chaves de DH manipuladas e geradas neste prototipo nao
necessariamente precisam de uma extensao, visto que este conceito e variavel para cada
28
sistema operacional. Entretanto, optamos por definir que as chaves publicas carregam a
extensao .pbk, e as chaves privadas levam a extensao .pvk, para facilitar a identificacao
e a localizacao desses arquivos pelo usuario.
Com o acordo feito a partir dessas chaves, o segredo gerado e um vetor de bytes, que
tambem tera 1024 bits, ou 128 bytes de comprimento.
Apos ser gerado, o segredo e convertido em um vetor de 256 caracteres hexadecimais.
Desse novo vetor de tamanho 256, foram adotados como senha os 64 caracteres do centro.
Melhorando a compreensao, a senha sera um subvetor do vetor de 256 posicoes, que
contera somente 64 caracteres dos 256 gerados. Esses 64 caracteres estao na regiao central
do vetor maior, ou seja, foi adotado que sao os caracteres da posicao 96 ate a posicao 160.
Figura 5.4: Obtencao da senha a partir do vetor de bytes do segredo.
Depois de gerada a senha, para utiliza-la basta copia-la para o clipboard e cola-la no
TrueCrypt. A copia e confirmada com um aviso na tela, como ilustra a Figura 5.5.
Figura 5.5: Copia da senha gerada para a area de transferencia do sistema operacional.
Ao montar um volume no TrueCrypt, a senha sera solicitada. Depois de te-la copiado
para o clipboard, basta cola-la no campo de senha da janela que o TrueCrypt fornece,
como na Figura 5.6.
29
Figura 5.6: Insercao de senha para acessar volume do TrueCrypt.
5.2 A implementacao
A implementacao do programa foi feita em linguagem Java versao 6, utilizando um
computador com Processador AMDr Turion 64X2, com clock de 1.6GHz por nucleo
e 3GB de memoria RAM. Foi utilizado o IDE Netbeans, versao 6.8, para auxiliar a
codificacao do prototipo.
Como foi sugerido utilizar os resultados dos calculos – a senha – no TrueCrypt, que tem
versoes para as plataformas Windows, Linux e Mac, entao o prototipo foi implementado
em linguagem Java, tornando-o tambem compatıvel com estas plataformas.
Foi criada uma classe que implementa os metodos que manipulam o acordo, chamada
GeradorDH.java. Seu codigo fonte esta anexado no Apendice A.1.
Essa classe pode ser instanciada com um ou sem nenhum argumento. Um argumento
valido deve ser do tipo DHParameterSpec. Se ela for inicializada com nenhum argumento,
entao isto indica que um novo conjunto de parametros de par de chaves DH deve ser
preparado pelo Provider. Caso um DHParameterSpec seja fornecido como argumento,
30
entao isto indica que os parametros para gerar um novo par ja foram definidos anteri-
ormente, e o novo par a ser gerado deve utilizar estes mesmos parametros. Este caso e
aplicado no momento onde um novo par de chaves deve ser criado a partir de uma chave
publica fornecida.
Uma outra funcao tambem implementada e a que copia a senha gerada para a area
de transferencia do sistema operacional. O intuito aqui foi agilizar o processo de copia
da senha da aplicacao para o TrueCrypt, visto que o prototipo nao armazena esta senha
em nenhum arquivo. O botao que implementa esta acao esta no painel onde e gerada a
senha (ilustrado pela Figura 5.3).
A classe que copia a senha para a area de transferencia do sistema operacional (clip-
board) e a Transferencia.java. Seu codigo fonte esta anexado no Apendice A.2.
Tambem foram implementadas as classes AplicacaoApp.java e AplicacaoView.java
que oferecem a interface grafica com o usuario. Para implementar este aplicativo como
uma Java Desktop Application, foi utilizada a biblioteca org.jdesktop.application do
Java 6.
O Javadoc 1 da aplicacao e todos os codigos fonte Java implementados estao contidos
no CD que acompanha este trabalho.
O diagrama de classes UML que auxilia o entendimento da arquitetura desta aplicacao
pode ser visto no Apendice B.1.
1Documentacao de um codigo fonte Java.
31
Capıtulo 6
Conclusao
O compartilhamento de dados e uma pratica corriqueira e, muitas vezes, os dados
compartilhados sao confidenciais e devem ser protegidos. Para se garantir tal confiden-
cialidade, pode-se utilizar algum sistema criptografico conhecido (AES, DES). O True-
Crypt e um dos muitos softwares que podem ser utilizados para criptografar dados. Ele
utiliza o conceito de volumes para definir o conteiner onde os dados criptografados sao
armazenados.
Neste trabalho foi abordada a questao do compartilhamento de chave de seguranca
entre duas partes geograficamente distantes.
Foi criado um prototipo de aplicacao que implementa a tecnica de Diffie-Hellman para
estabelecer um acordo de chaves, atraves da definicao de uma senha compartilhada, que e
utilizada para cifrar e decifrar os volumes do TrueCrypt. A aplicacao foi desenvolvida na
linguagem de programacao JAVA versao 6, e e compatıvel com as plataformas Windows,
Linux e Mac. Pode ser aplicada em varios cenarios onde haja compartilhamento de
informacoes seguras. Em tempo, tal aplicacao soluciona o problema de distribuicao de
chaves em criptografia simetrica.
O resultado obtido foi satisfatorio, visto que com a aplicacao desenvolvida as partes
do acordo podem gerar a mesma senha a qualquer momento, com pouco recurso com-
putacional e com simplicidade. Assim, as partes podem compartilhar, com seguranca, o
volume criptografado sem se preocupar com a divulgacao da senha que o protege.
Como trabalhos futuros, pode-se implementar uma versao que utilize chaves PGP, ou
certificados de seguranca PKCS #3, como descrito em [Laboratories, 1993], ao inves de
utilizar padrao proprio de chaves, como foi feito neste trabalho. Isto permitira a obtencao
32
dos pares de chaves por entidades externas, eliminando (opcionalmente) a necessidade
de implementar o modulo que gera os pares de chaves. Sugere-se tambem tornar este
aplicativo um modulo do TrueCrypt, para integrar ainda mais esta solucao ao software.
33
Referencias
Almeida, G. B. d. C. (2009). Autenticacao Segura Baseada em Biometria Voltada para a
Dinamica da Digitacao. Monografia, Universidade Federal de Goias.
Burnett, S. e Paine, S. (2002). Criptografia e Seguranca - O Guia Oficial RSA. ISBN-10:
8535210091. Elsevier, 1st edition.
CERT.BR (2006). Cartilha de seguranca. Diponıvel em: http://cartilha.cert.br/.
Filho, A. M. d. S. (2004). Seguranca da informacao: Sobre a necessi-
dade de protecao de sistemas de informacoes. Online. Disponıvel em:
http://www.espacoacademico.com.br/042/42amsf.htm.
Ide, M. T., Reis, J. M., e Kanasoro, R. K. Seguranca
de redes & criptografia. Webpage. Online. Disponıvel em
http://www.shammas.eng.br/acad/sitesalunos0106/012006seg/criptografia.html.
Acessado em setembro de 2010.
Information, W. (2009). Timeline cryptography. Online. Disponıvel em: http://world-
information.org/wio/infostructure/100437611776.
Laboratories, R. (1993). Pkcs #3 v1.4: Diffie-hellman key-agreement
standard. Technical note, RSA Laboratories. Online. Disponıvel em:
ftp://ftp.rsasecurity.com/pub/pkcs/doc/pkcs-3.doc .
Laboratories, R. (2005). Pkcs #5 v2.0: Password-based cryptography
standard. Technical note, RSA Laboratories. Online. Disponıvel em
ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-5v2/pkcs5v2-0.pdf .
Marciano, J. L. P. (2006). Seguranca da Informacao - uma abordagem social. Tese de
doutorado, Universidade de Brasılia.
Moreira, N. S. (2001). Seguranca Mınima - Uma Visao Corporativa da Seguranca de
Informacoes. Axcel Books.
Moreno, E. D., Pereira, F. D., e Chiaramonte, R. B. (2005). Criptografia em Software e
Hardware. Novatec.
34
Promon (2005). Seguranca da informacao, um diferencial determinante na com-
petitividade das corporacoes. Revista, Promon. Online. Disponıvel em:
http://www.promon.com.br/portugues/noticias/download/Seguranca 4Web.pdf.
Stamp, M. (2006). Information Security - Principles and Practice. ISBN-13: 978-0-471-
73848-0. Wiley.
Stewart, B. (2000). Living Internet. Online. Disponıvel em
http://www.livinginternet.com/i/is crypt pkc.htm. Acessado em setembro de 2010.
Tkotz, V. (2009). Historia da criptologia. Pagina na internet, Aldeia Numa Boa, disponıvel
em: http://www.numaboa.com/criptografia/. Acessada em Junho de 2009.
TrueCrypt-Foundation (2009). Documentation. Online. Acessado em Agosto
de 2009, disponıvel em TrueCrypt Free Open-source on-the-fly encryption:
http://www.truecrypt.org/docs.
Weiszflog, W. (2008). Michaelis Moderno Dicionario da Lıngua Portuguesa. Melhora-
mentos, Disponıvel em: http://michaelis.uol.com.br/.
WordIq (2010). Diffie-hellman definition. Online. Disponıvel em
http://www.wordiq.com/definition/Diffie-Hellman. Acessado em setembro de 2010.
35
Apendice A
Codigos Fonte
A.1 A classe GeradorDH
Codigo A.1: A classe GeradorDH.java
1 package aplicacao;
2
3 import java.io . File ;
4 import java.io .FileInputStream;
5 import java.io .FileNotFoundException;
6 import java.io .FileOutputStream;
7 import java.io .IOException;
8 import java.io .ObjectInputStream;
9 import java.io .ObjectOutputStream;
10 import java. security .AlgorithmParameterGenerator;
11 import java. security .AlgorithmParameterGeneratorSpi;
12 import java. security .AlgorithmParameters;
13 import java. security .InvalidAlgorithmParameterException;
14 import java. security .InvalidKeyException;
15 import java. security .KeyPair;
16 import java. security .KeyPairGenerator;
17 import java. security .NoSuchAlgorithmException;
18 import java. security .Provider;
19 import java. security .SecureRandom;
20 import java. security .spec.InvalidParameterSpecException;
21 import javax.crypto.KeyAgreement;
22 import javax.crypto. interfaces .DHPrivateKey;
23 import javax.crypto. interfaces .DHPublicKey;
36
24 import javax.crypto.spec.DHParameterSpec;
25
26 /∗∗
27 ∗
28 ∗ @author Rayner Pires
29 ∗/
30 public class GeradorDH {
31
32 private DHParameterSpec paramSpecs;
33 private Provider provedor = new com.sun.crypto.provider.SunJCE();
34
35 /∗∗
36 ∗ Chama ele proprio, passando como argumento <code>null</code>.
37 ∗/
38 public GeradorDH() {
39 this (null ) ;
40 }
41
42 /∗∗
43 ∗ Cria um novo objeto para gerar dados sobre um acordo de chaves de DH.
44 ∗ E inicializado com os parametros que, provavelmente, vieram de uma outra
45 ∗ chave. Se {@code parametros} nao for nulo, entao a variavel global
46 ∗ {@code paramSpecs} e inicializada.
47 ∗
48 ∗ @param parametros Os parametros de inicializacao do acordo. Se
49 ∗ {@code parametros} for <i>null</i>, entao novos parametros sao
50 ∗ criados atraves do metodo <code>getParametrosDH</code>.
51 ∗ @see GeradorDH#getParametrosDH
52 ∗/
53 public GeradorDH(DHParameterSpec parametros) {
54 if (parametros == null) {
55 this .paramSpecs = getParametrosDH(1024, this.provedor);
56 } else {
57 this .paramSpecs = parametros;
58 }
59 }
60
61 /∗∗
62 ∗ Exporta um par de chaves para um diretorio no disco.
37
63 ∗
64 ∗ @param parChaves
65 ∗ @param diretorio
66 ∗ @return {@code true} apenas se o par for salvo com sucesso;
67 ∗ {@code false} caso contrario .
68 ∗/
69 public static boolean exportaPar(KeyPair parChaves, File diretorio) {
70 ObjectOutputStream saida;
71 try {
72 // exporta publica
73 diretorio = new File(diretorio .getPath() + File.separator
74 + "chave publica.pbk");
75 diretorio .createNewFile();
76 saida = new ObjectOutputStream(new FileOutputStream(diretorio));
77 saida.writeObject(parChaves.getPublic());
78 saida. flush () ;
79 saida. close () ;
80
81 //exporta privada
82 diretorio = new File(diretorio .getParent() + File.separator
83 + "chave privada.pvk");
84 diretorio .createNewFile();
85 saida = new ObjectOutputStream(new FileOutputStream(diretorio));
86 saida.writeObject(parChaves.getPrivate());
87 saida. flush () ;
88 saida. close () ;
89 return true;
90 } catch (FileNotFoundException ex) {
91 System.err.println("Erro: O arquivo " + diretorio.getAbsolutePath()
92 + " n~ao pode ser encontrado.");
93 } catch (IOException ex) {
94 System.err.println("Erro ao salvar o par de chaves. I/O error.");
95 }
96 return false ;
97 }
98
99 /∗∗
100 ∗ Importa um par de chaves DH de um arquivo e o retorna.
101 ∗ Opcionalmente pode−se informar strings onde podem ser salvos os caminhos
38
102 ∗ completos de cada chave encontrada.
103 ∗ @param diretorio Onde deve ser feita a busca.
104 ∗ @param caminhoChavePrivada (Opcional) Serve para armazenar o local onde
105 ∗ foi encontrada a chave privada.
106 ∗ @param caminhoChavePublica (Opcional) Serve para armazenar o local onde
107 ∗ foi encontrada a chave publica.
108 ∗ @return O par de chaves encontrado.
109 ∗/
110 public static KeyPair importaPar(File diretorio,
111 String caminhoChavePrivada, String caminhoChavePublica) {
112 File pvk = null, pbk = null;
113 File [] fileList = diretorio . listFiles () ;
114 for ( int i = 0; i < fileList .length; i++) {
115 File tmp = fileList [ i ];
116 if (tmp.isFile () && tmp.canRead()) {
117 if (tmp.getName().endsWith(".pvk")) {
118 pvk = tmp;
119 if (caminhoChavePrivada != null) {
120 caminhoChavePrivada = tmp.getPath();
121 }
122 } else if (tmp.getName().endsWith(".pbk")) {
123 pbk = tmp;
124 if (caminhoChavePublica != null) {
125 caminhoChavePublica = tmp.getPath();
126 }
127 }
128 }
129 if (pvk != null && pbk != null) {
130 break;
131 }
132 }
133 ObjectInputStream ois;
134 KeyPair parChavesDH = null;
135 try {
136 ois = new ObjectInputStream(new FileInputStream(pvk));
137 DHPrivateKey privada = (DHPrivateKey) ois.readObject();
138 ois . close () ;
139
140 ois = new ObjectInputStream(new FileInputStream(pbk));
39
141 DHPublicKey publica = (DHPublicKey) ois.readObject();
142 ois . close () ;
143 parChavesDH = new KeyPair(publica, privada);
144 } catch (ClassNotFoundException ex) {
145 System.err.println("ERRO: O arquivo lido esta corrompido ou "
146 + "n~ao e uma chave privada de DH.");
147 } catch (FileNotFoundException ex) {
148 System.err.println("ERRO: N~ao ha chave neste diretorio.");
149 } catch (IOException ex) {
150 System.err.println("Erro de I/O!\n"
151 + "\t" + ex.getMessage());
152 }
153 return parChavesDH;
154 }
155
156 /∗∗
157 ∗ Gera um par de chaves com base nos parametros contidos na variavel global
158 ∗ {@code paramSpecs}.
159 ∗ @return O par de chaves DH gerado.
160 ∗/
161 public KeyPair getNovoParChavesDH() {
162 KeyPair parChaves = null;
163 try {
164 System.out.println("Gerando um par de chaves DH ...");
165 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DH");
166 keyPairGen. initialize ( this .paramSpecs);
167 parChaves = keyPairGen.generateKeyPair();
168 } catch (NoSuchAlgorithmException ex) {
169 System.err.println("ERRO: Algoritmo n~ao encontrado.");
170 } finally {
171 return parChaves;
172 }
173 }
174
175 /∗∗
176 ∗ Retorna uma string de tamanho 64 a partir do segredo compartilhado gerado
177 ∗ pelo metodo {@code getEncodedSecret}.
178 ∗ Primeiramente o vetor de bytes retornado pelo metodo
179 ∗ {@code getEncodedSecret} e convertido em um vetor de caracteres
40
180 ∗ hexadecimais. Por ultimo mantem nesse vetor somente os 64 caracteres
181 ∗ do centro. Desse ultimo vetor de 64 caracteres que e formada a
182 ∗ string que e retornada.
183 ∗
184 ∗ @param dhPrivateKey A chave privada do acordo
185 ∗ @param dhPublicKey A chave publica do acordo
186 ∗ @return uma string de caracteres hexadecimais de tamanho 64.
187 ∗ @throws InvalidParameterSpecException Em caso de as chaves informadas nao
188 ∗ serem compatıveis, ou nao fizerem parte do mesmo acordo.
189 ∗/
190 public String getSenha(DHPrivateKey dhPrivateKey,
191 DHPublicKey dhPublicKey) throws InvalidParameterSpecException {
192 byte [] segredo = getEncodedSecret(dhPrivateKey, dhPublicKey);
193 String hexa = toHex(segredo);
194 int comeco = (hexa.length() − 64) / 2;
195 int fim = comeco + 64;
196 hexa = hexa.substring(comeco, fim);
197 return hexa;
198 }
199
200 /∗∗
201 ∗ Gera o segredo compartilhado pelo acordo de DH.
202 ∗ Primeiramente consulta o metodo {@code comparaParametrosDH}
203 ∗ para verificar se as chaves passadas como argumento sao compatıveis entre
204 ∗ si , ou seja , se foram geradas com os mesmo parametros.
205 ∗ Em caso positivo, inicializa o acordo com essas chaves e gera o segredo
206 ∗ compartilhado. Em caso negativo, lanca uma
207 ∗ {@code InvalidParameterSpecException}.
208 ∗ @param dhPrivateKey A chave privada de um parceiro do acordo.
209 ∗ @param dhPublicKey A chave publica do outro parceiro do acordo.
210 ∗ @return O segredo compartilhado na forma de um vetor de bytes, cujo
211 ∗ tamanho e 128 (multiplo de 64).
212 ∗ @throws InvalidParameterSpecException
213 ∗ @see GeradorDH#comparaParametrosDH
214 ∗/
215 private byte [] getEncodedSecret(DHPrivateKey dHPrivateKey,
216 DHPublicKey dHPublicKey) throws InvalidParameterSpecException {
217 byte [] segredo = null;
218 if (comparaParametrosDH(dHPrivateKey, dHPublicKey)) {
41
219 try {
220 KeyAgreement acordo = KeyAgreement.getInstance("DiffieHellman");
221 acordo. init (dHPrivateKey, dHPrivateKey.getParams());
222 acordo.doPhase(dHPublicKey, true);
223 segredo = acordo.generateSecret();
224 } catch (InvalidAlgorithmParameterException ex) {
225 System.err.println("ERRO: Parametro para algoritmo invalido.");
226 } catch (InvalidKeyException ex) {
227 System.err.println("ERRO: Chave invalida.");
228 } catch (NoSuchAlgorithmException ex) {
229 System.err.println("ERRO: Algoritmo n~ao encontrado.");
230 }
231 } else {
232 throw new InvalidParameterSpecException("Os parametros das chaves "
233 + "n~ao correspondem. "
234 + "N~ao e possıvel gerar um acordo Diffie-Hellman.");
235 }
236 return segredo;
237 }
238
239 /∗∗
240 ∗ Compara os parametros DH de duas chaves a fim de verificar se as duas
241 ∗ sao aptas a realizarem um acordo de chaves de DH corretamente.
242 ∗ @param dhPrivateKey
243 ∗ @param dhPublicKey
244 ∗ @return {@code true} somente se os parametros tiverem os mesmos valores;
245 ∗ {@code false} caso contrario .
246 ∗/
247 private boolean comparaParametrosDH(DHPrivateKey dhPrivateKey,
248 DHPublicKey dhPublicKey) {
249 DHParameterSpec param1 = dhPrivateKey.getParams();
250 DHParameterSpec param2 = dhPublicKey.getParams();
251 if (param1.equals(param2)) {
252 return true;
253 } else {
254 if (param1.getL() == param2.getL()) {
255 if (param1.getG().equals(param2.getG())) {
256 if (param1.getP().equals(param2.getP())) {
257 return true;
42
258 } else if (param1.getP().intValue()
259 == param2.getP().intValue()) {
260 return true;
261 }
262 } else if (param1.getG().intValue()
263 == param2.getG().intValue()) {
264 if (param1.getP().equals(param2.getP())) {
265 return true;
266 } else if (param1.getP().intValue()
267 == param2.getP().intValue()) {
268 return true;
269 }
270 }
271 }
272 }
273 return false ;
274 }
275
276 /∗∗
277 ∗ Gera um conjunto de parametros de algoritmo para o par de chaves.
278 ∗ Trata−se do numero primo <i>p</i> e de sua raiz primitiva <i>α</i>
279 ∗ e de outros valores , que devem ser o mesmo nos dois pares do acordo,
280 ∗ para que o segredo gerado seja o mesmo para ambos os parceiros.
281 ∗
282 ∗ @param tamanho numero de bits
283 ∗ @param provedor o provedor que implementa
284 ∗ <code>{@link AlgorithmParameterGeneratorSpi}</code> e que gerara os
285 ∗ parametros.
286 ∗ @return Um objeto <code>{@link DHParameterSpec}</code> contendo as
287 ∗ especificacoes dos parametros comuns as chaves de um acordo de
288 ∗ Diffie−Hellman.
289 ∗/
290 private DHParameterSpec getParametrosDH(int tamanho, Provider provedor) {
291 DHParameterSpec especificacoesDH = null;
292 try {
293 if (tamanho < 0) {
294 throw new IllegalArgumentException("O tamanho da chave deve ser"
295 + " maior que zero e multiplo de 64. E recomendavel que"
296 + " seja, pelo menos, 256.");
43
297 }
298 System.out.println(GeradorDH.class.getName()
299 + ": Criando os parametros Diffie-Hellman "
300 + "(pode demorar bastante) ...");
301 AlgorithmParameterGenerator paramGen =
302 AlgorithmParameterGenerator.getInstance("DH", provedor);
303 paramGen.init(tamanho, new SecureRandom());
304 AlgorithmParameters params = paramGen.generateParameters();
305 especificacoesDH =
306 (DHParameterSpec) params.getParameterSpec(DHParameterSpec.class);
307 } catch (InvalidParameterSpecException ex) {
308 System.err.println("Os parametros das chaves "
309 + "n~ao correspondem. "
310 + "N~ao e possıvel gerar um acordo Diffie-Hellman.");
311 } catch (NoSuchAlgorithmException ex) {
312 System.err.println("ERRO: Algoritmo n~ao encontrado.");
313 }
314 return especificacoesDH;
315 }
316
317 /∗∗
318 ∗ Converte o vetor de bytes fornecido em um vetor de caracteres
319 ∗ hexadecimais, representado por uma string.
320 ∗
321 ∗ @param data o vetor de bytes a ser convertido.
322 ∗ @return uma representacao hexadecimal do vetor de bytes {@code data}
323 ∗/
324 private String toHex(byte[] data) {
325 String digits = "0123456789abcdef";
326 StringBuilder buf = new StringBuilder();
327 for ( int i = 0; i != data.length; i++) {
328 int v = data[i] & 0xff;
329 Object o = digits.charAt(v >> 4);
330 buf.append(o);
331 buf.append(digits.charAt(v & 0xf));
332 }
333 return buf.toString() ;
334 }
335 }
44
A.2 A classe Transferencia
Codigo A.2: A classe Transferencia.java
1 package aplicacao;
2
3 import java.awt.Toolkit;
4 import java.awt.datatransfer.Clipboard;
5 import java.awt.datatransfer.ClipboardOwner;
6 import java.awt.datatransfer.DataFlavor;
7 import java.awt.datatransfer. StringSelection ;
8 import java.awt.datatransfer.Transferable;
9 import java.awt.datatransfer.UnsupportedFlavorException;
10 import java.io .IOException;
11 import java. util . logging.Level;
12 import java. util . logging.Logger;
13
14 /∗∗
15 ∗ Classe que implementa a manipulacao de dados com a area de transferencia
16 ∗ do sistema.
17 ∗
18 ∗ @author Rayner de Melo Pires
19 ∗/
20 final class Transferencia implements ClipboardOwner {
21
22 @Override
23 public void lostOwnership(Clipboard clipboard, Transferable contents) {
24 System.out.println("O conteudo da area de transferencia ja n~ao pertence mais a \n"
25 + "aplicac~ao de DH.");
26 }
27
28 boolean copiaPara(String senha) {
29 Transferable conteudo = new StringSelection(senha);
30
31 Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
32 clipboard.setContents(conteudo, this) ;
33 if (getClipboard().equals(senha)) {
34 System.out.println("Senha copiada para a area de transferencia!");
35 return true;
36 }
45
37 System.out.println("Erro: Senha n~ao copiada para a area de transferencia.");
38 return false ;
39 }
40
41 private String getClipboard() {
42 String result = "";
43 Clipboard at = Toolkit.getDefaultToolkit().getSystemClipboard();
44 Transferable conteudo = at.getContents(this);
45 boolean hasTransferableText = (conteudo != null) && conteudo.isDataFlavorSupported(
DataFlavor.stringFlavor);
46 if (hasTransferableText) {
47 try {
48 result = (String) conteudo.getTransferData(DataFlavor.stringFlavor);
49 } catch (UnsupportedFlavorException ex) {
50 Logger.getLogger(Transferencia.class .getName()).log(Level.SEVERE, null, ex);
51 } catch (IOException ex) {
52 Logger.getLogger(Transferencia.class .getName()).log(Level.SEVERE, null, ex);
53 }
54 }
55 return result ;
56 }
57 }
46
Apendice B
Diagrama UML
Figura B.1: Diagrama de classes
47
Apendice C
Codigos Fontes e Javadoc
O Javadoc e todos os codigos fontes da aplicacao criados estao gravados no CD que
acompanha este material.
48