Você está na página 1de 56

MINISTRIO DA DEFESA

EXRCITO BRASILEIRO
DEPARTAMENTO DE CINCIA E TECNOLOGIA
INSTITUTO MILITAR DE ENGENHARIA
(Real Academia de Artilharia Fortificao e Desenho - 1792)
TEMA DIRIGIDO

ALGORITMO RSA NO AMBIENTE ANDROID


LOLLIPOP COM APLICAO EM JAVA

Leonardo Linhares Muniz Ribeiro


Marlia Nascimento Monteiro
Tayn Larissa Fischer Vieira

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.

OBJETIVOS PRINCIPAIS ...................................................................................... 7

1.3.

CONTRIBUIO .................................................................................................... 7

1.4.

ORGANIZAO ..................................................................................................... 8

2.

FUNDAMENTAO TERICA ...............................................................9

2.1.1.

INTRODUO ........................................................................................................ 9

2.1.1.1.

A CRIPTOGRAFIA ................................................................................................. 9

2.1.1.2.

HISTRICO ............................................................................................................. 9

2.1.1.3.

SOBRE O ALGORITMO RSA .............................................................................. 11

2.1.2.

CONCEITOS E ANLISES TERICAS .............................................................. 12

2.1.2.1.

CRIPTOGRAFIA MODERNA .............................................................................. 12

2.1.2.2.

O ALGORITMO RSA ............................................................................................ 13

2.1.2.2.1.

EMBASAMENTO MATEMTICO ..................................................................... 13

2.1.2.2.1.1. FUNO PHI DE EULER .................................................................................... 13


2.1.2.2.1.2. O ALGORITMO ESTENDIDO DE EUCLIDES .................................................. 13
2.1.2.2.2.

OBTENO DAS CHAVES................................................................................. 14

2.1.2.2.3.

CIFRAGEM E DECIFRAGEM ............................................................................. 15

2.1.2.2.4.

VULNERABILIDADES ........................................................................................ 15

2.1.2.2.4.1. FATORANDO NMEROS PRIMOS MUITO GRANDES ................................. 15


2.1.2.2.4.2. PEQUENOS EXPOENTES.................................................................................... 16
2.1.2.2.4.3. EXPOSIO PARCIAL DA CHAVE PRIVADA ................................................ 16
2.1.2.2.4.4. ATAQUES TEMPORAIS ...................................................................................... 16
2.1.2.2.5.

APLICAES ........................................................................................................ 17

2.1.2.2.5.1. ASSINATURA DIGITAL ...................................................................................... 17


2.1.2.2.5.2. CERTIFICADO DIGITAL ..................................................................................... 17
2.1.2.2.5.3. S/MIME E PGP ...................................................................................................... 18
2.1.2.2.5.4. SSL/TLS ................................................................................................................. 18
2.1.2.2.5.5. IPSEC ..................................................................................................................... 18
2.2.

JAVA ...................................................................................................................... 19

2.2.1.

INTRODUO ...................................................................................................... 19

2.2.1.1.

BREVE HISTRICO DA LINGUAGEM ............................................................. 19

2.2.2.

CONCEITOS .......................................................................................................... 20

2.2.2.1.

JVM JAVA VIRTUAL MACHINE ....................................................................... 20

2.2.2.2.

ORIENTAO A OBJETO................................................................................... 21

2.2.3.

VANTAGENS E DESVANTAGENS DO JAVA.................................................. 22

2.2.3.1.

VANTAGENS ........................................................................................................ 22

2.2.3.1.1.

TRATAMENTO DE EXCEES ......................................................................... 22

2.2.3.1.2.

GARBAGE COLLECTOR ....................................................................................... 22

2.2.3.1.3.

PORTABILIDADE ................................................................................................ 23

2.2.3.1.4.

COMPILAO JIT (JUST-IN-TIME) ................................................................... 23

2.2.3.1.5.

CUSTO E SUPORTE ............................................................................................. 23

2.2.3.2.

DESVANTAGENS ................................................................................................ 24

2.2.3.2.1.

BAIXO DESEMPENHO NAS VARIADAS PLATAFORMAS ........................... 24

2.2.3.3.

ALGORITMO RSA EM JAVA ............................................................................. 24

2.2.3.3.1.

RESULTADOS ...................................................................................................... 24

2.3.

ANDROID .............................................................................................................. 25

2.3.1.

INTRODUO ...................................................................................................... 25

2.3.1.1.

BREVE HISTRICO DA PLATAFORMA .......................................................... 25

2.3.2.

CONCEITOS FUNDAMENTAIS ......................................................................... 26

2.3.2.1.

COMPONENTES DO APLICATIVO ................................................................... 27

2.3.2.1.1.

ACTIVITIES ............................................................................................................ 27

2.3.2.1.1.1. CICLO DE VIDA DE UMA ACTIVITY................................................................. 28


2.3.2.1.2.

SERVICES .............................................................................................................. 29

2.3.2.1.3.

PROVEDORES DE CONTEDO ......................................................................... 30

2.3.2.1.4.

RECEPTORES DE BROADCAST ......................................................................... 31

2.3.2.2.

ATIVANDO COMPONENTES ............................................................................. 31

2.3.2.3.

O ARQUIVO MANIFESTO .................................................................................. 32

2.3.2.3.1.

FILTROS ................................................................................................................ 32

2.3.2.3.2.

PERMISSES ........................................................................................................ 32

3.

APLICATIVO .............................................................................................34

3.1.

PROBLEMAS ENCONTRADOS.......................................................................... 34

3.2.

VISO GERAL DO APLICATIVO ...................................................................... 36

3.2.1.

CRIPTOGRAFAR GERANDO AS CHAVES ...................................................... 37

3.2.2.

CRIPTOGRAFAR COM CHAVE PBLICA ....................................................... 39

3.2.3.

DESCRIPTOGRAFAR .......................................................................................... 40

4.

TRABALHOS FUTUROS .........................................................................42

5.

CONCLUSO .............................................................................................44

REFERNCIAS BIBLIOGRFICAS ........................................................................45


APNDICE A O CDIGO........................................................................................51

1.

INTRODUO

A necessidade de transportar mensagens mantendo a segurana das informaes


uma necessidade advinda das guerras, e a medida que o processo de envio da mensagem
foi se sofisticando, a maneira como se garantia sua segurana teve tambm que evoluir.
Surgiu, assim, a criptografia, com o objetivo de encriptar mensagens, tornando seu
contedo restrito queles que possuam a senha das mensagens. Com a evoluo da
tecnologia o transporte de informaes de contedo restrito atravs de redes de
comunicaes tornou-se comum, e a criptografia passou a ser aplicada a, com o objetivo
de impedir que, ainda que interceptadas, as informaes tivessem seu contedo revelado.

1.1.

MOTIVAO

Manter a segurana das informaes um dos grandes desafios dos


desenvolvedores atuais. As informaes transmitidas e armazenadas nos dispositivos
digitais se tornaram extremamente vulnerveis com o surgimento das redes e com a
disseminao da computao nos processos cotidianos. Assim, a manuteno do sigilo
das informaes disponibilizadas na rede passou a ser imprescindvel. Nesse cenrio
surge a criptografia como uma ferramenta de extrema importncia na manuteno do
sigilo das informaes.
A Criptografia busca, em sua raiz, restringir o contedo da mensagem ao seu
remetente e destinatrios, evitando que as informaes sejam passadas a outros, caso a
mensagem seja interceptada em seu transporte. Atualmente, em meio crescente
necessidade de manuteno da segurana, em concordncia com o avano tecnolgico,
os algoritmos que encriptam dados tm sido amplamente desenvolvidos e aprimorados.
Ocorre que, paralelamente a isso, os trabalhos no sentido de desenvolver algoritmos que
decriptografem as mensagens tm tambm avanado.
Desenvolver, implementar e otimizar algoritmos que sejam seguros tem sido um
dos grandes desafios segurana dos dados, motivando o estudo da rea em todos os seus
nveis.

1.2.

OBJETIVO

No contexto da Criptografia, o presente trabalho tem como objetivo implementar


o algoritmo de encriptao RSA em Java na arquitetura Android.

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:

Desenvolver estudo acerca do algoritmo RSA: compreender o funcionamento


do algoritmo e o processo empregado para encriptar e decriptar mensagens;

Desenvolver estudo acerca da Linguagem Java: entender o funcionamento da


linguagem de programao a ser utilizada, vantagens e desvantagens no seu
emprego e buscar a melhor forma de empreg-la para a implementao do
algoritmo estudado;

Desenvolver cdigo em Java do algoritmo para Android: pautado no estudo


anterior, implementar o algoritmo para Desktop;

Desenvolver estudo acerca do ambiente Android: entender como dever


funcionar a adaptao do cdigo j implementado em Desktop, como funciona
o ambiente Android de maneira global e especfica para o aplicativo que
objetiva-se desenvolver;

Desenvolver Aplicativo em Android Lollipop de Criptografia RSA:


implementar o algoritmo j desenvolvido para Desktop fazendo as adaptaes
necessrias para o ambiente Android.

1.3.

CONTRIBUIO

Os estudos desenvolvidos assim como o vis prtico do trabalho so de grande


valia para a formao dos alunos que trabalharam em seu desenvolvimento. A segurana
de dados uma rea ampla e de interesse geral, de modo que iniciar os estudos na rea
uma grande oportunidade de entender mais a fundo o papel e o valor da criptografia na
engenharia da computao e na engenharia de defesa. Alm disso, a aplicao dos
conhecimentos tericos buscados no ambiente Android torna o trabalho diferenciado,

uma vez que se tem a oportunidade de implementar o algoritmo em um ambiente cada


vez mais usual, desenvolvendo um produto novo.
Assim, o desenvolvimento do trabalho no somente aproxima os alunos do
contexto da engenharia de defesa, como tambm de novas habilidades na rea de
programao, sendo de grande valor formao dos mesmos.

1.4.

ORGANIZAO

O presente trabalho encontra-se organizado segundo a seguinte estrutura:

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.

Deste modo, primeiro so desenvolvidos os fundamentos tericos necessrios


para o entendimento do algoritmo, bem como um breve estudo da linguagem Java e da
plataforma Android.

2.

FUNDAMENTAO TERICA

Para atingir o objetivo de desenvolver um algoritmo RSA no ambiente Android


lollipop com aplicao em Java, foram estudados os seguintes temas: RSA, Java e
Android.

2.1.1.

INTRODUO

2.1.1.1.

A CRIPTOGRAFIA

Onde h conflitos, h necessidade da proteo das informaes. A ameaa de


interceptao de dados levou ao surgimento de cdigos, de modo que apenas quem
escrevia e o destinatrio legtimo poderiam entender o contedo transmitido. A
criptografia, surgiu assim, como um conjunto de tcnicas que quando aplicadas,
conferiam segurana ao transporte das mensagens.
Com a globalizao e a internet, o acesso s informaes foi disseminado por
todo o mundo. Impedir a difuso de certos dados, passou a ser o enfoque de entidades
pblicas e privadas, visando a proteo de seus sistemas e suas estratgias como um todo.
Chaves e algoritmos tm se tornado cada vez mais complexos e em contrapartida,
os mtodos para a quebra deles tem evoludo de maneira cada vez mais acelerada. O
desenvolvimento de um cdigo pode ser visto como uma luta evolutiva, assim que ele
decifrado ou evolui, ou extinto (SINGH, 2007). A batalha intelectual entre encriptadores
e decifradores tem se arrastado por toda a histria e ainda se prolongar por muito tempo,
sendo ela a principal motivao para o estudo de mtodos cada vez mais avanados para
encriptar e decriptar mensagens.

2.1.1.2.

HISTRICO

Embora atualmente a criptografia tenha grande atuao no meio civil, protegendo


dados pessoais, esta evoluiu principalmente no meio militar. A necessidade que os
exrcitos tm ao mesmo tempo de manter o sigilo de suas mensagens e de descobrir as
estratgias do inimigo trouxe vrios matemticos s linhas de batalha.
Em Guerras de Glia de Jlio Csar, Csar descreve que utilizou uma cifra de
substituio (neste caso cifra de Csar) para mandar uma mensagem para Ccero, que
estava cercado e prestes a se render.

Muitas estratgias s foram possveis devido criptografia, mas em contrapartida,


uma cifra fraca pode chegar a ser pior que a falta de uma. No Sculo XV, Maria, rainha
da Esccia, acreditando que tinha uma comunicao segura com Babigton, escreveu
explicitamente sobre suas intenes de matar Elizabeth, rainha da Inglaterra, acreditando
que sua comunicao era segura. Walsingham, por sua vez, no apenas decifrou as
mensagens, como as falsificou para conseguir informaes sobre os cmplices (SINGH,
2007).
Esse trata-se de um marco na criptoanlise, cincia que permite decifrar uma
mensagem sem o conhecimento de sua chave, dando-lhe pela primeira vez grande
relevncia. Os primeiros relatos de quebra surgiram com os rabes na descoberta de um
mtodo para decifrar a substituio monoalfabtica, por volta do sculo X.
A criptografia Alem merece destaque. Durante a Primeira Guerra Mundial, o
rdio era uma inveno recente e todos os lados estavam vidos para explorar seu poder,
mas no havia maneira certa de como garantir a segurana. Os alemes ento, um pouco
antes da grande Ofensiva Alem (21 de maro de 1918), introduziram a cifra ADFGVX,
uma mistura complexa de substituio e transposio. Os aliados, porm, conseguiram
decifrar uma mensagem. Os alemes perderam assim seu elemento surpresa e foram
obrigados a recuar.
A criptografia evoluiu e foram desenvolvidas mquinas de cifragem. Um inventor
alemo, Arthur Scherbius, com o objetivo de substituir os sistemas de criptografia
inadequados empregados na Primeira Guerra, criou uma mquina criptogrfica chamada
Enigma. Em 1925 Scherbius comeou uma produo em massa das mquinas para o
exrcito alemo (SINGH, 2007).
Nas duas dcadas seguintes, os alemes compraram 30 mil mquinas Enigma e a
inveno se tornou o sistema mais seguro de criptografia do mundo, e por um momento
parecia que o Enigma desempenharia um papel vital na vitria nazista, mas ao ser
decifrado acabou colaborando com a queda precoce de Hitler.
Os criptoanalistas aliados trabalhavam dia e noite tentando dominar as cifras
germnicas; Rejewski, um criptoanalista polons at conseguiu quebrar uma verso
inicial do Enigma, atravs de uma adaptao capaz de verificar cada um dos ajustes at
encontrar um correspondente (os nazistas mudavam a chave diariamente). Mas as
habilidades de Rejewski acabaram quando os alemes aumentaram a segurana do
enigma e o nmero de chaves possvel aumentou para 159.000.000.000.000.000.000. A

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.

SOBRE O ALGORITMO RSA

Dentre as diversas tcnicas de criptografias ainda empregadas na atualidade,


mantm-se em destaque a empregada no chamado Algoritmo RSA, cujo foco desse
relatrio ser atribudo.
O algoritmo RSA assim chamado por ter sido criado por 3 professores do
Instituto de Tecnologia de Massachussets (MIT), Ronald Rivest, Adi Shamir e Leonard
Adleman. Ele conhecido por ser, atualmente, um dos mtodos mais seguros e eficientes
de codificao que se utiliza da implementao de chaves assimtricas e baseado na
Teoria dos Nmeros.
Ao utilizar duas chaves, uma pblica e uma privada, o RSA possui a capacidade
de atuar diretamente na internet, como no envio de e-mails e compras on-line. Por mais
que uma das chaves seja exposta ao pblico no intento de codificar as mensagens
desejadas, a secreta necessria para a decodificao, mantendo assim a segurana da
mensagem.
Alm disso, o RSA caracterizado principalmente pela utilizao de nmeros
primos muito grandes na criao das chaves, o que acaba por tornar a decifrao da chave
privada invivel se forem empregados algoritmos convencionais de fatorao.

2.1.2.

CONCEITOS E ANLISES TERICAS

2.1.2.1.

CRIPTOGRAFIA MODERNA

A criptografia tem por base nmeros inteiros, enquanto o computador utiliza


nmeros binrios. Para que a converso entre os sistemas seja vivel, foi desenvolvido o
American Standard Code for Information Interchange, ou, simplesmente, tabela ASCII,
empregada em computadores pessoais desde a dcada de 60.
A tabela original trabalhava apenas com 7 bits, suportando apenas a lngua inglesa.
Para que desse suporte para todos os idiomas, foi expandida para 8 bits. Hoje, empregase a chamada ASCII ESTENDIDA, englobando 256 caracteres, entre o alfabeto latino
minsculo e maisculo, acentos, pontuaes e outros smbolos.
A criptografia moderna dividida em duas vertentes, a de chaves simtricas e de
chaves assimtricas. No primeiro tipo, um determinado algoritmo utiliza-se de uma chave
para converter as informaes recebidas em um conjunto de bits aparentemente
aleatrios; o mesmo algoritmo utiliza-se da chave para decriptar a mensagem. A
necessidade de uma mesma chave para encriptar ou decriptar uma informao, faz com
que a demanda de proteo dessa cresa, atrelando a esse tipo de criptografia
caractersticas particulares.
J no caso da chave assimtrica, distinguem-se duas chaves, uma para a
encriptao, a chamada chave pblica, e a outra para a decifrao da mensagem, chamada
chave privada; como pode ser deduzido a partir de seus nomes, a primeira de domnio
ostensivo, enquanto a segunda deve ser mantida sob sigilo. O sistema assimtrico tende
a ser mais lento, uma vez que engloba clculos extensos e problemas matemticos sem
soluo computacional otimizada a no simetria entre as chaves, faz com que o processo
de quebra seja mais lento e exija maior esforo computacional, o que agravado devido
aos algoritmos utilizados, que costumam envolver problemas matemticos que possuem
limitao para soluo com auxlio do computador.
O Algoritmo RSA foi o primeiro algoritmo assimtrico mundialmente empregado
como padro, sendo utilizado at os dias atuais, inclusive no meio computacional.

2.1.2.2.

O ALGORITMO RSA

2.1.2.2.1.

EMBASAMENTO MATEMTICO

2.1.2.2.1.1. FUNO PHI DE EULER


A funo (), chamada Phi de Euler, denota o nmero de inteiros positivos que
no excedem e que so primos com . Para o clculo de (), temos:
Teorema: Se o inteiro > tem a fatorao em primos dada por:

= 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)

2.1.2.2.1.2. O ALGORITMO ESTENDIDO DE EUCLIDES


Considere o problema de se calcular e na equao:
+ = (, )
O Algoritmo Estendido Euclidiano se prope a resolver tal questo.
Seja > , podemos escrever:
= 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

Onde = , o (, ) e os nmeros e , com = , , , , so


inteiros a determinar.
Para determinar valores de e , supondo que todos os valores anteriores estejam
preenchidos, pode-se escrever com base nas equaes acima apresentadas:
= 2 1
Mas,
2 = 2 + 2
1 = 1 + 1
Logo:
= (2 1 ) + (2 1 )
E assim:
= 2 1

(2)

= 2 1

(3)

Ao final, tem-se que:


1 = 1 + 1 (, ) = 1 + 1
Onde e so definidos por iteraes contnuas das equaes (1) e (2),
resolvendo o nosso problema inicial.
O problema inicial pode ser reescrito, sem perda de generalidade, da seguinte forma:
(, )
Nos casos para a criptografia RSA, em especial, (, ) = , e objetiva-se
encontrar o valor de , como ser descrito nos tpicos seguintes.

2.1.2.2.2.

OBTENO DAS CHAVES

Para gerar-se as chaves deve-se seguir uma sequncia de passos:


1) Deve-se escolher dois nmeros primos e , dando preferncia para aqueles cuja
ordem muito grande;
2) Realiza-se a operao = ;
3) Calcula-se a funo de Euler, que expe a quantidade de co-primos menores que
n: () = ( 1)( 1), para e primos;
4) Escolhe-se um valor inteiro o qual 1 < < () e ((); ) = 1; e

5) Calcula-se de tal forma que ();


Dessa forma, tem-se a chave pblica (, ) e a privada (, , ) e, a partir delas,
pode-se iniciar o processo de cifragem e decifragem.

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:

Onde a mensagem encriptada.

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).

2.1.2.2.4.1. FATORANDO NMEROS PRIMOS MUITO GRANDES

Um exemplo de ataque de fora bruta ao RSA uma fatorao do mdulo n, a fim


de chegar ao expoente de decriptografia. Essa ainda uma ameaa distante da realidade,
pois, mesmo com a melhora dos algoritmos de fatorao, a tecnologia atual ainda tem
srias dificuldades em fatorar n, se os primos forem corretamente escolhidos.

Em 1997, Martin Gardner publicou na Scientific American que seriam necessrios 40


trilhes de anos para fatorar n, fazendo uso do poder computacional da poca, porm a
tarefa levou apenas 30 anos para ser realizada (PAAR, 2009).
Uma discusso surgiu sobre qual seria o tamanho seguro para o mdulo n usado no
RSA. Acredita-se que padres de 1024 bits possam ser fatorados em 10 a 15 anos ou at
mais rpido por agncias de inteligncia. Hoje, so aconselhados padres de 2048 ou
4096 bits (PAAR, 2009).

2.1.2.2.4.2. PEQUENOS EXPOENTES

Com o objetivo de reduzir o tempo de decriptografia, pode-se tentar usar um valor


pequeno de d para a chave privada e de e para a chave pblica. A especificao do
algoritmo sugere valores aleatrios. Quanto mais difcil de se encontrar as chaves melhor,
e enquanto a descoberta do e geralmente no leva a quebra total do RSA, a menos que a
mensagem seja pequena e o ataque de Coppersmith utilizado, se o d for descoberto a
mensagem estar decifrada.
Sugere-se um valor de e = 216 + 1 = 65537, para tornar o sistema mais seguro
(WEINER, 1990).

2.1.2.2.4.3. EXPOSIO PARCIAL DA CHAVE PRIVADA

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.4.4. ATAQUES TEMPORAIS

Estes ataques no so decorrentes de falhas ou artifcios matemticos, mas sim de


vulnerabilidades na implementao computacional.
Se o tempo de decriptao for precisamente medido, a chave privada d pode ser
deduzida rapidamente, mesmo que a chave esteja devidamente armazenada (KOCHER,
2006).

2.1.2.2.5.

APLICAES

Devido incapacidade de fatorar primos muito grandes com os sistemas


computacionais atuais, o algoritmo RSA um dos mais usados, principalmente em dados
enviados pela internet.
O algoritmo o nico capaz de implementar assinatura digital e troca de chaves
(dentre os mais comuns). Ele vem sendo utilizado em vrias aplicaes de segurana
envolvendo camadas altas, certificados e assinaturas digitais, S/MIME e PGP, camadas
de transporte, TLS, camada de rede, IPSec, e at nas camadas de segurana mais
inferiores, como o protocolo SSL.

2.1.2.2.5.1. ASSINATURA DIGITAL

Uma assinatura digital tem que verificar as propriedades:

As assinaturas so nicas para cada usurio e no podem ser forjadas;

O emissor no pode negar o envio de uma mensagem que contenha sua assinatura;
e,

O receptor no pode modificar uma assinatura nem retir-la e coloc-la em outra


mensagem.

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).

2.1.2.2.5.2. CERTIFICADO DIGITAL

Ao receber uma chave pblica deve-se certificar se a chave seja realmente


proveniente da pessoa certa. Sem uma garantia, um intruso pode convencer os
interlocutores de que chaves pblicas falsas pertencem a eles e se fazer passar por ambos.
O intruso pode, ento, decifrar todas as mensagens, cifr-las novamente, ou ainda
substitu-las por outras mensagens.
Os certificados de chave pblica so uma garantia para evitar esse ataque e consistem
em chaves pblicas assinadas. Assim, um certificado digital um documento eletrnico,

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.3. S/MIME E PGP

O S/MIME (Security Multipurpose Mail Extension) e o PGP (Pretty Good Privacy)


so as duas aplicaes mais utilizadas em implementaes de segurana em correio
eletrnico.
O S/MIME baseia-se no standart MIME, cujo objetivo permitir incluir na
mensagem eletrnica anexos em ASCII, sendo possvel acrescentar anexos de todos os
tipos aos correios eletrnicos.
J o PGP, um software que assegura privacidade criptogrfica e autenticao para
comunicao de dados. Ele segue um formato OpenPGP, que utiliza um grande nmero
de algoritmos, dentre eles RSA (GARFINKEL, 1991).

2.1.2.2.5.4. SSL/TLS

O SSL (Secure Socket Locker) uma camada de protocolo de rede, cuja


responsabilidade gerenciar um canal de comunicao seguro entre o cliente e o servidor.
Foi desenvolvido pela Netscape Communications Corporation e atualmente
implementado na maioria dos navegadores. A palavra-chave https://, por exemplo,
significa http + SSL, sites que apresentam essa palavra-chave, ento, possuem uma
camada de segurana (BRAGHETTO, 2012).
J o TLS (Transport Layer Security), uma verso mais recente e segue os mesmos
moldes do SSL, protegendo transferncia de dados. Ambas as camadas utilizam o RSA
na troca de chaves.

2.1.2.2.5.5. IPSEC

O IPSec um conjunto de padres utilizados para garantir uma comunicao


segura entre dois ou mais hosts, mesmo que as informaes estejam sendo enviadas
atravs de um meio no seguro, como a Internet (NIST, ERICSSON, 2011).

Um exemplo o VPN (Rede Privada Virtual), um tnel fechado entre um


computador e um servidor, onde ambos tm uma chave que criptografa todos os dados
que passem por este tnel.

2.2.

JAVA

2.2.1.

INTRODUO

O Java foi projetado para permitir o desenvolvimento de aplicaes portteis de


alto desempenho para uma ampla variedade de plataformas de computao. Resolvia,
assim, o problema do desenvolvimento de novos cdigos devido mudana do sistema
operacional utilizado. Disponibilizando aplicaes em ambientes heterogneos,
possvel fornecer mais servios e aumentar a produtividade, comunicao e colaborao
do usurio, reduzindo o custo de propriedade das aplicaes da empresa e do consumidor.

2.2.1.1.

BREVE HISTRICO DA LINGUAGEM

Na dcada de 90, muitos eram os problemas enfrentados pelos programadores.


Dentre eles, destacavam-se o uso de ponteiros, a falta de memria, o custo financeiro e a
necessidade de ter que reescrever parte do cdigo ao mudar de sistema operacional. A
linguagem Java surgiu para tentar sanar esses problemas, frequentes em outras
linguagens. Veio, inicialmente, com o objetivo principal de evitar a reescrita de cdigos,
direcionados para os diferentes sistemas operacionais; queria desenvolver um cdigo
universal e assim o fez. A ideia, porm, no foi bem vista no mercado, e foi logo
esquecida, sendo ressuscitada ainda na mesma dcada, com o advento da internet. Assim,
seu lanamento posterior foi focado no uso de clientes web, para rodar pequenas
aplicaes, mas acabou ganhando destaque no lado do servidor.
De maneira mais especfica, em 1991, James Gosling, Patrick Naughton, Mike
Sheridan juntos com dois fundadores da Sun, Andy Bechtolsheim e Bill Joy formaram o
Green Team, um projeto com o objetivo de desenvolver um sistema que os permitisse
construir uma rede distribuda e heterognea de dispositivos eletrnicos voltados para o
consumidor final, todos se comunicando entre si.
O desafio era criar um ambiente de software que fosse interessante para o mercado
consumidor e ao mesmo tempo atraente para desenvolvedores de software. Gosling,
responsvel pela linguagem, resolveu criar uma nova que tivesse uma estrutura similar a

C/C++, que fosse segura (sem ponteiros), confivel, multiplataforma e interpretada


(convertida em um formato intermedirio, os bytecodes). Chamada anteriormente de
Greentalk e Oak, teve seu nome alterado para Java por questes de marketing.
Por volta de 1994, com a oportunidade representada pela Internet e pela Web, o
time resolveu disponibilizar o cdigo fonte do interpretador Oak na internet e criaram um
navegador, chamado WebRunner, reescreveram o compilador em Oak e se prepararam
para lanar o projeto.
Em 1995, durante o evento Sun World, John Gage anunciou a tecnologia Java
para o mundo. A web, pela primeira vez, era capaz de executar aplicaes.
Quando a verso 1.0 foi anunciada, em 1996, 15 empresas j haviam licenciado a
tecnologia Java, incluindo a IBM, Silicon Graphics, Netscape, Oracle e Toshiba. At a
Microsoft demonstrou interesse de incorporar o Java em seu Browser.
Enquanto Java 1.1 incorporou diversas funcionalidades como o JavaBeans, JDBC
e o os compiladores Just In Time (JIT), o Java 1.2, ou simplesmente Java 2 evoluiu de
uma linguagem de programao para uma grande famlia de tecnologias, todas baseadas
na linguagem Java e no conceito de multiplataformas.
O Java 2 foi dividido em 3 verses. A J2SE, Standart Edition, base da plataforma,
a J2EE, Enterprise Edition, voltada para aplicaes corporativas e a J2ME, Micro Edition,
uma verso reduzida, para pequenos aparelhos. Empresas como IBM, BEA e Oracle
lanaram seus servidores de aplicao Java EE (O 2 saiu do nome em 2006) e com o
surgimento de servidores de aplicao Open Source, a tecnologia se tornou cada vez mais
popular.

2.2.2.

CONCEITOS

2.2.2.1.

JVM JAVA VIRTUAL MACHINE

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

garante que todas as implementaes so interoperveis. Uma implementao JVM um


programa que atinge todas as requisies da especificao JVM. Uma instncia da JVM
um processo que executa um programa compilado em ByteCode.
Alm de interpretar cdigo, a JVM responsvel pela execuo de pilhas,
gerenciamento de memrias, threads e etc., ou seja, comporta-se como um computador
virtual.

2.2.2.2.

ORIENTAO A OBJETO

A linguagem Java um exemplos de linguagem orientada a objeto, e essa


caracterstica representa um grande diferencial para a linguagem.
A programao orientada a objeto trata-se de um paradigma de desenvolvimento de
software empregado em linguagens como C++ e Java. Diferencia-se da programao
estruturada a medida que viabiliza a reutilizao do cdigo e possibilita a escrita do
mesmo de modo muito mais prximo do pensamento cotidiano.
Define-se, pois, objetos, no mbito da programao, de maneira muito semelhante
ao que feito no cotidiano. Objetos so entidades, com caractersticas determinadas, que
os diferenciam entre si. Em programao, consideram-se classes de objetos, as quais
descrevem atributos gerais que todos os objetos daquele tipo devem possuir. A partir da
diferenciao desses atributos, so criados objetos distintos. Podem ser desenvolvidas
ainda, operaes prprias para cada classe que se cria, que so como comportamentos
particulares da classe. Essas operaes so denominadas mtodos. Um mtodo uma
implementao especfica de uma operao para uma determinada classe.
Define-se ainda herana, como um mecanismo existente no paradigma orientado
a objetos que viabiliza a reutilizao dos atributos (estrutura) e dos mtodos
(comportamentos) de uma classe para a definio de uma nova, criando uma ordem
hierrquica entre superclasses e subclasses. H mltiplas possibilidades de operaes com
herana, envolvendo, por exemplo, a herana mltipla, em que uma subclasse definida
com base em mais de uma superclasse.
No ambiente de programao orientada a objetos, utiliza-se ainda o conceito de
polimorfismo. Segundo tal conceito, a mesma operao, pode se comportar de maneira
diferente em classes diferentes. O polimorfismo empregado de maneira fortemente
atrelada herana. Ele viabiliza que operaes empregadas em superclasses tambm o
sejam em subclasses, de maneira alterada. Assim, a linguagem de programao deve ser

capaz de selecionar o mtodo correto com base no nome da operao - as operaes so


diferenciadas entre as superclasses e as subclasses; para isso usam-se funes virtuais,
que funcionam como redefinies de funes previamente estabelecidas para as
superclasses.
Como base nesses cinco conceitos fundamentais (classes, atributos, mtodos,
herana e polimorfismo), so definidas as principais diretrizes da programao orientada
a objetos.

2.2.3.

VANTAGENS E DESVANTAGENS DO JAVA

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

Os programas escritos em Java liberam automaticamente a memria alocada e no


utilizada, pois fazem uso do Garbage Collector que, de tempos em tempos, percorre a
memria a procura de objetos que no possuem mais uma referncia vlida. Esses objetos
so considerados como lixo e so coletados para liberao da memria ocupada. Por
ser um processo automtico que pode ser forado a acontecer, o Garbage Collector
otimiza, e muito, a memria consumida do programa.

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.

COMPILAO JIT (JUST-IN-TIME)

Tambm conhecida por traduo dinmica, just-in-time combina a velocidade do


cdigo compilado flexibilidade da interpretao e permite algumas otimizaes que no
so possveis em compilaes estticas.
A mquina virtual responsvel pela execuo dos bytecodes resultantes da
compilao do programa fonte realiza a traduo desse bytecodes enquanto o executa.
Cada trecho do cdigo traduzido no instante que est para ser executado pela primeira
vez.
Esse mecanismo apresenta um desempenho superior ao processo clssico de
interpretao, uma vez que o cdigo de mquina resultante do JIT armazenado na
memria, garantindo que o trecho de cdigo no seja recompilado ou reinterpretado.

2.2.3.1.5.

CUSTO E SUPORTE

O custo do Java praticamente zero, os editores e ambientes de produo so


gratuitos (NetBeans, Eclipse, Jcreator, entre outros), assim como os servidores de
aplicao (TomCat, Jboss, Jetty e outros). O Java padronizado e mantido pela JCP (Java
Community Process), que recebe contribuio de diversas empresas: Oracle, IBM,
Novell, Xerox etc.
Alm disso, por ser a comunidade mais extensa, a tecnologia Java tem um bom
suporte. Existem inmeros JUGs (Java User Groups), que promovem eventos,
disponibilizam material, artigos, revistas e frum de discusses.

2.2.3.2.

DESVANTAGENS

2.2.3.2.1.

BAIXO DESEMPENHO NAS VARIADAS PLATAFORMAS

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.

ALGORITMO RSA EM JAVA

Com base no algoritmo de encriptao anteriormente apresentado, e utilizando as


bibliotecas e funes convenientes da linguagem Java junto com o programa Eclipse, foi
desenvolvido um cdigo para a encriptao de mensagens (APNDICE A).
Tomando como base a velocidade de processamento do algoritmo RSA,
anteriormente comentada, no recomendada a utilizao do algoritmo para a encriptao
de mensagens completas, pois o procedimento pode ser extremamente lento; pode-se
utilizar o mtodo, porm para encriptar a chave de um mtodo mais simples que pode ser
empregado na mensagem. Ou seja, a melhor maneira de utilizar o RSA criar um
envelope digital. De qualquer forma, o algoritmo desenvolvido foi pensado de modo
simples visando permitir a encriptao e decriptao de arquivos um pouco maiores, sem
grandes atrasos no sistema.

2.2.3.3.1.

RESULTADOS

O cdico descrito no APNDICE A foi executado e considerando que o texto do


arquivo Teste.txt era Teste 27, torcendo para que funcione!, obteve-se a seguinte
resposta:

Mensagem a ser criptografada: Teste 27, torcendo para que funcione!


Converso

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)

O tempo de construo foi considerado bom, e a encriptao e decriptao


ocorreram sem maiores problemas, uma vez que a mensagem utilizada era pequena, no
sendo identificados os problemas previstos, na teoria, para compilao do algoritmo.

2.3.

ANDROID

2.3.1.

INTRODUO

O sistema operacional mvel Android o mais utilizado em todo o mundo


segundo pesquisas da StatCounter Global Stats (2015), est presente no apenas em
smartphones, como tambm em tablets, notebooks, cmeras, SmartTVs, videogames e
muitos outros dispositivos. O Android revolucionou totalmente o conceito de telefone e
tudo isso nos ltimos 7 anos, quando o primeiro dispositivo foi lanado (WILSON, 2013).

2.3.1.1.

BREVE HISTRICO DA PLATAFORMA

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

Os aplicativos Android so escritos na linguagem Java, o Android SDK compila o


cdigo para APK: um Android Package, com extenso .apk. Ele contm todo o contedo
e o arquivo que os dispositivos Android usam para instalar o aplicativo.
O sistema operacional Android um sistema multiusurio Linux e cada aplicativo
um usurio diferente com um ID designado pelo sistema. O sistema, ento, estabelece
permisses para todos os aquivos no app e apenas o ID designado pode acess-los.

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

Cada componente do aplicativo funciona como um ponto diferente de entrada do


sistema; nem todos esses pontos, porm, so entradas para o usurio, sendo alguns
interdependentes e tendo cada um uma funo especfica. So 4 tipos de componentes,
cada um com um propsito e ciclo de vida diferente.

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.

2.3.2.1.1.1. CICLO DE VIDA DE UMA 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.

Figura 1 Ciclo de vida de uma Activity.

Fonte: Elaborada pelo autor, baseada em figura disponvel em


https://developer.android.com/intl/pt-br/guide/components/activities.html

2.3.2.1.2.

SERVICES

Um service o componente que roda em background para realizar operaes de


longa durao ou trabalhar em processos remotos. Eles so trechos de cdigo geralmente
em segundo plano e sem interface usurio. Um exemplo uma msica tocando enquanto
o usurio utiliza um aplicativo diferente.

Um service implementado como a subclasse Service e o seu ciclo de vida parecido


com o de uma activity. As diferenas so apenas pelo fato de um service no ter
representao visual. onResume( ), onPause( ) e onStop( ) no so ento necessrios.
Uma nova chamada, onBind( ), cria o servio se ele no existir e chama
onCreate( ), mas no onStart( ). comum que services tenham vrios clientes conectados
a eles.
Figura 2 Ciclo de vida de um Service

Fonte: Elaborada pelo autor, baseada em figura disponvel em


https://developer.android.com/intl/pt-br/guide/components/services.html

2.3.2.1.3.

PROVEDORES DE CONTEDO

Um provedor de contedo gerencia uma aplicao de dados comxpartilhados. Os


dados podem ser armazenados no sistema de arquivos, uma SQLite database, na internet,
ou em outro local de armazenamento que seu aplicativo possa acessar.

Atravs do provedor de contedo, outros aplicativos podem acessar e at mesmo


modificar os dados.
Um provedor de contedo implementado com a subclasse ContentProvider e
precisa implementar uma certa ordem de APIs que possibilitam outros aplicativos realizar
transaes.

2.3.2.1.4.

RECEPTORES DE BROADCAST

Um receptor de Broadcast um componente que responde solicitao de servio


de outras aplicaes. Muitos broadcasts se originam do sistema. Por exemplo um anncio
broadcast que a bateria est baixa ou que a tela se apagou. Aplicativos tambm podem
inici-los, para deixar outros aplicativos saberem que algum dado foi feito download e
est pronto para uso, por exemplo.
Apesar de receptores de Broadcast no apresentarem entrada a uma interface
usurio, eles podem criar uma notificao na barra de status para alertar que algum evento
acorreu.
Um receptor de Broadcast implementado como uma subclasse BroadcastReceiver
e cada um entregue como um intent.

2.3.2.2.

ATIVANDO COMPONENTES

As activities, os services e os receptores de broadcast so ativados por mensagens


assncronas chamadas intents. Eles vinculam componentes individuais no tempo de
execuo, mesmo se o componente pertena a outro aplicativo.
A mensagem criada junto com um objeto Intent, que define a mensagem para ativar
ou um componente especfico ou um especfico tipo de componente.
Para activities e services, um intent define a ao a ser executada e pode especificar
a URI que o dado pode agir. J para os receptores de broadcast, o intent simplesmente
define o anncio sendo transmitido.
O provedor de contedo no ativado por intents, ele ativado quando atingido por
um requerimento do ContentResolver. O content resolver maneja todas as transaes
diretas com os provedores de contedo para que o componente que est fazendo as
transaes no precise manejar.

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

Os principais componentes de uma aplicao so ativados por Intents, que so um


conjunto de informaes descrevendo uma certa ao desde o momento em que a ao
deve ocorrer at a categoria de componente que a deve executar. O Android localiza um
componente apropriado para o intent, inicia uma nova instncia do componente se
necessrio e o passa o objeto do intent.
Os componentes demostram suas capacidades atravs de tais filtros. O sistema do
Android deve saber qual intent um componente pode suportar antes de iniciar o
componente. E essas especificaes, filtros, se encontram no manifesto como elementos
<intent-filter>. Um componente pode ter um nmero qualquer de filtros contanto que
cada um descreva uma caracterstica diferente.

2.3.2.3.2.

PERMISSES

Uma permisso uma restrio de acesso a parte do cdigo ou dados no aparelho.


A limitao imposta para proteger dados cruciais e cdigo que poderia ser modificada
para distorcer ou danificar a experincia do usurio.
Cada permisso identificada por um rtulo nico. Comumente, o rtulo indica a
ao que restrita. Como por exemplo:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER

Se uma aplicao necessita de acesso a um atributo protegido por uma permisso,


ele deve declarar que requer daquela permisso com um elemento de <uses-permission>
no manifesto. Ento, quando o aplicativo est instalado no aparelho, o instalador
determina se deve ou no garantir a permisso requisitada ao checar com as autoridades
que assinaram os certificados do aplicativo ou, em alguns casos, perguntando ao usurio.

3.

APLICATIVO

A portabilidade do algoritmo RSA de Java para Android foi feita utilizando o


Android Studio.

3.1.

PROBLEMAS ENCONTRADOS

O desenvolvimento do aplicativo baseou-se na importao do cdigo Java


previamente desenvolvido para Desktop. Ocorreu, porm, que no cdigo em Java, o
algoritmo estava em uma classe nica e, portanto, o processo de criptografia se dava
segundo as etapas descritas pela figura 3.
Figura 3 Processo de criptografia antigo

Como as funes que encriptavam e decriptavam estavam dentro da mesma classe,


a funo que decriptava conseguia utilizar o prprio vetor de bytes gerado pela que
encriptava, sem acessar o arquivo, e assim executar seu processo. Para que o cdigo fosse
portado para Android, devido diviso das Activities, foi necessria a partio do cdigo
em java e com isso, a funo que decriptava deveria receber a mensagem do arquivo.
A funo inicialmente criada para encriptao transformava o vetor (bytes)
encriptado em uma String, e s ento registrava no arquivo; isso inviabilizava a
transformao direta da String para o vetor de Bytes original que seria utilizado pela
funo que decriptava. O problema foi resolvido salvando no arquivo diretamente o vetor
de bytes e alterando sua forma de leitura (Figura 4). Foram gerados novos cdigos em
Java Desktop e, em seguida, as funes foram implementadas no aplicativo via Android
Studio.
Figura 4 Processo de criptografia novo

3.2.

VISO GERAL DO APLICATIVO

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.

CRIPTOGRAFAR GERANDO AS CHAVES

Figura 6.1a

Figura 6.1c

Figura 6.1b

Figura 6.1d

Figura 6.1c

Figura 6.1e

Figura 6.1f

Nesse caminho o aplicativo criptografa a mensagem gerando a chave pblica


(N, e) e a privada (p, q, d). Primeiro seleciona-se o boto CRIPTOGRAFAR (Figura
6.1a), depois o boto Gerar Chaves (Figura 6.1b), seleciona-se o tamanho da chave em
bits dentre as opes: 2048, 1024, 512, 256, 128, 64, 32, 16 e 8 (Figura 6.1c).
O usurio tem agora duas opes de entrada, ou ele digita a mensagem e pressiona
SEND ou digita o nome do arquivo, pressiona CARREGAR (a mensagem a ser
criptografada aparecer na tela) e depois pressiona SEND (Figura 6.1d).
Aparecer na tela, ento, a chave pblica e a mensagem criptografada. O usurio,
agora, tem a opo de salvar a mensagem pressionando SIM ou de voltar a tela inicial
pressionando NO (Figura 6.1e).
Caso pressionado o boto SIM, uma nova tela aparecer, onde o usurio deve
digitar o nome do arquivo com o formato, ex.: .txt (Figura 6.1f). Ao pressionar o boto
SALVAR, o aplicativo volta tela inicial.
Trs arquivos tero, ento, sido salvos no root da memria interna do celular,
ChavePublica.txt, onde estar a chave pblica, nmeros N e e, DestruaMe.txt, onde estar
a chave privada, nmeros p, q e d e um arquivo com a mensagem criptografada, com
nome e extenso escolhidos pelo usurio (Figura 6.1g).

3.2.2.

CRIPTOGRAFAR COM CHAVE PBLICA

Figura 6.2a

Figura 6.2d

Figura 6.2b

Figura 6.2c

Figura 6.2e

J nesse caminho o aplicativo criptografa a mensagem a partir de uma chave


pblica (N, e) fornecida pelo usurio. Primeiro seleciona-se o boto CRIPTOGRAFAR
(Figura 6.2a), depois insere-se os nmeros N e e da chave pblica (Figura 6.2b).
O usurio tem, de novo, duas opes de entrada, ou ele digita a mensagem e
pressiona SEND ou digita o nome do arquivo, pressiona CARREGAR (a mensagem
a ser criptografada aparecer na tela) e depois pressiona SEND (Figura 6.2c).

Aparecer na tela, ento, a mensagem criptografada. O usurio, agora, tem a opo


de salvar a mensagem pressionando SIM ou de voltar a tela inicial pressionando NO
(Figura 6.2d).
Caso pressionado o boto SIM, uma nova tela aparecer, onde o usurio deve
digitar o nome do arquivo com o formato, ex.: .txt (Figura 6.2e). Ao pressionar o boto
SALVAR, o aplicativo volta tela inicial.
Nesse caminho, apenas a um arquivo ter sido salvo no root da memria interna
do celular, aquele da mensagem criptografada, com nome e extenso escolhidos pelo
usurio.

3.2.3.

DECRIPTOGRAFAR

Figura 6.3a

Figura 6.3b

Figura 6.3c

Figura 6.3d

No ltimo caminho o aplicativo decriptografa a mensagem. Primeiro seleciona-se


o boto DECRIPTOGRAFAR (Figura 6.3a), depois insere-se o nome do arquivo, com
formato, a ser decriptografado e pressiona-se CARREGAR. O vetor de bytes aparecer
na tela, o usurio insere, ento, a chave privada, os nmeros p, q e d e pressiona SEND
(Figura 6.3b).
Aparecer na tela, a mensagem decriptografada. O usurio, agora, tem a opo de
salvar a mensagem pressionando SIM ou de voltar a tela inicial pressionando NO
(Figura 6.3c).
Caso pressionado o boto SIM, uma nova tela aparecer, onde o usurio deve
digitar o nome do arquivo com o formato, ex.: .txt (Figura 6.3d). Ao pressionar o boto
SALVAR, o aplicativo volta tela inicial.
O arquivo com a mensagem decriptografada ter sido salvo no root da memria
interna do celular, com nome e extenso escolhidos pelo usurio.

4.

TRABALHOS FUTUROS

Embora tenha sido desenvolvido de maneira satisfatria e seja extremamente


funcional e fcil de ser utilizado, o aplicativo final possui pontos de melhoria aqui citados.
O primeiro problema a ser comentado a inexistncia da possibilidade de se
escolher o local onde os arquivos gerados sero salvos: embora se escolha o nome dos
arquivos, no possvel atravs do aplicativo escolher a pasta para onde o arquivo ser
enviado; ele sempre enviado para o diretrio geral da memria interna do smartphone.
Paralelamente, no h possibilidade de escolher um arquivo de uma pasta diferente do
diretrio geral citado. Tal restrio poderia ser resolvida implementando-se um sistema
de gerenciamento e busca de arquivos, que permitisse acessar as diversas pastas da
memria interna e externa do smartphone, e selecionar o arquivo a ser encriptado ou
decriptado diretamente de uma delas.
Alm disso, o processo pelo qual se registram as senhas privadas no o mais
seguro possvel. As senhas privadas precisam ser salvas de alguma forma, pois sem elas
no possvel descriptografar a mensagem, e assim no h funcionalidade para o envio
da mensagem, uma vez que ela dificilmente conseguir ser lida (dependendo do nmero
de bytes selecionado ser impossvel fatorar o produto de primos N da chave pblica).
Salvar a chave privada diretamente em um arquivo no smartphone, porm, no seguro.
Para que se resolvesse o problema, as senhas poderiam ser encriptadas antes de serem
salvas utilizando, para isso, uma chave privada fixa inerente ao aplicativo; o arquivo
gerado conteria, portanto, a chave privada criptografada segundo um padro que s seria
reconhecido pelo aplicativo desenvolvido. Assim, na hora de descriptografar mensagens
ou arquivos em geral, apenas o aplicativo desenvolvido conseguiria abrir o arquivo das
senhas, torn-las claras e emprega-las.
No layout do aplicativo h ainda a limitao de no poder ser possvel copiar os
valores que so mostrados na tela das chaves pblicas: ainda que elas sejam salvas em
um arquivo no prprio smartphone, poderia ser possvel copi-las manualmente, sendo
essa uma opo para o usurio.
Como previsto na teoria, a criptografia RSA no se demonstra eficiente para
arquivos grandes: o aplicativo no consegue encriptar arquivos com algumas centenas de
bytes sempre que chamado tem dificuldade em converter o arquivo no vetor de bytes,
que muito grande, e logo em seguida no consegue encript-lo. Embora essa seja uma
limitao do algoritmo RSA, e no um problema do cdigo implementado ou do

processador do smartphone utilizado para os testes, o funcionamento poderia ser


otimizado, aplicando um processo de criptografia mais simples que conseguisse encriptar
a mensagem, ainda que de maneira menos segura, e encriptando a chave dessa criptografia
com RSA, garantindo o sigilo, como sugere a teoria para contornar a lentido do RSA.

5.

CONCLUSO

fato que a Criptografia RSA amplamente utilizada na segurana de dados,


atualmente. O mtodo, embora simples, por se basear na limitao da capacidade dos
computadores de fatorar nmeros muito grandes, como os que formam a chave pblica
do mtodo, tem um fator de segurana alto.
O trabalho em questo cumpriu com todos os objetivos aos quais se propunha: os
estudos e as implementaes foram desenvolvidos, e o produto final, o aplicativo para
Android foi entregue de maneira satisfatria. Surpreendendo s expectativas, o aplicativo
desenvolvido possui interface e funcionalidades de fcil uso, tornando o processo de
criptografia e decriptografia de mensagens e arquivos atravs dele simples, mantendo o
nvel de segurana necessrio.
O estudo acerca do mtodo de Criptografia RSA foi de grande valia, e viabilizou
o contato, ainda que simples e restrito, dos alunos com rea da defesa ciberntica, rea de
crescimento constante e de grande necessidade de desenvolvimento de novos estudos e
tecnologias. Alm disso, a oportunidade de tornar os conhecimentos tericos obtidos
prticos demonstrou-se extremamente proveitosa, passando desde a implementao do
algoritmo elaborao de lgica matemtica e de programao necessria at o uso de
novas linguagens e ambientes de programao.
Acrescenta-se ainda a possibilidade vista de avano para os estudos na rea de
segurana de dados, tendo a pesquisa aberto um leque de opes para o desenvolvimento
de melhorias para o aplicativo desenvolvido e de novos produtos na rea de defesa. A
segurana das informaes um problema muito mais prximo do que se espera, e com
o estudo foi possvel notar que existem boas solues disponveis e de implementao
vivel para que se garanta esta e, principalmente, que h muito espao para
desenvolvimento de novos produtos e otimizao de antigas solues na rea.

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

http://developer.android.com/intl/pt-br/training/basics/firstapp/creatingproject.html, acessado em 25/10/2015.


ANDROID

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

http://developer.android.com/intl/pt-br/training/basics/firstapp/startingactivity.html, acessado em 26/10/2015.


ANDROID DEVELOPERS. Como usar o tema do Material.

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.

BRAGHETTO, Luis Fernando B, BARBOSA, Luis Alberto de Moraes, BRISQUI,


Marcelo Lotierso, SILVA, Sirlei Cristina. Criptografia Assimtrica e Assinatura
Digital

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-

random/26355. Acessado em 04 de setembro de 2015.


FERRAZ J., VINICIUS M., Utilizando classes das bibliotecas Java na aplicao de
conceitos de segurana. Universidade Federal de Pernambuco. Disponvel em
http://www.cin.ufpe.br/~ruy/crypto/2005-1/Projeto%20de%20Criptografia%20%20Relatorio%20-%20Assinatura%20Digital.pdf. Acessado em 15 de agosto de
2015.
GARFINKEL, Simson. PGP: Pretty Good Privacy. OReilly & Associates, 1991.

GASPAROTTO, Henrique Machado, Os 4 pilares da Programao Orientada a


Objetos.

Disponvel

em

http://www.devmedia.com.br/os-4-pilares-da-

programacao-orientada-a-objetos/9264 , acessado em 20/05/2015.


GUJ. Criptografia RSA em JAVA. Disponvel em http://www.guj.com.br/java/56444criptografia-rsa-em-java. Acessado em 5 de agosto de 2015.
GUJ. Mtodo readLine da classe java.io.DatalnputStream. Disponvel em
http://www.guj.com.br/java/193-metodo-readline-da-classe-javaiodatainputstream.
Acessado em 15 de agosto de 2015.
JAVA

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-

Strings-Bytes-de-arquivos.html. Acessado em 15 de agosto de 2015.


JAVA PROGRESSIVO. static - Usando membros estticos em Java. Disponvel em
http://www.javaprogressivo.net/2012/10/static-Usando-membros-estaticos-emJava.html. Acessado em 05 de agosto de 2015.
JAVA.

Obtenha

Informaes

sobre

Tecnologia

Java.

Disponvel

em

https://www.java.com/pt_BR/about/, acessado em 18/05/2015.


JAVAFREE.

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

http://www.androidpit.com.br/historia-do-android, acessado em 27/08/2015.


MEYER,

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-

usr.inf.ufsm.br/~pozzer/disciplinas/cg_5_oo_c++.pdf, acessado em 20/05/2015


REVIVER

SOFT.

.KEY

Extenso

de

arquivo.

Disponvel

em

http://www.reviversoft.com/pt/file-extensions/key. Acessado em 15 de julho de


2015.
RICARTE, Ivan Luiz Marques. Introduo a Orientao a Objetos, Definies.
Disponvel

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/.

Acessado em 02 de setembro de 2015.


TI

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.

TUTORIALSPOINT. Java.math.BigInteger.modPow() Method. Disponvel em


http://www.tutorialspoint.com/java/math/biginteger_modpow.htm. Acessado em 15
de agosto de 2015.
TUTORIALSPOINT. Java.math.BigInteger.probablePrime() Method. Disponvel em
http://www.tutorialspoint.com/java/math/biginteger_probableprime.htm. Acessado
em 04 de setembro de 2015.
UDACITY, Developing Android Apps Android Fundamentals. Curso do Google,
disponvel em https://www.udacity.com/course/developing-android-apps--ud853,
acessado em 02/10/2015.
WEINER, Michael J.. Cryptanalysis of short RSA secret exponents. IEEE
Transactions on information theory 36:553-558, 1990.
WILSON, Mark. T-Mobile g1: Full Details of th HTC Dream Android Phone (23 de
setembro de 2008). Disponvel em http://gizmodo.com/5053264/t-mobile-g1-fulldetails-of-the-htc-dream-android-phone, acessado em 19/11/2015.
ZARELLI, Guilherme Biff. Android Opes de Armazenamento (persistncia de
dados).

Disponvel

em

http://helpdev.com.br/2012/08/03/android-opcoes-de-

armazenamento/, acessado em 27/10/2015.

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.*;

public class RSA


{

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

* para codificar ou decodificar uma mensagem ou arquivo. Quanto maior o


* "Bit Lenght", mais difcil ser para quebrar a chave.
*/
private int blocksize = 256;
private Random r;

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

* Como e primo, precisamos garantir apenas que o mdc(e,phi)=1. O lao


* abaixo verifica essa condio, e a desigualdade entre e e phi
* supracitada; se uma delas no for atendida, ele incrementa e de 1 e
* repete o teste, at que encontremos um e vlido. Como e primo
* gerado aleatoriamente com metade do comprimento em bits de phi, a
* probabilidade do lao rodar mais que uma vez muito baixa.
*/
while (phi.gcd(e).compareTo(BigInteger.ONE) > 0 && e.compareTo(phi) <
0)
{
e.add(BigInteger.ONE);
}
/**
* A funo modInverse calcula o inverso de um nmero num determinado
mdulo
* Ou seja, se a=b.modInverse(c) ento a=b^(-1) no mdulo c, ou ainda
* a.b=1 mod c. Assim, geramos d diretamente
*/
d = e.modInverse(phi);
}

/**
* 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();
}

//Funo utilizada para converter cada byte para uma string


private static String bytesToString(byte[] encrypted)
{
//Iniciamos o processo com a string vazia
String test = "";
/**
* Para cada byte, aplicamos a converso para string e atualizamos a
* string test que armazena os resultados
*/
for (byte b : encrypted)
{
test += Byte.toString(b);
}
return test;
}

/**
* 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;
}

public static void main (String[] args) throws IOException


{
RSA rsa = new RSA();
/**
* Foi criado um arquivo .txt e inserido na pasta do projeto, de modo que
* o texto a ser criptografado fosse extrado de l.
*/

//Inicialmente lemos os bytes do arquivo com a classe InputStream


InputStream is = new FileInputStream("Teste.txt");
/**
* Para recuperar um caractere precisamos traduzir os bytes com o ecoding
* dado para o respectivo cdigo unicode. Quem faz isso a classe
* InputStreamReader
*/
InputStreamReader isr = new InputStreamReader(is);
/**
* A classe BufferedReader concatena os chars de modo a formar uma
* String atravs do mtodo readLine.
*/
BufferedReader br = new BufferedReader(isr);
String teste = br.readLine();

System.out.println("Mensagem a ser criptografada: " + teste);


System.out.println("Converso da mensagem para bytes: " +
bytesToString(teste.getBytes()));

// Encriptao
byte[] encrypted = rsa.encrypt(teste.getBytes());

System.out.println("Mensagem encriptada em Bytes: " +


bytesToString(encrypted));

// Decriptao
byte[] decrypted = rsa.decrypt(encrypted);
System.out.println("String

Decriptada

em

Bytes:

+ bytesToString(decrypted));

System.out.println("Decrypted String: " + new String(decrypted));


}

"