Вы находитесь на странице: 1из 62

UNIVERSIDADE FEDERAL DE GOIÁS – UFG

CAMPUS CATALÃO – CAC

DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO – DCC

Bacharelado em Ciência da Computação

Projeto Final de Curso

Aplicação do Algoritmo Diffie-Hellman no


Compartilhamento de Volumes Criptografados do
TrueCrypt

Autor: Rayner de Melo Pires

Orientador: Vaston Gonçalves da Costa

Catalão – 2010
Rayner de Melo Pires

Aplicação do Algoritmo Diffie-Hellman no Compartilhamento de Volumes


Criptografados do TrueCrypt

Monografia apresentada ao Curso de


Bacharelado em Ciência da Computação da
Universidade Federal de Goiás – Campus Catalão
como requisito parcial para obtenção do tı́tulo de
Bacharel em Ciência da Computação.

Área de Concentração: Segurança da informação


Orientador: Vaston Gonçalves da Costa

Catalão – 2010
Pires, Rayner M.

Aplicação do Algoritmo Diffie-Hellman no Compartilhamento de Volumes


Criptografados do TrueCrypt / Rayner de Melo Pires – Catalão – 2010

Número de paginas: 48

Projeto Final de Curso (Bacharelado) – Universidade Federal de Goiás, Campus


Catalão, Curso de Bacharelado em Ciência da Computação, 2010.

Palavras-Chave: 1. Criptografia de Dados. 2. Acordo de Chaves. 3. Diffie-Hellman


Rayner de Melo Pires

Aplicação 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 Gonçalves da Costa – Presidente da Banca

Roberto Mendes Finzi Neto

Márcio Antônio Duarte


Para meus pais Fábio e Jussara,
e meus irmãos Plı́nio e Fábio.
Um filho não poderia pedir
por uma famı́lia melhor.

Para minha namorada Taynara.


Obrigado pelo apoio e
pela compreensão enquanto
trabalhava neste projeto.
AGRADECIMENTOS

Agradeço primeiramente aos meus pais Fábio e Jussara por terem me dado a base
familiar que tenho hoje. Quero ser como vocês quando eu crescer!
Aos meus irmãos Plı́nio e Fábio por me darem exemplo de como ser hoje melhor do
que fui ontem.
À 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.
Agradeço a todos que me acompanharam nessa jornada da graduação, aos meus colegas
de sala de aula e aos bons professores que colaboraram todo esse tempo. Vocês todos
fizeram parte de uma fase muito importante na minha vida, e foram fundamentais para
o meu sucesso alcançado hoje.
Agradeço também à minha amiga Gabriela que comigo caminhou até o final, e ao meu
amigo Salviano que me escutou, me apoiou e me divertiu tanto em todos esses cinco anos.
Vocês dois foram “compadres”de verdade!
E agradeço também ao nosso pai lá do ceú por ter me ajudado a enfrentar os meus me-
dos, por ter me carregado até aqui e ter me dado nesse último semestre motivos para tanta
felicidade.

A todos vocês o meu sincero agradecimento. Vocês estarão sempre em minhas lem-
branças!
Por ter acreditado que posso!
RESUMO

Pires, R. M. Aplicação do Algoritmo Diffie-Hellman no Compartilhamento


de Volumes Criptografados do TrueCrypt. Curso de Ciência da Computação, Cam-
pus Catalão, UFG, Catalão, Brasil, 2010, 48p.

O transporte de informações necessita, muitas vezes, de ambientes que garantam a sua


segurança contra acesso não autorizado. O TrueCrypt é um programa que implementa
a criptografia simétrica para cifrar informações. Contudo torna-se difı́cil compartilhar a
informação cifrada sem divulgar a chave que a cifra. Este problema é conhecido como o
problema de troca de chaves. Neste trabalho é apresentada a técnica 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. Também foi desenvolvido um protótipo que
implementa tal técnica e que gera uma senha compartilhada, permitindo ao TrueCrypt
que seus volumes cifrados possam ser compartilhados com segurança.

Palavras-Chaves: Criptografia de Dados, Acordo de Chaves, Diffie-Hellman

i
Sumário

Introdução 2

1 Estado da Arte 3
1.1 Informação e Segurança da Informação . . . . . . . . . . . . . . . . . . . . 3
1.2 Requisitos para a segurança da informação . . . . . . . . . . . . . . . . . . 3
1.3 Soluções para segurança . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Gestão de Identidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Defesa contra ataques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.6 Criptografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.7 A história da criptografia atual . . . . . . . . . . . . . . . . . . . . . . . . 6
1.8 Produtos disponı́veis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2 Tipos de criptografia 12
2.1 Criptografia Simétrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Criptografia Assimétrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3 O Problema da Distribuição de Chaves 16


3.1 Uso de chaves públicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Envelope digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.3 O Acordo de Chaves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.1 O algoritmo Diffie-Hellman . . . . . . . . . . . . . . . . . . . . . . . 18

4 Aplicação da técnica 22
4.1 O software TrueCrypt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2 Aplicação da técnica de DH no TrueCrypt . . . . . . . . . . . . . . . . . . 23
4.3 A senha compartilhada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

ii
5 O Protótipo 26
5.1 O protótipo desenvolvido . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.2 A implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

6 Conclusão 32

Referências 34

Apêndices 36

A Códigos Fonte 36
A.1 A classe GeradorDH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
A.2 A classe Transferencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

B Diagrama UML 47

C Códigos Fontes e Javadoc 48

iii
Lista de Figuras

1.1 Tela principal do TrueCrypt . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.1 Criptografia Simétrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13


2.2 Criptografia Assimétrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.1 O funcionamento do algoritmo de Diffie-Hellman. . . . . . . . . . . . . . . 19


3.2 Geração do valor secreto de DH . . . . . . . . . . . . . . . . . . . . . . . . 21

4.1 TrueCrypt requisitando a senha para cifrar/decifrar um volume. . . . . . . 24

5.1 Painel onde é gerado um par de chaves DH com novos parâmetros. . . . . . 27


5.2 Painel onde é gerado um par de chaves DH, com os mesmos parâmetros da
chave pública fornecida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.3 Painel onde é gerada a senha. . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.4 Obtenção da senha a partir do vetor de bytes do segredo. . . . . . . . . . . 29
5.5 Cópia da senha gerada para a área de transferência do sistema operacional. 29
5.6 Inserção de senha para acessar volume do TrueCrypt. . . . . . . . . . . . . 30

B.1 Diagrama de classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

iv
Lista de Códigos

A.1 A classe GeradorDH.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 36


A.2 A classe Transferencia.java . . . . . . . . . . . . . . . . . . . . . . . . . 45

v
Lista de Abreviações

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; Escritório Federal de Investigação


americano

IBM International Business Machines

ID Identificação do usuário; 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 ; Função de


Derivação de Chave Baseada em Senha

PGP Pretty Good Privacy; Software criptográfico

vi
PKC Public Key Cryptography; Criptografia de Chave Pública

PKCS Public Key Cryptography Standard

PKI Public Key Infrastructure; Infraestrutura de Chave Pública

RC2, RC4, RC5 Rivest Cipher ; Algoritmos de cifragem

RSA Cifra de chave pública; Rivest, Shamir, Adleman

TI Tecnologia da Informação

UML Unified Modeling Language; Conjunto de padrões de modelagem


de sistemas

vii
Introdução

Segurança da informação em uma organização, nos dias atuais, abrange todas as


áreas, desde a seleção de funcionários, passando pela escolha dos equipamentos onde
as informações serão armazenadas, seja em forma digital ou não, até as regras de com-
partilhamento dessas informações.
O compartilhamento de dados passou por um longo processo de evolução antes de
chegar aos padrões praticados atualmente. Com a evolução constante surgem os dispo-
sitivos portáteis, os quais possuem, atualmente, grande capacidade de armazenamento.
Com esses dispositivos vieram também os riscos oferecidos pela facilidade em carregar
dados de um lado para outro, que podem fazer com que não seja mantida a segurança da
informação contida nestes dispositivos.
Uma das ferramentas mais importantes, quando se fala em segurança da informação,
é 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 são seguros. Os clientes
que compram esses produtos, sejam eles usuários finais ou agentes de empresas, precisam
entender a criptografia para que possam tomar a melhor decisão e assim utilizar esses
produtos corretamente. Os profissionais de TI (Tecnologia da Informação) 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 estão aprovando novas leis que definem as responsabilidades das entidades que
detém as informações privadas do público.
Na prática, a criptografia pode ser entendida como um conjunto de métodos e técnicas
para cifrar ou codificar informações legı́veis por meio de um algoritmo, convertendo um
texto original em um texto ilegı́vel, sendo possı́vel recuperar as informações originais
mediante o processo inverso. Independentemente do algoritmo criptográfico utilizado,

1
sempre ocorrerá transformações de um texto legı́vel em um ilegı́vel.
A criptografia pode ser a ferramenta mais importante de segurança, mas de modo
algum resolverá todos os problemas de segurança.
O objetivo deste trabalho foi estudar técnicas de compartilhamento de informações
criptografadas e oferecer uma solução para o problema de troca de chaves existente na
criptografia simétrica. Através da técnica do Acordo de Chaves de Diffie-Hellman – que
não é uma técnica criptográfica mas que utiliza a criptografia – mostrou-se que o problema
pode ser resolvido, e que tal técnica também pode ser empregada no software criptográfico
chamado TrueCrypt, permitindo o compartilhamento dos arquivos criptografados por ele.
Também foi desenvolvido um protótipo de aplicação que implementa tal técnica e que
fornece uma senha em formato de texto puro, que pode ser utilizado para finalidades
outras além da aplicação no TrueCrypt.
O trabalho descrito neste texto foi dividido em 6 capı́tulos.
O Capı́tulo 1 é o estado da arte. Começa definindo os termos Informação e Segu-
rança da Informação. Aborda os requisitos para se garantir a segurança da informação;
define e fala sobre criptografia e faz um apanhado geral da história da criptografia até os
tempos de hoje, ilustrando o cenário de softwares criptográficos disponı́veis atualmente.
O Capı́tulo 2 está mais focado no assunto Criptografia, e resume os tipos de cripto-
grafia: as criptografias de chave secreta, de chave pública, e a criptografia mista.
O Capı́tulo 3 trata do Problema de Distribuição de Chaves, que surge ao comparti-
lhar informações cifradas com terceiros, e ainda trata de duas tecnologias que atacam o
problema: a técnica do Envelope Digital e a técnica do Acordo de Chaves.
Tendo em mente o Problema de Distribuição de Chaves, é apresentado no Capı́tulo
4 uma maneira de aplicar a técnica de acordo de chaves de Diffie-Hellman no software
TrueCrypt. É explicada também a questão da Senha Compartilhada, utilizada para com-
partilhar um volume do TrueCrypt entre partes geograficamente distantes.
No Capı́tulo 5 é mostrado e explicado o protótipo implementado neste trabalho, e
ainda são comentados alguns trechos da implementação.
Por fim, no Capı́tulo 6 há uma conclusão do trabalho realizado, levantando os obje-
tivos alcançados, pontos positivos, pontos negativos, dificuldades encontradas e trabalhos
futuros. Ainda é possı́vel encontrar, no apêndice desta monografia, o diagrama de classes
e o código fonte comentado das principais classes implementadas.

2
Capı́tulo 1

Estado da Arte

1.1 Informação e Segurança da Informação


As pessoas,os governos, todos um dia tiveram ou tem motivos para querer sigilo so-
bre alguma informação. No passado a questão Segurança da Informação era muito mais
simples, pois os arquivos contendo inúmeros papéis podiam ser trancados fisicamente.
Contudo, com a chegada das tecnologias da informação e comunicação o assunto ficou
bem mais complexo. Hoje a maioria dos computadores conecta-se à Internet e, con-
seqüentemente, a Internet conecta-se a eles. Além disto, sabemos que dados em formato
digital são portáteis. Este fato fez com que estes ativos tornassem novos atrativos para
ladrões.
Informação compreende qualquer conteúdo que possa ser armazenado ou transferido
de algum modo, servindo a determinado propósito e sendo de utilidade ao ser humano
[Filho, 2004].
Segurança da Informação, em seu conceito mais abrangente, é uma soma de dife-
rentes métodos e técnicas para, literalmente, garantir a segurança de alguma informação.

1.2 Requisitos para a segurança da informação


A segurança da informação em um sistema computacional ou em um sistema de ar-
mazenamento, em seu sentido mais abrangente, envolve requisitos voltados à garantia de
origem, uso e trânsito da informação, 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 informação só está disponı́vel para aqueles devida-
mente autorizados;

• A integridade diz que a informação não foi destruı́da ou corrompida e o sistema


tem um desempenho correto;

• A disponibilidade diz que os serviços/recursos do sistema estão disponı́veis sempre


que forem necessários.

Alguns exemplos de violações a cada um desses requisitos são:


Confidencialidade: alguém obtém acesso não autorizado ao seu computador e lê todas
as informações contidas na sua declaração de Imposto de Renda;
Integridade: alguém obtém acesso não autorizado ao seu computador e altera in-
formações da sua declaração de Imposto de Renda, momentos antes de você enviá-la à
Receita Federal;
Disponibilidade: o seu provedor sofre uma grande sobrecarga de dados ou um ataque
de negação de serviço e por este motivo você fica impossibilitado de enviar sua declaração
de Imposto de Renda à Receita Federal.
Algumas abordagens agregam ainda os dois últimos [Marciano, 2006]:

• A autenticidade dá a garantia de que a informação é de fato originária da proce-


dência alegada.

• A irretratabilidade ou não repúdio é a garantia de que não se pode negar a


autoria da informação, ou o tráfego por ela percorrido.

Aplicando a prática de autenticação, podemos verificar as identidades. Isso é com-


parável ao ID (Identificação do usuário) requerido para retirar dinheiro de uma conta
bancária (ou conduzir uma transação com um corretor on-line). O não repúdio é uma im-
posição legal que orienta e impele as pessoas a honrar as suas palavras [Burnett e Paine, 2002].

1.3 Soluções para segurança


A segurança da informação requer ferramentas especı́ficas para a implementação das
regras contidas em polı́ticas de segurança de informação. Os principais blocos de soluções
são [Promon, 2005]:

4
• Identidade;

• Defesa contra ataques;

• Criptografia.

1.4 Gestão de Identidade


A gestão de identidade é amparada por ferramentas que permitem a correta identi-
ficação de um usuário para lhe conferir acesso de acordo com seu perfil. A Identificação ou
a Autenticação permite identificar unicamente um usuário e verificar a autenticidade da
sua identidade através de mecanismos variados, como, por exemplo, senhas pré-definidas,
certificados digitais, biometria ou dispositivos portáteis (tokens, smart cards). A Au-
torização e o Controle de acesso possibilitam especificar as ações permitidas e nı́veis de
privilégio diferenciados para cada usuário através do estabelecimento de polı́ticas de uso.
Com a PKI (Infraestrutura de Chave Pública), a CA (Autoridade Certificadora) realiza a
geração e gestão de chaves e certificados digitais que conferem autenticidade aos usuários
ou à informação. Outra aplicação dessa categoria de ferramentas é o fornecimento de
chaves para suportar soluções de criptografia.

1.5 Defesa contra ataques


A defesa contra ataques consiste em diversas soluções atuando, de forma preventiva
ou corretiva, na defesa contra ameaças à segurança de um sistema. Ela divide-se em
[Promon, 2005]:

• Proteção de perı́metro;

• Detecção de anomalias e intrusão;

• Proteção contra infecção;

• Identificação de vulnerabilidades;

• Backup e Recovery.

5
1.6 Criptografia
A criptografia das informações consiste de mecanismos que garantem a confiden-
cialidade da informação em diversas camadas [Promon, 2005], através da aplicação de
algoritmos de criptografia. Esses mecanismos variam desde a criptografia das informações
gravadas em dispositivos de armazenamento (ex.: discos rı́gidos, pen drives) até cripto-
grafia das informações em trânsito visando à comunicação segura.
A criptografia, como forma de implementação de mecanismos de segurança em sistemas
de informação ou dispositivos de armazenamento, é utilizada como prevenção ou solução
para falhas em segurança na ampla maioria dos casos [Marciano, 2006].

1.7 A história da criptografia atual


O hábito de utilizar técnicas de codificar mensagens ou esconder informações foi her-
dado de nossos antepassados. Na era a.C. (antes de Cristo) já se utilizavam destas técnicas.
Uma prova disso é que a criptografia já estava presente na escrita hieroglı́fica dos egı́pcios,
e em códigos secretos entre assı́rios, hebreus, hititas, persas e outros [Moreira, 2001].
A criptografia, ou a criptologia, que é a arte de ocultar informações [Weiszflog, 2008],
faz parte da história humana porque sempre houve fórmulas secretas, informações confi-
denciais e interesses os mais diversos que não deveriam cair no domı́nio público ou na mão
de inimigos. As guerras e a necessidade de manter ou conquistar novos territórios sempre
foram subsı́dios para a Criptologia. E guerra e disputa sempre estiveram presentes na
história da humanidade.
Essa história foi marcada por grandes nomes que fizeram da arte e ciência de escrever
mensagens em códigos a criptografia que se tem hoje. Júlio César, Blaise de Vigenère,
Frederici, Samuel Morse, Charles Babbage, Joseph Oswald Mauborgne, Marian Rejewski,
Alan Turing, Gordon Welchman e outros, todos fizeram de seus trabalhos em criptografia
e criptoanálise grandes contribuições 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 evolução da criptografia na computação quântica,
hoje sendo muito estudada [Information, 2009].
A seguir são listadas as fases importantes na história da criptografia atual, baseadas
nas obras de [Moreno et al., 2005], [Information, 2009] e [Tkotz, 2009]:

6
Entre 1933 e 1945, a máquina Enigma, que havia sido criada por Arthur Scherbius, não
foi um sucesso comercial e foi aperfeiçoada até se transformar na ferramenta criptográfica
mais importante da Alemanha nazista.
No ano de 1943 a máquina Colossus, projetada pela equipe liderada por Alan Turing e
Gordon Welchman em Betcheley Park, um centro de estudos criptológicos da Inglaterra,
foi posta em ação para quebrar códigos.
Em 1969 James Ellis desenvolve um sistema de chaves públicas e chaves privadas
separadas.
Em 1976 Whitfield Diffie e Martin Hellman publicam o livro New Directions in Crypto-
graphy, introduzindo a idéia de uma criptografia de chave pública. Também reforçaram
a concepção da autenticação através de uma função de via única (one way function).
Terminaram o texto do livro com a observação modesta e sábia:

“A habilidade de produzir criptoanálise esteve sempre acentu-


adamente do lado de profissionais, mas a inovação, particularmente
no desenvolvimento de novos tipos de sistemas criptográficos, veio
basicamente de amadores.”

No mesmo ano a IBM apresentou a cifra Lucifer ao NBS (National Bureau of Stan-
dards). Essa cifra sofreu algumas modificações recomendadas pela NSA (National Security
Agency) e a NBS a adotou como padrão de criptografia de dados nos EUA. Hoje a NBS é
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 começaram a discutir
como poderiam criar um sistema de chave pública que fosse prático. Ron Rivest concebeu
a grande idéia: o sistema era uma cifra de chave pública, assim como tinham pensado,
que servia tanto para confidencialidade quanto para assinaturas digitais, baseada na difi-
culdade da fatoração de números 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 três entregaram o texto para Martin Gardner, para que fosse publicado na revista
Scientific American. O artigo apareceu na edição de Setembro de 1977 e incluı́a a oferta
de enviar o relatório técnico completo para qualquer um que mandasse um envelope selado

7
com o próprio endereço. Foram recebidos milhares de pedidos provenientes dos quatro
cantos do mundo.
A NSA contestou a distribuição deste relatório para estrangeiros e, durante algum
tempo, os autores suspenderam a correspondência. Como a NSA não se deu ao trabalho
de informar a base legal desta proibição, solicitada pelos autores, os três voltaram a
enviar os relatórios solicitados. Dois jornais internacionais, “Cryptologia”e “The Journal
of Cryptology”, foram fundados logo após esta tentativa da NSA de censurar publicações.
Rivest, Shamir e Adleman não publicaram a cifra antes de patenteá-la. Aliás, foi uma
grande novidade conseguir patentear um algoritmo.
Em 1978 o algoritmo RSA é publicado na “Communication”da ACM (Association for
Computing Machinery).
A partir da década de 90 começam os trabalhos com computação quântica e cripto-
grafia quântica. Também ganham maior força trabalhos com biometria voltada à auten-
ticação [Almeida, 2009].
Em 1990 Xuejia Lai e James Massey publicam na Suı́ça A Proposal for a New Block
Encryption Standard (Uma Proposta para um Novo Padrão de Encriptação 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 operações
adequadas para computadores de uso geral, tornando as implementações em software mais
eficientes.
Em 1990 Charles H. Bennett, Gilles Brassard e colaboradores publicam seus resultados
experimentais sobre Criptografia Quântica, a qual usa fótons únicos para transmitir um
fluxo de bits chave para uma posterior cifragem da mensagem (no caso a cifragem Vernam).
Considerando as leis que a mecânica quântica possui, a Criptografia Quântica não só
oferece a possibilidade do segredo como também uma indicação positiva caso ocorra uma
interceptação e uma medida do número máximo de bits que possam ter sido interceptados.
Uma limitação é que a Criptologia Quântica necessita de um cabeamento de fibra ótica
entre as partes que se comunicam.
Um ano depois o FBI impõe o direito de acessar qualquer texto claro trocado entre
usuários que conversam por meio de uma rede de comunicação digital. Como resposta
ao FBI, Phil Zimmermann torna pública, no mesmo ano, sua primeira versão do PGP
(Pretty Good Privacy). O PGP oferece alta segurança para o cidadão comum e, como tal,
é um forte concorrente de produtos comerciais pois além de sua notável confiabilidade,

8
ele é distribuı́do como freeware, e como resultado, tornou um padrão mundial.
Em 1993 a criptoanálise diferencial é desenvolvida por Eli Biham e Adi Shamir.

“É a criptoanálise dos novos tempos.” por Biham e Shamir.

O método utilizado por Biham e Shamir baseia-se em ataque por mensagens escolhi-
das, as quais são tomadas aos pares e cuja diferença entre os respectivos criptogramas
é analisada. O método pode ser estendido para ataque de mensagens conhecidas. A
criptoanálise é realizada sobre pares de criptogramas cifrados com a mesma chave e cujos
textos em claro correspondentes possuem um certo valor particular de diferença. O efeito
desta diferença é analisado através das n iterações do algoritmo resultando em parâmetros
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 rotação dependente de dados como sua operação
não linear e é parametrizado de modo que o usuário possa variar o tamanho do bloco, o
número de estágios e o comprimento da chave. Neste mesmo ano o algoritmo Blowfish,
uma cifra de bloco de 64 bits com uma chave de até 448 bits de comprimento, é projetado
por Bruce Schneier [Moreno et al., 2005].
Em 1997 O PGP Freeware é atualizado para a versão 5.0 e é amplamente distribuı́do
para uso não comercial. Ainda em 97 o padrão de encriptação DES de 56 bits, base da
criptografia dos EUA naquele ano, é quebrado por uma rede de 14.000 computadores.
Em 1998 o padrão de encriptação DES de 56 bits é 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 à máquina DES
Cracker pela internet.
No ano de 2000 o NIST anunciou um novo padrão de uma chave secreta de cifragem,
escolhido entre 15 candidatos. Esse novo padrão foi criado para substituir o algoritmo
DES, cujo tamanho das chaves tornou-se insuficiente para conter ataques de força bruta. O
algoritmo Rijndael, cujo nome é uma abreviação dos nomes dos autores Rijmen e Daemen,
foi escolhido para se tornar o futuro AES (Advanced Encryption Standard )[Tkotz, 2009].
No século 21 muitos professores e profissionais da computação com vı́nculo em centros
de pesquisa, universidades e empresas começam a pesquisar novas formas de implementar

9
algoritmos e soluções de segurança. Nos anos 2000 a criptografia começa a ser encarada
realmente como uma ciência.
Com esse resumo sobre os principais acontecimentos na história da criptografia pode-
mos ressaltar que a maior motivação para todas essas pesquisas, descobertas e atualizações
na criptografia e criptoanálise foi a questão sobre a segurança da informação, ou da segu-
rança de dados.

1.8 Produtos disponı́veis


As soluções para segurança experimentam uma fase de intensa inovação tecnológica
e de crescente sofisticação motivadas, principalmente, pelo aumento constante das ativi-
dades maliciosas. O mercado de soluções de segurança é relativamente novo e apresenta
um elevado nı́vel de fragmentação em termos de produtos disponı́veis. Nele coexistem
diversas empresas, oferecendo diferentes soluções para diversas áreas.
Com relação à criptografia de dispositivos de armazenamento, seja os removı́veis ou
não, o mercado é amplo, e dentre os softwares mais conceituados hoje estão:

• EncryptOnClick;

• Rohos Mini Drive;

• Kruptos;

• TrueCrypt.

Os itens acima foram destacados por serem freeware.


O EncryptOnClick é produzido pela 2Bright Sparks. O seu funcionamento basea-se em
encriptar arquivos ou diretórios avulsos com uma senha determinada. Os novos arquivos
encriptados ganham a extensão (.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. Há a opção de esconder/ocultar essas unidades para uma
maior segurança. 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 proteção da primeira seja violada, a segunda ainda permanecerá intacta.
O Kruptos acrescenta à funcionalidade do EncryptOnClick a facilidade de criar ar-
quivos executáveis (.exe) autodecifráveis, 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 recuperação
de dados apagados.
Dentre os quatros mencionados, o mais amplamente utilizado é o TrueCrypt. A jus-
tificativa se dá pela sua eficiência, pela facilidade de uso, pela documentação abrangente
que possui, pelas atualizações constantes oferecidas pela fundação responsável pelo seu de-
senvolvimento e também por ser de código aberto (open source), possibilitando alterações.
A Figura 1.1 mostra a tela principal deste software.

Figura 1.1: Tela principal do TrueCrypt

O TrueCrypt é desenvolvido e mantido pela TrueCrypt Foundation, nos Estados


Unidos. Uma cópia do programa pode ser baixada da internet no endereço
http://www.truecrypt.org/downloads.

11
Capı́tulo 2

Tipos de criptografia

Há dois tipos de criptografia, a de chave secreta e a de chave pública.


Há também uma terceira abordagem, que na verdade não é um novo tipo de criptogra-
fia, mas sim uma técnica onde utiliza-se os dois tipos anteriores, chamada de criptografia
mista.
O termo “chave”aqui é um número secreto ou um conjunto desses números, que faz
analogia à chave convencional que utilizamos em cadeados e fechaduras.
Na criptografia, para proteger o conteúdo dos seus arquivos, você instala uma fechadura
(um algoritmo de criptografia) na sua porta (o computador). Para operar a fechadura
(encriptar os dados), você insere a chave (o número secreto) e a gira (executa o programa
fazendo-o encriptar). O algoritmo realiza seus passos utilizando a chave para alterar o
texto simples e convertê-lo em texto cifrado. Para desbloquear o arquivo encriptado você
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 criptográfico é bom então ele é conhecido e difundido. Por isso
mesmo, por sua difusão ampla e por várias pessoas conhecerem o seu funcionamento é
que utilizam-se as chaves. A chave protege a informação cifrada. Não basta conhecer
o algoritmo para acessar a informação criptografada. É necessário também alimentá-lo
com a chave correta, que é única. Daı́ a importância de manter a chave em sigilo. Toda
criptografia moderna e computadorizada opera com chaves.
Há duas classes de criptografia que operam com chaves: a criptografia de chave secreta
e a criptografia de chave pública.

12
2.1 Criptografia Simétrica
O algoritmo de criptografia simétrica ou de chave secreta utiliza uma chave para
transformar ou converter uma informação em um conjunto de bits que parecem estar
dispostos de forma aleatória. Nessa abordagem a mesma chave utilizada para cifrar os
dados é utilizada para decifrá-los. Tanto o remetente quanto o destinatário usam a mesma
chave.

Figura 2.1: Criptografia Simétrica

Os algoritmos de chave simétrica 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 número de bits e cifram como uma única unidade.
Tipicamente são utilizados blocos de 128, 192 ou 256 bits e chaves de 128, 192 ou 256 bits.
Alguns exemplos de algoritmos simétricos populares e bem reputados incluem Twofish,

13
Serpent, AES, Blowfish, CAST5, RC4, 3DES, e IDEA.
O “calcanhar de Aquiles”da criptografia simétrica está na distribuição da chave simétrica.

2.2 Criptografia Assimétrica


A criptografia assimétrica ou de chave pública contorna o problema da distribuição
de chaves mediante o uso de chaves públicas. Neste novo sistema, cada pessoa detém um
par de chaves denominado chave pública e chave privada.
A chave pública é divulgada, e serve para cifrar uma mensagem, enquanto a chave
privada é mantida em segredo, e é usada para recuperar o conteúdo original da mensagem
cifrada. A segurança da criptografia de chave pública reside no fato de que as mensagens
codificadas com a chave pública só podem ser decodificadas com a chave privada corres-
pondente. Desta forma, não é possı́vel decifrar a mensagem com a mesma chave que a
cifrou (a chave pública), como acontece na criptografia simétrica. A Figura 2.2 ilustra
esse processo.

Figura 2.2: Criptografia Assimétrica

14
Apesar de existirem duas classes de algoritmos para cifrar informações, elas não são
utilizadas com a mesma freqüência. A justificativa está relacionada ao desempenho: algo-
ritmos de chave pública são lentos, ao passo que a criptografia de chave simétrica pode en-
criptar dados em grande quantidade bem mais rapidamente. Dependendo da plataforma,
alguns algoritmos simétricos podem operar em velocidades de 10MBps, 20MBps, 50MBps
(ou mais). Ao contrário, um algoritmo de chave pública 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 Distribuição de
Chaves

A criptografia de chave simétrica pode manter seguros os nossos dados, mas quando
o compartilhamento desses dados secretos com outras pessoas se faz necessário, então,
também será necessário compartilhar a chave utilizada para encriptá-los. Já que o pro-
blema de envio de informações sigilosas pode ser resolvido com a criptografia, fica agora
o problema de envio das chaves com segurança. Como podemos enviar chaves secretas de
maneira segura para outras pessoas? Esse problema é conhecido como o problema de dis-
tribuição de chaves: como duas ou mais pessoas podem, de maneira segura, compartilhar
chaves por vias inseguras?
Para cada classe de criptografia há uma abordagem diferente para solucionar o pro-
blema da distribuição de chaves. A criptografia de chave pública, por princı́pio de fun-
cionamento, já resolve esse problema com a publicação da chave que criptografa. A cripto-
grafia de chave simétrica faz uso da técnica de Acordo de Chaves para distribuir chaves
de criptografia. Há ainda um método conhecido como Envelope Digital. Essa técnica
faz uso das criptografias de chave pública e chave secreta ao mesmo tempo, método mais
conhecido como criptografia mista.
A Seção 3.2 apresenta o esquema conhecido como Envelope Digital, e a Seção 3.3.1
define a técnica criada por Diffie e Hellman, adotada neste trabalho como solução para o
compartilhamento de dados criptografados pelo software TrueCrypt.

16
3.1 Uso de chaves públicas
A criptografia de chave pública, por seu próprio princı́pio de funcionamento, não
utiliza a mesma chave para os processos de cifragem e decifragem de conteúdos. Com
1
a segurança matemática oferecida pela PKC torna-se possı́vel distribuir as chaves de
criptografia com segurança, visto que o processo de decifragem só pode ser feita pela
chave privada correspondente à chave pública que cifrou o conteúdo.
Dessa maneira, utilizando a chave que é pública para cifrar e a chave que é particular
(privada) para decifrar, pode-se contornar o problema da distribuição de chaves.

3.2 Envelope digital


Como citado mais acima, os algoritmos de criptografia de chave assimétrica exigem
um esforço computacional muito maior que os algoritmos de chave simétrica, então o ideal
é que se utilize os algoritmos mais rápidos para cifrar grandes quantidades de dados, e
os mais lentos para cifrar quantidades de dados menores, como 128 bits – o tamanho
provável de uma chave simétrica.
Essa técnica requer a utilização de dois algoritmos diferentes para concretizar seu
esquema. No envelope digital utilizamos a criptografia simétrica para cifrar a informação
a ser compartilhada, e a criptografia assimétrica para cifrar a chave de sessão 2 .
Sua operação se dá, por exemplo, do seguinte modo: com a chave simétrica – que
chamamos aqui de chave de sessão – ciframos o conteúdo de um e-mail e criamos um
envelope criptografado. Essa chave de sessão é então colocada em outro envelope, que
por sua vez, é cifrado utilizando a chave pública do seu destinatário, tornando-se um
envelope criptografado com chave pública, que protege uma chave de sessão. Este pacote
– o envelope digital – formado por ambos envelopes são, enfim, enviados por e-mail. O
destinatário, ao receber o pacote, descriptografa um envelope utilizando sua chave privada,
obtendo acesso à chave de sessão. Também encontra outro envelope cifrado, e então o
abre com esta última chave. Consegue, por fim, ter acesso à informação original.
Assim, a informação e a chave de sessão só estarão acessı́veis para quem realmente
pode ter acesso à informação: o proprietário da chave privada.
1
Public Key Cryptography. Criptografia de Chave Pública.
2
A chave de sessão é a chave simétrica utilizada para cifrar os dados.

17
3.3 O Acordo de Chaves
Outra maneira de se resolver o problema da distribuição de chaves é utilizar o Acordo
de Chaves, mais discutido na literatura como Key Agreement, sua forma no idioma Inglês.
Um Acordo de Chaves propõe que duas ou mais partes possam, literalmente, acordar a
respeito de um segredo em comum, não sendo necessário o armazenamento desse segredo
por nenhuma das partes. Um acordo propõe ainda que ambas as partes possam gerar o
segredo compartilhado apenas utilizando um par de chaves correspondentes 3 .
Sua utilização é ideal em cenários onde se compartilha informação cifrada com cripto-
grafia simétrica.
Uma das técnicas que implementa a técnica do Acordo de Chaves é o conhecido “Diffie-
Hellman Key Agreement”, amplamente conhecido pela sua eficiência.

3.3.1 O algoritmo Diffie-Hellman

Como já citado na Seção 1.7, em 1976 Whitfield Diffie e Martin Hellman, os cri-
adores do algoritmo, publicaram a técnica 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 invenção da PKC (Public Key Cryptography -
Criptografia de Chave Pública) [WordIq, 2010], [Stewart, 2000].
O algoritmo DH, como também é chamado, não executa nenhuma técnica de cifragem
de dados. Ao invés disso, ele utiliza a tecnologia de chave pública para gerar uma chave
de sessão simétrica [Ide et al., ]. Na realidade, ele só pode ser usado para estabelecer um
segredo compartilhado, que geralmente é usado como uma chave simétrica compartilhada
[Stamp, 2006].
Duas partes podem gerar o mesmo segredo desde que possuam suas próprias chaves
privadas e a chave pública de sua contraparte, que está, obviamente, publicamente disponı́-
vel. Esse é o acordo de chaves. Se combinarmos um valor privado com o outro valor
público, cada indivı́duo gerará o mesmo valor secreto [Burnett e Paine, 2002], como ilustra
a Figura 3.1.
3
O 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 é gerada para cifrar o conteúdo, e depois essa chave é
enviada, dessa vez cifrada, juntamente com o conteúdo.
Com o DH não se faz mais necessário a cifragem de dados utilizando a criptografia
assimétrica. Isto é ideal nos casos onde se tem limitações técnicas ou computacionais e só
está disponı́vel ou só é possı́vel utilizar a criptografia simétrica.
Com essa técnica basta utilizar o valor secreto resultante dos cálculos de DH como
sendo a chave de sessão. Para decifrar, o destinatário precisa apenas gerar o mesmo valor
secreto.
Vantagens da utilização desta técnica:

• Nenhuma chave é enviada ou armazenada, então melhoramos a garantia de segu-


rança da informação cifrada;

• Nenhuma chave é enviada e ainda sim pode-se ter um acordo de chaves eficaz e
eficiente;

• Elimina-se alguns bytes da mensagem, então ganha-se no tamanho;

• A complexidade computacional é reduzida ao utilizar somente criptografia simétrica


para cifrar e decifrar conteúdo;

19
• Solucionamos o problema motivador deste trabalho: o problema da distribuição de
chaves na criptografia simétrica.

A segurança do DH reside no problema de determinar logaritmos discretos para


números grandes.
Para exemplificar melhor a técnica, imagine Alice e Bob dois parceiros de negócio, e
que haja entre eles a necessidade de uma troca de correspondências confidenciais sobre
seus negócios. O DH funciona da seguinte forma:
Sejam q um número primo e α uma raı́z primitiva de q . Isto é, a partir de α podemos
gerar todos os elementos de {1, 2, . . . , q − 1} como potências 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 são iguais.

Xa e Xb são ditas as chaves privadas de Alice e de Bob, respectivamente. Enquanto,


Ya e Yb são ditas chaves públicas do acordo.
A segurança do DH é garantia pela complexidade matemática 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 comunicação entre Alice e Bob con-
seguiria obter as chaves públicas geradas, contudo não conseguiria gerar a chave secreta
K, visto que para gerá-la é necessário também uma das chaves privadas Xa ou Xb . Com
a chave secreta K Alice e Bob podem cifrar seus conteúdos e ter confidencialidade nas
suas correspondências.

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: Geração 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 também precisam compartilhar os mesmos parâmetros α e q. Para
que isso seja garantido, é necessário que ambos os pares tenham sido gerado pela mesma
entidade, e que esta entidade seja de confiança, visto que um ataque “man in the middle”
poderia ocorrer [Burnett e Paine, 2002].
A responsabilidade da entidade geradora dos pares de chaves é garantir que os parâmetros
sejam idênticos 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 públicas, os parceiros participantes
desse acordo já estão prontos para gerar o segredo, cifrar os dados e, então, compartilhá-
los.

21
Capı́tulo 4

Aplicação da técnica

As soluções para segurança experimentam uma fase de intensa inovação tecnológica


e de crescente sofisticação motivadas, principalmente, pelo aumento constante das ativi-
dades maliciosas. O mercado de soluções de segurança é relativamente novo e apresenta
uma grande fragmentação em termos de produtos disponı́veis. Nele coexistem diversas
empresas, oferecendo soluções para diversas áreas.
Este capı́tulo mostra uma maneira de aproveitar a técnica Diffie-Hellman no software
TrueCrypt. Dentre os softwares disponı́veis, o TrueCrypt foi o escolhido para este trabalho
por ser multiplataforma, freeware, e também pelas outras justificativas já apresentadas
na Seção 1.8.

4.1 O software TrueCrypt


Com relação à criptografia de dispositivos de armazenamento o mercado é amplo, e
dentre os softwares livres (freeware) mais conceituados hoje estão o EncryptOnClick, o
Rohos Mini Drive, o Kruptos e o TrueCrypt. Dos quatro softwares mencionados, o mais
eficiente e o mais utilizado é o TrueCrypt.
A sua eficiência se dá pela utilização de tecnologias como pipelining, que permite que
dados sejam lidos e escritos em um drive criptografado tão rapidamente quanto seria se o
drive não o fosse, e parallelization, que permite que os dados sejam processados em paralelo
por todos os processadores ou núcleos presentes no sistema, tornando a manipulação dos
dados muito mais rápida. O uso dessas tecnologias favorece em muito o recurso on-the-
1
fly do software. On-the-fly é um recurso do software que faz com que as operações de
1
Criptografia e descriptografia em tempo de execução.

22
cifragem e decifragem do conteúdo armazenado nos volumes criptografados aconteçam em
tempo de execução, isto é, ao mesmo tempo em que os dados são lidos ou escritos pelo
sistema operacional do usuário. Esse recurso é possı́vel através do uso das tecnologias de
pipelining e parallelization. Esse recurso torna transparente, e muito mais simples para o
usuário, o processo de cifragem e decifragem dos dados em um volume.
O TrueCrypt hoje, na sua versão mais atual 7.0, trabalha somente com algoritmos de
encriptação de chave simétrica, não oferecendo os algoritmos de chave assimétrica. Os
algoritmos disponı́veis são: AES, Serpent, Twofish. Para aumentar ainda mais o nı́vel
da complexidade da criptografia aplicada aos seus volumes, o TrueCrypt ainda utiliza de
técnicas de iteração de algoritmos, ou aplicação de algoritmos em cascata, como descrito na
própria documentação do software [TrueCrypt-Foundation, 2009]. Dessa maneira pode-
se utilizar combinações de algoritmos para criptografar os dados, acrescentando à lista
de algoritmos inicial os seguintes: AES-Twofish, AES-Twofish-Serpent, Serpent-AES,
Serpent-Twofish-AES, Twofish-Serpent. Essa aplicação de um algoritmo sobre o outro é
uma tentativa de aumentar a dificuldade de interpretação dos bits do volume, suprindo a
falta de algoritmos assimétricos, mais sofisticados.
Este trabalho propõe a integração entre a técnica do Acordo de Chaves de Diffie-
Hellman e o TrueCrypt, a fim de permitir o compartilhamento do volume criptografado
por esse software entre várias pessoas. Isso é útil quando o acesso ao volume criptografado
precisa ser feito por duas ou mais pessoas, que podem ou não estar separadas geografica-
mente.

4.2 Aplicação da técnica de DH no TrueCrypt


O TrueCrypt trabalha com elementos chamados volumes, os quais são montados pelo
software e, então, interpretados pelo sistema operacional como se fossem discos fı́sicos
propriamente ditos. Esses volumes podem ser um dispositivo inteiro, uma partição em
um dispositivo de armazenamento, ou um arquivo dentro de algum disco (conectado local
ou remotamente). Eles são os contêineres onde os dados criptografados são armazenados.
Para criar esses volumes criptografados o TrueCrypt oferece um assistente, onde são
selecionadas várias opções, tais como: tipo de volume, local a ser salvo, algoritmo de
criptografia, tamanho do volume, tipo de sistema de arquivos e outras. Uma dessas opções
é a keyfile. O termo keyfile remete simplesmente a um arquivo, que pode ser utilizado para

23
reforçar o mecanismo de criptografia do volume. Segundo [TrueCrypt-Foundation, 2009],
é recomendável que se use pelo menos uma keyfile, e que esta seja de pelo menos 64bytes.
O próprio TrueCrypt oferece um recurso onde pode ser gerado um arquivo keyfile com
bits aleatórios. Todavia, este recurso não é útil no cenário que propomos – um cenário
onde existe a necessidade de compartilhamento desse volume criado –, visto que o segundo
usuário desse volume criptografado também necessitaria do mesmo arquivo original uti-
lizado como keyfile. Isto se faz necessário pois o software necessita sempre do mesmo
arquivo original. Uma cópia do arquivo original não funciona como keyfile válida.
Uma outra opção disponı́vel é a senha. No TrueCrypt a utilização de senha é obri-
gatória, como mostra a Figura 4.1. Tal obrigatoriedade existe pois o software uti-
liza o método PBKDF2 (Password-Based Key Derivation Function) de criptografia. O
PBKDF2 está especificado na PKCS #5 v2.0 (Public Key Cryptography Standard )
[Laboratories, 2005], e é utilizado no TrueCrypt para gerar as Header Keys, que pro-
tegem as Master Keys, que, por suas vezes, são a chave que cifram os volumes. A PKCS
#5 v2.0 é um Padrão de Criptografia de Chave Pública Baseado em Senha e, conforme
está disposto em [Laboratories, 2005], o método PBKDF2 é uma função de derivação de
chaves utilizada para derivar uma chave de criptografia a partir de uma senha, de um
valor pseudo-aleatório – comumente conhecido como salt – e de um contador de iterações.
Header Keys e Master Key são termos utilizados pelo TrueCrypt para referenciar as chaves
utilizadas por esse software para cifrar os volumes.
É neste ponto que se insere este trabalho. Para que dois parceiros possam compartilhar
e utilizar o mesmo volume é necessário que haja um consenso entre as partes com relação
à senha de proteção do volume. É necessário que a senha seja acordada entre as partes,
e não que ela seja repassada de um lado para outro, colocando em risco a segurança das
informações no volume. Então, 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 é que desenvolvemos uma aplicação para gerar essa senha. Se pre-
cisamos de uma senha eficiente para acessar o volume criptografado e não podemos enviá-
la junto com esse volume, então todos os participantes do acordo podem utilizar o algo-
ritmo Diffie-Hellman para gerá-la. Basta que sejam obedecidos os requisitos do algoritmo:
estar de posse da sua chave privada, da chave pública de sua contraparte e ambas as chaves
terem sido geradas com os mesmos parâmetros – o número primo q e α a raiz primitiva
de q, como citado na seção 3.3.1.
É importante enfatizar que no TrueCrypt a senha não funciona como a chave de
criptografia, mas é uma parte do conjunto de todos os itens que compõem 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 não
podem ser abertos, mantendo, assim, o sigilo dos dados.
O assistente de criação de volumes do TrueCrypt informa que uma senha ideal contém
pelo menos 20 caracteres, e, em [TrueCrypt-Foundation, 2009], consta que a melhor segu-
rança pode ser atingida utilizando-se o tamanho máximo do campo senha: 64 caracteres
alfanuméricos.

25
Capı́tulo 5

O Protótipo

Foi desenvolvido um protótipo que implementa o algoritmo DH e gera um acordo


entre duas partes, levando em conta os detalhes do TrueCrypt. A senha de 64 caracteres
alfanuméricos é obtida a partir deste acordo. Ele também gera pares de chaves DH,
funcionando como uma entidade geradora de chaves.

5.1 O protótipo desenvolvido


O primeiro passo para se definir um acordo de chaves de DH é 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 é, devem possuir alguns parâmetros em
comum (o número primo q e a raiz primitiva α de q), como descrito na Seção 4.3. E para
conseguirem os mesmos parâmetros, os geradores de pares de chaves de ambos os parceiros
devem utilizar o mesmo provedor de parâmetros. A aplicação desenvolvida neste trabalho
também é um gerador de par de chaves, e utiliza o provedor SunJCE, que é fornecido pela
própria linguagem Java, a partir da versão 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 são o SunJCE e o Bouncy Castle.
Como não há estabelecida uma entidade externa provedora de chaves de confiança para
fornecer os pares de chaves de DH, faz-se necessário gerar esses pares com o protótipo
desenvolvido.
Sendo assim, utilizando este aplicativo, um dos parceiros deve gerar o primeiro par de
chaves, onde novos parâmetros serão definidos pelo Provider estabelecido. Em seguida,
a segunda parte gera o seu próprio par de chaves, a partir da chave pública do primeiro

26
parceiro.
Vejamos um exemplo desse processo:

(1) Bob gera seu par de chaves DH, e envia a chave pública para Alice;

(2) Alice, com a chave pública de Bob, gera seu próprio par de chaves DH. Logo
após, envia sua chave pública para Bob;

(3) A partir de agora, ambas as partes possuem pares de chaves DH compatı́veis,


e estão de posse da chave pública de seus parceiros. Para gerarem a senha, basta
informar sua chave privada e a chave pública do outro (processo ilustrado pelas
figuras 3.1 e 3.2).

Como podemos perceber em (2), uma DH Public Key contém informações suficientes
para que um novo par de chaves DH seja criado a partir dela.
O passo (1) é executado no painel ilustrado pela Figura 5.1 abaixo.

Figura 5.1: Painel onde é gerado um par de chaves DH com novos parâmetros.

27
O passo (2) é executado no painel do aplicativo, como ilustrado abaixo pela Figura 5.2.

Figura 5.2: Painel onde é gerado um par de chaves DH, com os mesmos parâmetros da
chave pública fornecida.

O passo (3) é executado no seguinte painel da aplicação (Figura 5.3):

Figura 5.3: Painel onde é gerada a senha.

As chaves geradas com a aplicação tem 1024 bits de comprimento, e são fornecidas a
partir do provedor SunJCE. As chaves de DH manipuladas e geradas neste protótipo não
necessariamente precisam de uma extensão, visto que este conceito é variável para cada

28
sistema operacional. Entretanto, optamos por definir que as chaves públicas carregam a
extensão .pbk, e as chaves privadas levam a extensão .pvk, para facilitar a identificação
e a localização desses arquivos pelo usuário.
Com o acordo feito a partir dessas chaves, o segredo gerado é um vetor de bytes, que
também terá 1024 bits, ou 128 bytes de comprimento.
Após ser gerado, o segredo é 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 compreensão, a senha será um subvetor do vetor de 256 posições, que
conterá somente 64 caracteres dos 256 gerados. Esses 64 caracteres estão na região central
do vetor maior, ou seja, foi adotado que são os caracteres da posição 96 até a posição 160.

Figura 5.4: Obtenção da senha a partir do vetor de bytes do segredo.

Depois de gerada a senha, para utilizá-la basta copiá-la para o clipboard e colá-la no
TrueCrypt. A cópia é confirmada com um aviso na tela, como ilustra a Figura 5.5.

Figura 5.5: Cópia da senha gerada para a área de transferência do sistema operacional.

Ao montar um volume no TrueCrypt, a senha será solicitada. Depois de tê-la copiado


para o clipboard, basta colá-la no campo de senha da janela que o TrueCrypt fornece,
como na Figura 5.6.

29
Figura 5.6: Inserção de senha para acessar volume do TrueCrypt.

5.2 A implementação
A implementação do programa foi feita em linguagem Java versão 6, utilizando um
computador com Processador AM Dr Turion 64X2, com clock de 1.6GHz por núcleo
e 3GB de memória RAM. Foi utilizado o IDE Netbeans, versão 6.8, para auxiliar a
codificação do protótipo.
Como foi sugerido utilizar os resultados dos cálculos – a senha – no TrueCrypt, que tem
versões para as plataformas Windows, Linux e Mac, então o protótipo foi implementado
em linguagem Java, tornando-o também compatı́vel com estas plataformas.
Foi criada uma classe que implementa os métodos que manipulam o acordo, chamada
GeradorDH.java. Seu código fonte está anexado no Apêndice A.1.
Essa classe pode ser instanciada com um ou sem nenhum argumento. Um argumento
válido deve ser do tipo DHParameterSpec. Se ela for inicializada com nenhum argumento,
então isto indica que um novo conjunto de parâmetros de par de chaves DH deve ser
preparado pelo Provider. Caso um DHParameterSpec seja fornecido como argumento,

30
então isto indica que os parâmetros para gerar um novo par já foram definidos anteri-
ormente, e o novo par a ser gerado deve utilizar estes mesmos parâmetros. Este caso é
aplicado no momento onde um novo par de chaves deve ser criado a partir de uma chave
pública fornecida.
Uma outra função também implementada é a que copia a senha gerada para a área
de transferência do sistema operacional. O intúito aqui foi agilizar o processo de cópia
da senha da aplicação para o TrueCrypt, visto que o protótipo não armazena esta senha
em nenhum arquivo. O botão que implementa esta ação está no painel onde é gerada a
senha (ilustrado pela Figura 5.3).
A classe que copia a senha para a área de transferência do sistema operacional (clip-
board ) é a Transferencia.java. Seu código fonte está anexado no Apêndice A.2.
Também foram implementadas as classes AplicacaoApp.java e AplicacaoView.java
que oferecem a interface gráfica com o usuário. Para implementar este aplicativo como
uma Java Desktop Application, foi utilizada a biblioteca org.jdesktop.application do
Java 6.
1
O Javadoc da aplicação e todos os códigos fonte Java implementados estão contidos
no CD que acompanha este trabalho.
O diagrama de classes UML que auxilia o entendimento da arquitetura desta aplicação
pode ser visto no Apêndice B.1.

1
Documentação de um código fonte Java.

31
Capı́tulo 6

Conclusão

O compartilhamento de dados é uma prática corriqueira e, muitas vezes, os dados


compartilhados são confidenciais e devem ser protegidos. Para se garantir tal confiden-
cialidade, pode-se utilizar algum sistema criptográfico conhecido (AES, DES). O True-
Crypt é um dos muitos softwares que podem ser utilizados para criptografar dados. Ele
utiliza o conceito de volumes para definir o contêiner onde os dados criptografados são
armazenados.
Neste trabalho foi abordada a questão do compartilhamento de chave de segurança
entre duas partes geograficamente distantes.
Foi criado um protótipo de aplicação que implementa a técnica de Diffie-Hellman para
estabelecer um acordo de chaves, através da definição de uma senha compartilhada, que é
utilizada para cifrar e decifrar os volumes do TrueCrypt. A aplicação foi desenvolvida na
linguagem de programação JAVA versão 6, e é compatı́vel com as plataformas Windows,
Linux e Mac. Pode ser aplicada em vários cenários onde haja compartilhamento de
informações seguras. Em tempo, tal aplicação soluciona o problema de distribuição de
chaves em criptografia simétrica.
O resultado obtido foi satisfatório, visto que com a aplicação 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 segurança, o
volume criptografado sem se preocupar com a divulgação da senha que o protege.
Como trabalhos futuros, pode-se implementar uma versão que utilize chaves PGP, ou
certificados de segurança PKCS #3, como descrito em [Laboratories, 1993], ao invés de
utilizar padrão próprio de chaves, como foi feito neste trabalho. Isto permitirá a obtenção

32
dos pares de chaves por entidades externas, eliminando (opcionalmente) a necessidade
de implementar o módulo que gera os pares de chaves. Sugere-se também tornar este
aplicativo um módulo do TrueCrypt, para integrar ainda mais esta solução ao software.

33
Referências
Almeida, G. B. d. C. (2009). Autenticação Segura Baseada em Biometria Voltada para a
Dinâmica da Digitação. Monografia, Universidade Federal de Goiás.

Burnett, S. e Paine, S. (2002). Criptografia e Segurança - O Guia Oficial RSA. ISBN-10:


8535210091. Elsevier, 1st edition.

CERT.BR (2006). Cartilha de segurança. Diponı́vel em: http://cartilha.cert.br/.

Filho, A. M. d. S. (2004). Segurança da informação: Sobre a necessi-


dade de proteção de sistemas de informações. Online. Disponı́vel em:
http://www.espacoacademico.com.br/042/42amsf.htm.

Ide, M. T., Reis, J. M., e Kanasoro, R. K. Segurança


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). Segurança da Informação - uma abordagem social. Tese de


doutorado, Universidade de Brası́lia.

Moreira, N. S. (2001). Segurança Mı́nima - Uma Visão Corporativa da Segurança de


Informações. Axcel Books.

Moreno, E. D., Pereira, F. D., e Chiaramonte, R. B. (2005). Criptografia em Software e


Hardware. Novatec.

34
Promon (2005). Segurança da informação, um diferencial determinante na com-
petitividade das corporações. 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). História da criptologia. Página 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 Dicionário 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
Apêndice A

Códigos Fonte

A.1 A classe GeradorDH

Código 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 próprio, 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 ∗ É inicializado com os parâmetros que, provavelmente, vieram de uma outra
45 ∗ chave. Se {@code parametros} não for nulo, então a variável global
46 ∗ {@code paramSpecs} é inicializada.
47 ∗
48 ∗ @param parametros Os parâmetros de inicialização do acordo. Se
49 ∗ {@code parametros} for <i>null</i>, então novos parâmetros são
50 ∗ criados através do método <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 diretório 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 contrário .
68 ∗/
69 public static boolean exportaPar(KeyPair parChaves, File diretorio) {
70 ObjectOutputStream saida;
71 try {
72 // exporta pública
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 p^
ode 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 pública.
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 está corrompido ou "
146 + "n~
ao é uma chave privada de DH.");
147 } catch (FileNotFoundException ex) {
148 System.err.println ("ERRO: N~
ao há chave neste diretório.");
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 parâmetros contidos na variável 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 método {@code getEncodedSecret}.
178 ∗ Primeiramente o vetor de bytes retornado pelo método
179 ∗ {@code getEncodedSecret} é convertido em um vetor de caracteres

40
180 ∗ hexadecimais. Por último mantém nesse vetor somente os 64 caracteres
181 ∗ do centro. Desse último vetor de 64 caracteres que é formada a
182 ∗ string que é retornada.
183 ∗
184 ∗ @param dhPrivateKey A chave privada do acordo
185 ∗ @param dhPublicKey A chave pública do acordo
186 ∗ @return uma string de caracteres hexadecimais de tamanho 64.
187 ∗ @throws InvalidParameterSpecException Em caso de as chaves informadas não
188 ∗ serem compatı́veis, ou não 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 método {@code comparaParametrosDH}
203 ∗ para verificar se as chaves passadas como argumento são compatı́veis entre
204 ∗ si , ou seja , se foram geradas com os mesmo parâmetros.
205 ∗ Em caso positivo, inicializa o acordo com essas chaves e gera o segredo
206 ∗ compartilhado. Em caso negativo, lança uma
207 ∗ {@code InvalidParameterSpecException}.
208 ∗ @param dhPrivateKey A chave privada de um parceiro do acordo.
209 ∗ @param dhPublicKey A chave pública do outro parceiro do acordo.
210 ∗ @return O segredo compartilhado na forma de um vetor de bytes, cujo
211 ∗ tamanho é 128 (múltiplo 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: Par^
ametro para algoritmo inválido.");
226 } catch (InvalidKeyException ex) {
227 System.err.println ("ERRO: Chave inválida.");
228 } catch (NoSuchAlgorithmException ex) {
229 System.err.println ("ERRO: Algoritmo n~
ao encontrado.");
230 }
231 } else {
232 throw new InvalidParameterSpecException("Os par^
ametros das chaves "
233 + "n~
ao correspondem. "
234 + "N~
ao é possı́vel gerar um acordo Diffie-Hellman.");
235 }
236 return segredo;
237 }
238

239 /∗∗
240 ∗ Compara os parâmetros DH de duas chaves a fim de verificar se as duas
241 ∗ são aptas a realizarem um acordo de chaves de DH corretamente.
242 ∗ @param dhPrivateKey
243 ∗ @param dhPublicKey
244 ∗ @return {@code true} somente se os parâmetros tiverem os mesmos valores;
245 ∗ {@code false} caso contrário .
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 parâmetros de algoritmo para o par de chaves.
278 ∗ Trata−se do número primo <i>p</i> e de sua raiz primitiva <i>&alpha;</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 número de bits
283 ∗ @param provedor o provedor que implementa
284 ∗ <code>{@link AlgorithmParameterGeneratorSpi}</code> e que gerará os
285 ∗ parâmetros.
286 ∗ @return Um objeto <code>{@link DHParameterSpec}</code> contendo as
287 ∗ especificações dos parâmetros comuns às 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 múltiplo de 64. É recomendável que"
296 + " seja, pelo menos, 256.");

43
297 }
298 System.out.println(GeradorDH.class.getName()
299 + ": Criando os par^
ametros 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 par^
ametros das chaves "
309 + "n~
ao correspondem. "
310 + "N~
ao é 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 representação 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

Código 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 manipulação de dados com a área de transferência
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 conteúdo da área de transfer^
encia já n~
ao pertence mais à \n"
25 + "aplicaç~
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 área de transfer^
encia!");
35 return true;
36 }

45
37 System.out.println("Erro: Senha n~
ao copiada para a área de transfer^
encia.");
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
Apêndice B

Diagrama UML

Figura B.1: Diagrama de classes

47
Apêndice C

Códigos Fontes e Javadoc

O Javadoc e todos os códigos fontes da aplicação criados estão gravados no CD que


acompanha este material.

48

Вам также может понравиться