Beruflich Dokumente
Kultur Dokumente
EXRCITO BRASILEIRO
DEPARTAMENTO DE CINCIA E TECNOLOGIA
INSTITUTO MILITAR DE ENGENHARIA
(Real Academia de Artilharia Fortificao e Desenho - 1792)
TEMA DIRIGIDO
2 ANO
Maj ANDERSON FERNANDES PEREIRA DOS SANTOS
RIO DE JANEIRO
05 DE NOVEMBRO DE 2015
RESUMO
O presente trabalho tem por objetivo desenvolver um algoritmo de Criptografia
RSA utilizando a linguagem de programao Java e aplic-lo ao ambiente Android
Lollipop. Para tanto foram desenvolvidos estudos acerca do algoritmo RSA, da
linguagem Java, do ambiente Android, alm da implementao do algoritmo em
Java para Desktop e para Android. Ao final do desenvolvimento foi entregue um
aplicativo em Android Lollipop, como se objetivava inicialmente, com as
funcionalidades de criptografar e decriptografar quaisquer tipos de arquivos de um
Smartphone onde opera.
SUMRIO
1.
INTRODUO ............................................................................................6
1.1.
MOTIVAO .......................................................................................................... 6
1.2.
OBJETIVO ............................................................................................................... 7
1.2.1.
1.3.
CONTRIBUIO .................................................................................................... 7
1.4.
ORGANIZAO ..................................................................................................... 8
2.
2.1.1.
INTRODUO ........................................................................................................ 9
2.1.1.1.
A CRIPTOGRAFIA ................................................................................................. 9
2.1.1.2.
HISTRICO ............................................................................................................. 9
2.1.1.3.
2.1.2.
2.1.2.1.
2.1.2.2.
2.1.2.2.1.
2.1.2.2.3.
2.1.2.2.4.
VULNERABILIDADES ........................................................................................ 15
APLICAES ........................................................................................................ 17
JAVA ...................................................................................................................... 19
2.2.1.
INTRODUO ...................................................................................................... 19
2.2.1.1.
2.2.2.
CONCEITOS .......................................................................................................... 20
2.2.2.1.
2.2.2.2.
ORIENTAO A OBJETO................................................................................... 21
2.2.3.
2.2.3.1.
VANTAGENS ........................................................................................................ 22
2.2.3.1.1.
2.2.3.1.2.
2.2.3.1.3.
PORTABILIDADE ................................................................................................ 23
2.2.3.1.4.
2.2.3.1.5.
2.2.3.2.
DESVANTAGENS ................................................................................................ 24
2.2.3.2.1.
2.2.3.3.
2.2.3.3.1.
RESULTADOS ...................................................................................................... 24
2.3.
ANDROID .............................................................................................................. 25
2.3.1.
INTRODUO ...................................................................................................... 25
2.3.1.1.
2.3.2.
2.3.2.1.
2.3.2.1.1.
ACTIVITIES ............................................................................................................ 27
SERVICES .............................................................................................................. 29
2.3.2.1.3.
2.3.2.1.4.
2.3.2.2.
2.3.2.3.
2.3.2.3.1.
FILTROS ................................................................................................................ 32
2.3.2.3.2.
PERMISSES ........................................................................................................ 32
3.
APLICATIVO .............................................................................................34
3.1.
PROBLEMAS ENCONTRADOS.......................................................................... 34
3.2.
3.2.1.
3.2.2.
3.2.3.
DESCRIPTOGRAFAR .......................................................................................... 40
4.
5.
CONCLUSO .............................................................................................44
1.
INTRODUO
1.1.
MOTIVAO
1.2.
OBJETIVO
1.2.1.
OBJETIVOS PRINCIPAIS
Para que se atinja o objetivo final de implementar o algoritmo RSA para Android,
definiram-se os seguintes objetivos principais, sendo esses requisitos ao produto final:
1.3.
CONTRIBUIO
1.4.
ORGANIZAO
1. Introduo;
2. Fundamentao terica, onde encontram-se abordados os tpicos: RSA, Java e
Android;
3. Aplicativo, onde est descrito o funcionamento do aplicativo;
4. Anlise crtica;
5. Concluso; e
6. Referncias Bibliogrficas.
2.
FUNDAMENTAO TERICA
2.1.1.
INTRODUO
2.1.1.1.
A CRIPTOGRAFIA
2.1.1.2.
HISTRICO
mquina alem tornou-se mais uma vez invulnervel e dessa vez parecia ser
humanamente impossvel quebr-la (SINGH, 2007).
Apenas Alan Turing, fundador conceitual da computao moderna, foi capaz de
quebrar o Enigma novamente. Uma equipe foi montada em Bletchley Park para decifrar
a Enigma e l Turing construiu uma mquina, capaz de resolver problemas matemticos.
Os aliados conseguiram quebrar o enigma e a partir da um servio de inteligncia foi
criado de modo que os alemes no percebessem que seu sistema no era mais seguro. A
quebra do enigma no s foi dita responsvel por encurtar a guerra em 2 anos, como deu
incio criptografia moderna.
2.1.1.3.
2.1.2.
2.1.2.1.
CRIPTOGRAFIA MODERNA
2.1.2.2.
O ALGORITMO RSA
2.1.2.2.1.
EMBASAMENTO MATEMTICO
= 1 1 2 2
Ento:
() = (1
1
1
1
) (1 ) (1 )
1
2
Para o emprego no Algoritmo RSA, em especial, todo utilizado dever ser da forma
= , de modo que a frmula acima, poder ser reduzida a:
() = (1 1)(2 1)
(1)
1 = 1 + 1
= 1 2 + 2
2 = 2 + 2
1 = 2 3 + 3
3 = 3 + 3
2 = 3 4 + 4
4 = 4 + 4
3 = 4 5 + 5
5 = 5 + 5
3 = 2 1 + 1
1 = 1 + 1
2 = 1
= 0
(2)
= 2 1
(3)
2.1.2.2.2.
2.1.2.2.3.
CIFRAGEM E DECIFRAGEM
Para que se inicie o processor de cifragem necessrio que todos os smbolos sejam
nmeros; para tanto, em meio computacional e em outros meios, necessrio,
inicialmente, converter cada letra ou smbolo em um nmero com base na tabela ASCII.
Depois, esses nmeros so agrupados, formando um nmero nico chamado m. Se m for
maior que n, ento ele deve ser dividido em blocos de modo que cada um seja menor que
n;
A cifragem e a decifragem devem ser executadas seguindo o seguinte mtodo:
Cifragem:
Decifragem:
2.1.2.2.4.
VULNERABILIDADES
Apesar de ser um dos algoritmos mais seguros do mundo o RSA possui algumas
vulnerabilidades. Fatorao de nmeros inteiros muito grandes, pequenos expoentes,
exposio parcial da chave privada e ataques temporais so apenas algumas delas,
segundo Dan Boneh (1999).
No apenas atravs de uma escolha de um pequeno d que o RSA pode ser quebrado.
Se uma frao da chave privada for exposta possvel reconstruir toda a chave. No
entanto isso apenas possvel quando e < n1/2. (BONEH, 1998).
Por isso importante gerar no s uma chave grande e aleatria, como tambm
proteger a chave privada
2.1.2.2.5.
APLICAES
O emissor no pode negar o envio de uma mensagem que contenha sua assinatura;
e,
A assinatura digital , ento, uma garantia de que o documento uma cpia verdadeira
e correta do original, garantindo tambm a autoria.
Todo processo de gerao e verificao da assinatura pode ser feito utilizando o
algoritmo RSA. Para que um documento ou assinatura adulterada no seja detectada, o
atacante deve ter a chave privada de quem assinou o documento (BRAGHETTI, 2003).
assinado digitalmente por uma terceira parte confivel, que associa o nome de uma pessoa
ou instituio a uma chave de criptografia pblica (MAIA, PAGLIUSI).
2.1.2.2.5.4. SSL/TLS
2.1.2.2.5.5. IPSEC
2.2.
JAVA
2.2.1.
INTRODUO
2.2.1.1.
2.2.2.
CONCEITOS
2.2.2.1.
A mquina virtual Java (no ingls, Java Virtual Machine - JVM) um programa
responsvel pelo gerenciamento dos aplicativos, medida que so executados. Ela
carrega e executa os aplicativos Java, convertendo o ByteCode, cdigo gerado pelo
compilador Java (javac), em executvel de mquina.
Por meio dela, programas escritos em Java podem funcionar em qualquer plataforma
de software e hardware, desde que esta possua uma verso da JVM.
Formalmente, existem trs noes de JVM: Specification (especificao),
implementation (implementao) e instance (instncia). Portar uma nica especificao
2.2.2.2.
ORIENTAO A OBJETO
2.2.3.
Sabe-se que, hoje em dia, no existe uma linguagem melhor que a outra, mas
linguagens mais propcias para certa situao. Visto isso, segue algumas vantagens e
desvantagens de se utilizar JAVA.
2.2.3.1.
VANTAGENS
2.2.3.1.1.
TRATAMENTO DE EXCEES
O fato do Java possuir recursos para lidar com excees, evitando que o programa
finalize subitamente sem que o problema esteja claro, faz com que a linguagem se torne
mais confivel para o usurio. Graas a tais recursos o programador apto para prever
um possvel erro e tomar as medidas necessrias.
2.2.3.1.2.
GARBAGE COLLECTOR
2.2.3.1.3.
PORTABILIDADE
Java considerado como uma linguagem porttil, pois, como seu cdigo-fonte
compilado para bytecode e esse interpretado pela JVM, a linguagem em si se torna
independente da plataforma que est sendo utilizada. Ou seja, o mesmo cdigo pode ser
utilizado para diferentes sistemas operacionais.
2.2.3.1.4.
2.2.3.1.5.
CUSTO E SUPORTE
2.2.3.2.
DESVANTAGENS
2.2.3.2.1.
Por ser porttil, Java no tem como suprir as mais variadas necessidades
encontradas em cada plataforma diferente e, dessa forma, ele tem carncia de eficincia
quando comparado a outras linguagens. Afinal, natural que ao adotar um carter
genrico um produto sofra com deficincia de qualidade especfica.
2.2.3.3.
2.2.3.3.1.
RESULTADOS
da
mensagem
para
bytes:
8410111511610132505544321161111149910111010011132112971149732113117101
321021171109910511111010133
Mensagem
encriptada
em
Bytes:
8266-119-235612497-496343-46-12-1251-
144878474852-1135691-125101-56-116-73-55-1735-120-2524116-1225277010543559212440-81-11964101-96-152-2-27803107-89-7769-89-2071-97-53-93117124-869733642028127-7612266-49665357-4-31-1-1123619-50-4640-41123-389249120-6765-60-17-125-80-104793711614541205017-88-124-2493100-7856-70207891-34-86-11586-5593-1549-1830-33-35-36-416167-50-22-1012543546-119-39-244-111552-5412-73-31-225-5993726-48-1933-66-87-98-62-113-98-96-8973-58-543879-96-71478635-114-45-84-43-77-29528433-26-122-14-14-90-96-42-8550-17-5210661-61-76-141857-80-10749-125-80-101118-78-60-91154-53-27378914120-912698110-824337-31113-90772735-31-47-88-6229-388-3967-9685-105-20-79
String
Decriptada
em
Bytes:
8410111511610132505544321161111149910111010011132112971149732113117101
321021171109910511111010133
Decrypted String: Teste 27, torcendo para que funcione!
CONSTRUDO COM SUCESSO (tempo total: 1 segundo)
2.3.
ANDROID
2.3.1.
INTRODUO
2.3.1.1.
Em 2003, Andy Rubin, Rich Miner, Nick Sears e Chris White fundaram em Palo
Alto, Califrnia a Android Inc. Rubin, ento, definiu a empresa como Dispositivos
mveis mais inteligentes e que estejam mais cientes das preferncias e da localizao do
seu dono.
Por verem um mercado mais amplo, eles decidiram focar em mobile e ofereceram
um novo meio de sistema operacional mvel, o Open Source, baseado no Kernel Linux.
A ideia era ser um sistema gratuito e simples aos desenvolvedores.
Em 2005, o Google comprou a Android Inc, e nasceu a Google Mobile Division.
Surgiram os primeiros contratos de parceria com fabricantes de hardware e software e o
Google prometeu um sistema flexvel e atualizvel.
O prottipo, com previso de lanamento para 2006, parecia um BlackBerry, sem
touchscreen e operando com teclado QWERTY. Mas ao ver os lanamentos dos
concorrentes o Google redesenhou seu modelo e em 22 de outubro de 2008 foi lanado o
primeiro Android comercial do mercado, rodando em um HTC Dream.
O Google ento ofereceu 10 milhes de dlares aos desenvolvedores que
conseguissem realizar os melhores aplicativos para Android, levando em considerao a
primeira verso do Android SDK, surgiu assim a verso 1.0.
A plataforma est sempre sendo atualizada e suas verses, com nomes em ordem
alfabtica e homenageando doces (Menos a Alpha e Beta), sempre apresentam melhorias
e inovaes.
A verso utilizada neste trabalho a 5.1, o Android Lollipop. Entre suas melhorias
tem-se: suporte para processadores 64 bits, introduo da nova diretriz de design do
Android (Material Design) e substituio da mquina virtual Dalvik por ART.
A verso atual, o Android 6.0, foi nomeada de Marshmallow. Entre suas melhorias
h um novo sistema de permisses, semelhante ao do iPhone e um novo gerenciamento
de energia, um suporte nativo para as digitais. Porm quanto mais recente a verso menos
aparelhos so contemplados.
2.3.2.
CONCEITOS FUNDAMENTAIS
Cada processo tem sua mquina virtual (VM) prpria e cada aplicativo roda em seu
prprio processo Linux. O Android comea o processo quando algum componente do
aplicativo precisa ser executado e o encerra quando no mais necessrio ou para
recuperar memria.
o princpio do menor privilgio, cada aplicativo tem acesso apenas aos
componentes que precisa para fazer seu trabalho, nada mais.
Contudo, h meios para um aplicativo acessar informaes de outros ou os servios
do sistema. Se os aplicativos compartilharem a mesma ID, o mesmo processo Linux e a
mesma VM, eles podem acessar os arquivos um do outro.
Alm disso, um aplicativo pode pedir permisso ao usurio para acessar informaes
como contatos, mensagens, carto SD, cmera etc.
2.3.2.1.
COMPONENTES DO APLICATIVO
2.3.2.1.1.
ACTIVITIES
Uma activity representa uma tela nica com a qual os usurios podem interagir, a
fim de fazer algo. Por exemplo, um aplicativo de e-mail pode ter uma activity para criar
um e-mail, outra para mostrar a caixa de entrada e outra para ler os e-mails.
Um aplicativo consiste normalmente de vrias activities frouxamente ligadas, elas
trabalham em coeso, mas so independentes. Cada vez que uma nova comea, a anterior
interrompida, mas o sistema a preserva em uma pilha (a pilha de retorno). A pilha usa
um mecanismo de fila, ento quando o usurio pressiona a tecla back, a activity
removida da pilha e retoma a anterior.
Um outro aplicativo, se tiver permisso, pode comear uma dessas activities e
cada activity pode comear outra.
Uma activity implementada como uma subclasse de Activity.
Toda activity tem um ciclo de vida, ela pode existir em basicamente trs estados:
1) Retomado, quando est em primeiro plano da tela e tem o foco do usurio;
2) Em pausa, quando outra activity est em primeiro plano, mas ainda visvel; e,
3) Parado, quando totalmente obscurecida por outra.
Quando uma activity transita dos diferentes estados descritos acima, o sistema
notificado atravs de vrios mtodos de retorno. Os mtodos de call-back so ganhos para
fazer um trabalho adequado quando o estado da activity muda. So eles:
i) onCreate( ): Chamado quando a aplicao criada. onde se deve fazer tudo
do conjunto esttico normal, criar pontos de vista, vincular dados em listas etc.
sempre seguido por onStart( ).
ii) onRestart( ): Chamado depois que a activity foi interrompida, pouco antes de
ser iniciada de novo. Seguido por onStart( ).
iii) onStart( ): Chamado imediatamente antes da activity torna-se visvel para o
usurio. Seguido por onResume( ) se a atividade vem para primeiro plano ou
onStop( ) se se torna oculto.
iv) onResume( ): Chamado imediatamente antes da activity passar a interagir
com o usurio. A aplicao pode, ento, iniciar ou retomar aes necessrias
para atualizar as interfaces como usurio. seguido por onPause( ).
v) onPause( ): Acontece quando o Android chama uma activity diferente. Os
direitos tela so perdidos e o momento de parar todo o contedo suprfluo
que consome recursos do sistema e bateria. seguido por onResume( ) se a
activity retorna para a frente, ou por onStop( ) se torna invisvel para o usurio.
vi) onStop( ): Chamado quando outra activity obteve o primeiro plano, ou quando
est sendo eliminada. Seguido de onRestart( ) se a activity est voltando a
interagir com o usurio, ou por onDestroy( ) se est indo embora.
vii) onDestroy: Chamado antes que a activity seja destruda. a ltima
oportunidade da aplicao fazer alguma coisa antes de ser eliminada. Pode ser
chamado quando o Android precisa de memria ou se o usurio finalizou a
aplicao.
2.3.2.1.2.
SERVICES
2.3.2.1.3.
PROVEDORES DE CONTEDO
2.3.2.1.4.
RECEPTORES DE BROADCAST
2.3.2.2.
ATIVANDO COMPONENTES
2.3.2.3.
O ARQUIVO MANIFESTO
Antes do sistema Android iniciar um componente, ele deve saber que esse
componente existe, para isso, o sistema executa o AndroidManifest.xml. Nele, a aplicao
deve declarar todos os componentes.
O manifesto no apenas declara os componentes, ele tambm identifica as
permisses que um aplicativo requer, declara o nvel de API mnimo requerido pelo
aplicativo, declara as caractersticas de hardware e software usadas ou requeridas pelo
aplicativo, quais bibliotecas API que o aplicativo precisa se conectar etc.
2.3.2.3.1.
FILTROS
2.3.2.3.2.
PERMISSES
3.
APLICATIVO
3.1.
PROBLEMAS ENCONTRADOS
3.2.
Existem trs caminhos possveis que podem ser seguidos ao acessar o aplicativo.
Criptografar gerando as chaves, criptografar j possuindo a chave pblica e
descriptografar (Figura 5).
Figura 5 Viso geral do Aplicativo
3.2.1.
Figura 6.1a
Figura 6.1c
Figura 6.1b
Figura 6.1d
Figura 6.1c
Figura 6.1e
Figura 6.1f
3.2.2.
Figura 6.2a
Figura 6.2d
Figura 6.2b
Figura 6.2c
Figura 6.2e
3.2.3.
DECRIPTOGRAFAR
Figura 6.3a
Figura 6.3b
Figura 6.3c
Figura 6.3d
4.
TRABALHOS FUTUROS
5.
CONCLUSO
REFERNCIAS BIBLIOGRFICAS
ANDRADE, Rafael Santos, SILVA, Fernando dos Santos. Algortimo de criptografia
RSA: anlise entre a segurana e velocidade. Revista eventos pedaggicos, 2012.
ANDROID DEVELOPER, Building a Simple User Interface.
Disponvel em
http://developer.android.com/intl/pt-br/training/basics/firstapp/building-ui.html,
acessado em 25/10/2015.
ANDROID DEVELOPER, Creating an Android Project.
Disponvel em
DEVELOPER,
Layouts.
Disponvel
em
http://developer.android.com/intl/pt-br/guide/topics/ui/declaring-layout.html,
acessado em 26/10/2015.
ANDROID
DEVELOPER,
Running
your
App.
Disponvel
em
http://developer.android.com/intl/pt-br/training/basics/firstapp/running-app.html,
acessado em 25/10/2015.
ANDROID
DEVELOPER,
ScrollView.
Disponvel
em
http://developer.android.com/intl/pt-br/reference/android/widget/ScrollView.html,
acessado em 26/10/2015.
ANDROID
DEVELOPER,
Starting
Another
Activity.
Disponvel
http://developer.android.com/intl/pt-br/training/permissions/index.html,
em
acessado
em 26/10/2015.
ANDROID DEVELOPER, Working with System Permissions.
Disponvel em
Disponvel em
http://developer.android.com/intl/pt-br/training/material/theme.html, acessado em
28/10/2015.
ANDROID, A histria do Android. Disponvel em: https://www.android.com/intl/ptBR_br/history/, acessado em 27/08/2015.
BONEH, Dan. Exposing an RSA private key given a small fraction of its bits. 1998.
BONEH, Dan. Twenty Years of Attacks on the RSA Cryptosystem. Notices of the
AMS 46: 203-213, 1999.
UNICAMP,
Campinas,
2003.
Disponvel
https://technet.microsoft.com/en-us/library/aa995740(v=exchg.65).aspx,
em
acessado
em 05/05/2015.
BURNETT, Steve. Criptografia e segurana: o guia oficial/ Steve Burnett, Stephen
Paine; traduo de Edson Fumankiewicz. Rio de Janeiro. Elsevier, 2002.
CAELUM, Desenvolvimento mvel com Google Android. Apostila da Caelum Ensino
e Inovao, disponvel em http://www.caelum.com.br, acessado em 28/08/2015.
CAELUM,
Java
Orientao
Objetos.
Disponvel
em
https://www.caelum.com.br/download/caelum-java-objetos-fj11.pdf, acessado em
20/05/2015
CAELUM. InputStream, InputStreamReader e BufferedReader. Disponvel em
http://www.caelum.com.br/apostila-java-orientacao-objetos/pacote-java-io/#15-3inputstream-inputstreamreader-e-bufferedreader. Acessado em 15 de agosto de 2015.
CODERS HUB. Implementation of RSA Algorithm (Encryption and Decryption) in
Java. Disponvel em http://www.coders-hub.com/2013/04/implementation-of-rsausing-java.html#.VeO2bLJViko. Acessado em 30 de julho de 2015.
DE
AMORIM,
Anderson
Duarte.
ANDROID,
uma
viso
geral.
2011.
http://developer.android.com/guide/components/fundamentals.html#Components,
acessado em 28/08/2015.
DEVMEDIA. Criptografia Assimtrica: Criptografando e Descriptografando Dados
em Java. Disponvel em: http://www.devmedia.com.br/criptografia-assimetricacriptografando-e-descriptografando-dados-em-java/31213. Acessado em 05 de
agosto de 2015.
DEVMEDIA. Nmeros Aleatrios em Java A Classe java.util.Random. Disponvel
em:
http://www.devmedia.com.br/numeros-aleatorios-em-java-a-classe-java-util-
Disponvel
em
http://www.devmedia.com.br/os-4-pilares-da-
PLATFORM.
Class
Cipher.
Disponvel
em
http://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html. Acessado em 15
de julho de 2015.
JAVA
PLATFORM.
Class
KeyPaiGenerator.
Disponvel
em
http://docs.oracle.com/javase/7/docs/api/java/security/KeyPairGenerator.html.
Acessado em 15 de julho de 2015.
JAVA
PLATFORM.
Class
ObjectOutputStream.
Disponvel
em
http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html.
Acessado em 05 de agosto de 2015.
JAVA PROGRESSIVO. Como ler caracteres, Strings e Bytes de um arquivo Java.
Disponvel
em
http://www.javaprogressivo.net/2014/01/Como-ler-caracteres-
Obtenha
Informaes
sobre
Tecnologia
Java.
Disponvel
em
Uso
da
palavra
reservada
final.
Disponvel
em
http://javafree.uol.com.br/topic-862444-Uso-da-palavra-reservada-final.html.
Acessado em 15 de agosto de 2015.
JENKOV.
Java
IO:
ObjectOutputStream.
Disponvel
em:
http://tutorials.jenkov.com/java-io/objectoutputstream.html. Acessado em 15 de
julho de 2015
KOCHER, Paul C. Timing Attacks on Implementations of Diffie-Hellman, RSA,
DSS, and Other Systems, 2006.
MAIA, Luiz Paulo, PAGLIUSI, Paulo Sergio. Criptografia e certificao digital
MERCATO,
Maria,
doce
histria
do
Android.
Disponvel
em
Maximiliano,
histria
do
Android.
Disponvel
em
https://www.oficinadanet.com.br/post/13939-a-historia-do-android, acessado em
27/08/2015.
MONTEBUGNOLI, Thiago Cavalheiro. Android Lendo e Carregando Arquivo
Texto.
Disponvel
em
http://www.theclub.com.br/restrito/revistas/201208/andr0812.aspx, acessado em
27/10/2015.
NAUGHTON, Patrick. Dominando o Java, Guia Autorizado da Sun Microsystems.
Editora Makron Books, 1997, Osborne.
NIST, S. Frankel, ERICSSON, S. Krishnan. IP Security (IPSec) and Internet Key
Exchange (IKE) Document Roadmad, 2011.
PAAR, Christof. Understanding cryptography, a textbook for students and
practitionars. Berlim. Springer, 2009.
PEDRO, Luciana Rocha, CIOLETTI, Leandro Martins. Algortimo Euclidiano
Estendido. Departamento de Matemtica, UFMG, MG, 2009.
PORTAL ANDROID. Manipulando arquivos .txt no Android. Disponvel em
http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=23281, acessado
em 27/10/2015.
POZZER, Cesar Tadeu. Introduo a Programao Orientada a Objetos na
Linguagem
C++.
Disponvel
em
http://www-
SOFT.
.KEY
Extenso
de
arquivo.
Disponvel
em
em
http://www.dca.fee.unicamp.br/cursos/POOCPP/node4.html,
acessado em 19/05/2015
ROMANATO, Allan. Entenda como funciona a Java Virtual Machine (JVM).
Devmedia, 2015.
SANTOS JNIOR, Luis Armando, NOGUEIRA, Antnio Carlos. A funo Phi de
Euler e sua aplicao na Criptografia. Faculdade de Matemtica, UFU, MG.
SINGH, Simon. O livro dos cdigos. Traduo de Jorge Calife. 6 ed Editora Afiliada,
2007.
SOUZA, Bruno, BIZNELLA NARDON, Fabiane, REHEM, Serge. A histria da
tecnologia Java. Easy Java Magazine, 2014.
SOUZA,
Cleidson.
Conceitos
de
Orientao
Objetos.
http://www.ufpa.br/cdesouza/teaching/es/3-OO-concepts.pdf,
Disponvel
em
acessado
em
19/05/2015.
STACK OVERFLOW. Principal objetivo das classes utilitrias. Disponvel em
http://pt.stackoverflow.com/questions/90047/principal-objetivo-de-classesutilit%C3%A1rias, acessado em 27/10/2015.
STACKOVERFLOW. When should I use this in a class. Disponvel em
http://stackoverflow.com/questions/2411270/when-should-i-use-this-in-a-class.
Acessado em 15 de agosto de 2015.
STATCOUNTER GLOBLAL STATS, Top 8 Mobile Operating Systems from Oct 2014
to Oct 2015. Disponvel em http://gs.statcounter.com/#mobile_os-ww-monthly201410-201510. Acessado em 19 de novembro de 2015.
THE DEVELOPERS POINT, Implementing RSA in Java (BigInteger approach).
Disponvel
em
http://www.thedeveloperspoint.com/implementing-rsa-in-java/.
EXPERT.
Public,
Private
Protected.
Disponvel
http://www.tiexpert.net/programacao/java/public-private-protected.php.
em
Acessado
em 5 de agosto de 2015.
TI EXPERT. Try e Catch. Disponvel em http://www.tiexpert.net/programacao/java/trycatch-finally.php. Acessado em 15 de julho de 2015.
TUTORIALSPOINT.
Java.lang.Integer.compareTo()
Method.
Disponvel
em
http://www.tutorialspoint.com/java/lang/integer_compareto.htm. Acessado em 02 de
setembro de 2015.
TUTORIALSPOINT.
Java.math.BigInteger.gcd()
Method.
Disponvel
em
http://www.tutorialspoint.com/java/math/biginteger_gcd.htm. Acessado em 04 de
setembro de 2015.
TUTORIALSPOINT. Java.math.BigInteger.modInverse() Method. Disponvel em
http://www.tutorialspoint.com/java/math/biginteger_modinverse.htm. Acessado em
15 de agosto de 2015.
Disponvel
em
http://helpdev.com.br/2012/08/03/android-opcoes-de-
APNDICE A O CDIGO
package tema.dirigido;
import java.math.BigInteger;
/**
* A classe BigInteger representa os nmeros inteiros grandes. A vantagem do seu
* uso em criptografia consiste no fato dela representar os valores na notao
* de complemento a dois, dela possuir todos os operadores matemticos bsicos
* sobre inteiros e possuir funes complexas j implementadas, tais como a
* aritmtica modular (mod e modInverse), algoritmo de Mximo Divisor Comum
(gcd), e
* gerao de nmeros primos (probablePrime).
*/
import java.util.Random;
/**
* A classe Random nos permite gerar nmeros aleatrios, processo fundamental
* para que geremos chaves privadas da maneira mais segura possvel.
*/
import java.io.*;
private BigInteger p;
private BigInteger q;
private BigInteger N;
private BigInteger phi;
private BigInteger e;
private BigInteger d;
private int bitlength = 1024;
/**
* Em criptografia, "Bit Length" o nmero de bits numa chave digital usado
public RSA()
{
r = new Random();
p = BigInteger.probablePrime(bitlength, r);
q = BigInteger.probablePrime(bitlength, r);
/**
* probablePrime uma funo da biblioteca BigInteger que retorna um
* nmero primo com uma probabilidade de falha de 2^(-100), cujas
* entradas so o tamanho em bits do inteiro a ser retornado, e uma fonte de
bits
* aleatrios usado para selecionar candidatos a serem verificados como
* primos
*/
N = p.multiply(q);
phi = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
/**
* Da construo do algoritmo sabemos que e deve ser primo com phi, e
* por esse motivo geramos um e primo;
* Sabemos tambm que 1<e<phi, logo geramos e com metade do
comprimenro
* de bits de p e q;
*/
e = BigInteger.probablePrime(bitlength/2, r);
/**
* A funo a.compareTo(b) retorna:
*
x<0 - se a<b
x=0 - se a=b
x>0 - se a>b
/**
* Do algoritmo sabemos que a mensagem criptografada, sendo um bloco c,
* tal que c=m^d mod n, onde m a mensagem limpa e N o produto entre p e
q.
* Logo, a funo de criptografia utiliza-se da funo modPow, que retorna
* o valor de c da expresso acima quando utilizamos ela m.modPow(d,n).
* Processo anlogo empregado para a decriptografia.
* @param message
* @return
*/
public byte[] encrypt(byte[] m)
{
return (new BigInteger(m)).modPow(d, N).toByteArray();
//Decriptar mensagem
public byte[] decrypt(byte[] message)
{
return (new BigInteger(message)).modPow(e, N).toByteArray();
}
/**
* Utilizamos a palavra reservada this para referenciar os parmetros da
* classe criada s variveis geradas pelo algoritmo at ento.
* @param e
* @param d
* @param N
*/
public RSA(BigInteger e, BigInteger d, BigInteger N)
{
this.e = e;
this.d = d;
this.N = N;
}
// Encriptao
byte[] encrypted = rsa.encrypt(teste.getBytes());
// Decriptao
byte[] decrypted = rsa.decrypt(encrypted);
System.out.println("String
Decriptada
em
Bytes:
+ bytesToString(decrypted));
"