Você está na página 1de 34

  VERSÃO PARA IMPRESSÃO

CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO


DIGITAL
UIA 3 | ALGORITMOS CRIPTOGRÁFICOS: ASSIMÉTRICOS
Este material é destinado exclusivamente aos alunos e professores do Centro Universitário IESB, contém
informações e conteúdos protegidos e cuja divulgação é proibida por lei. O uso e/ou reprodução total ou
parcial não autorizado deste conteúdo é proibido e está sujeito às penalidades cabíveis, civil e
criminalmente.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 3

SUMÁRIO

Aula  13  | Cryptographic Pseudo-Random Number Generators (CSPRNG) .............................4  


Aula  14  | Princípios de Criptografia de Chave Pública .............................................................9  
Aula 15 | Algoritmo RSA ............................................................................................................ 13  
Aula 16 | Pretty Good Privacy (PGP) ......................................................................................... 18  
Aula 17 | Tópicos Avançados em Criptografia Assimétrica.................................................... 24  
Aula 18 | Estudo de Caso: Moedas Digitais .............................................................................. 29  

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 4

Aula  13  |  CRYPTOGRAPHIC PSEUDO-RANDOM


NUMBER GENERATORS (CSPRNG)  

Olá, estudante, bem-vindo(a) à terceira Unidade de Interação e


Aprendizagem (UIA). Na Aula 7 da UIA 2, introduzimos brevemente o
conceito de aleatoriedade e a importância do uso de geradores de
números pseudoaleatórios. Nesta aula, trataremos de detalhes sobre a
geração desses valores aleatórios e a real importância deles para a
criptografia em geral. Bons estudos!

É importante salientar que vários processos na área da computação em


geral necessitam de valores pseudoaleatórios. Essa é uma prática
bastante comum e não pode ser considerada inovadora. Desde os
primórdios da computação, isso já ocorria frequentemente, como, por
exemplo, com a geração de uma senha para um usuário em um sistema
operacional qualquer, ou um carimbo relativo ao tempo de uma
transação computacional.

n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n

Acesse o Ambiente Virtual de Aprendizagem (AVA) da disciplina e


assista à videoaula sobre algoritmos de chave assimétrica.

n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n

Se considerarmos o mundo criptográfico apenas, os números (ou valores) aleatórios são de vital
importância, porque uma parte significativa da segurança dos criptossistemas modernos reside na
imprevisibilidade de resultados dos algoritmos, e isso só é possível se os algoritmos conseguirem gerar
valores que não possuem uma previsibilidade computacionalmente praticável.
Imagine que um criptoanalista passe a analisar um algoritmo de criptografia e, por causa da
previsibilidade dos resultados, ele acabará descobrindo quais serão os textos cifrados, exatamente
porque não há um elemento aleatório para diferenciar quaisquer resultados.

A chave de criptografia é uma variável nesse sentido, não é mesmo?

É como se disséssemos com plena certeza que, depois do número 10, sempre vem o número 40, depois o
número 70 e assim por diante. A aleatoriedade a que nos referimos aqui é puramente matemática,
portanto, algoritmos matemáticos são uma parte essencial desses geradores quando tratamos de
pseudoaleatoriedade.

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 5

Neste momento, é preciso definir exatamente o


que é aleatoriedade. O que é aleatoriedade,
matematicamente falando? É a falta de um
padrão ou a imprevisibilidade quase que total do
resultado dentro de um espaço amostral finito; é
a falta de uma equação matemática que consiga
prever com certa precisão o próprio espaço
amostral de possibilidades e seus resultados.

Embora seja possível demonstrar que o espaço amostral exista, o resultado do evento é parcialmente
desconhecido. O conceito dado aqui é meramente didático, pois há processos estocásticos1 dentro da
matemática para descrevê-los, mas não aprofundaremos essa definição. Observe que a aleatoriedade
está ligada diretamente à área da teoria da probabilidade.

Observe esse simples conceito, na prática, por meio de um exemplo,


disponível no link a seguir, utilizando a linguagem Python.
http://tinyurl.com/hypxgfj

Há basicamente dois grandes grupos quando tratamos dos tipos de aleatoriedade e números aleatórios
dentro da Matemática e na Computação (e, consequentemente, nos demais campos do conhecimento):
1.   Números (ou valores) verdadeiramente aleatórios: são aqueles em que não há uma previsão
matematicamente precisa, pois são eventos naturais que ainda não são totalmente simulados
pela Matemática, ou pela Física por exemplo. São também, às vezes, chamados de eventos
caóticos. Exemplos: fatos que circundam a ocorrência de um raio (quando, onde, intensidade),
geração de uma onda eletromagnética por um corpo celeste, uma explosão de ventos solares
gerada pelo sol, fatos que circundam a ocorrência de um terremoto.
2.   Números (ou valores) pseudoaleatórios: são aqueles gerados por dispositivos criados por
humanos e que pela característica de amostragens e espaço amostral, demonstram uma certa
previsibilidade. Boa parte deles vem de um processo puramente matemático criado pelo homem.
Se você, estudante, observar com mais cuidado os eventos que rodeiam a sua vida no dia a dia,
perceberá que boa parte deles se encaixará no segundo grupo. Um simples jogo de dados, por exemplo,
nos dá a ideia de completa aleatoriedade, mas, na prática, além de sabermos que o espaço amostral de
um dado é muito pequeno, as condições iniciais de como se lança o dado fazem toda a diferença no final.
Se você sempre jogar um dado de uma maneira X, pode ser que ele sempre revele o número 6. Ou seja, a
“entropia” inicial muda todo o resultado, porque há algo conhecido influenciando o resultado final. A
esse conceito amplo é o que denominamos de pseudoaleatoriedade. Perceba, então, que a parte de
jogos é uma outra área alheia à criptografia, que também utiliza muito o conceito de
pseudoaleatoriedade.

                                                                                                                       
1
Determinado pelas leis da probabilidade; aleatório.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 6

Exemplo:  A  roleta  é  um  famoso  jogo  de  azar  


onde   o   participante   lança   uma   bola   e   tenta  
predizer  o  resultado.  Há  um  espaço  amostral  
X,   e   a   roleta   pode   girar   mais   rápido   ou   mais  
devagar,   dependendo   das   condições   do  
momento.   O   resultado   parece   totalmente  
imprevisível  aos  olhos  dos  outros  e,  até  certo  
ponto,  isso  é  verdade.  Entretanto,  a  teoria  da  
probabilidade  possui  certos  mecanismos  por  
meio  dos  quais  é  possível  prever  com  relativa  literalidade  os  próximos  resultados.

Não adentraremos na seara de como isso é feito, pois o mais importante para a nossa disciplina é você
entender de forma mais sólida o conceito de pseudoaleatoriedade.

Diante do que foi exposto, qual a importância da pseudoaleatoriedade para a


criptografia, de uma forma geral?

Na geração de chaves criptográficas, sobretudo aquelas que são


utilizadas para gerarem chaves derivadas, ou para gerarem parte do
valor das chaves. Por exemplo, em uma chave de 128 bits, o usuário
não provê necessariamente os 128 bits como entropia. Para tanto, é
preciso que algum processo gere o restante dos bits. Se esses bits
restantes sempre forem conhecidos, ou seja, se o processo sempre
gerar valores matematicamente previsíveis, você concorda que é
computacionalmente possível antever qual será a chave final? Sim,
seria possível, estatística e computacionalmente falando, mormente se
o usuário apresentar um valor inicial de fácil adivinhação, como
“12345678”. Computacionalmente falando, a entropia total dessa
chave gerada seria muito fraca, pois não houve elementos
pseudoaleatórios que ajudassem nesse processo.
Dissemos, na UIA anterior, que a geração de números pseudoaleatórios pode ser feita através de
processos computacionais, através de algoritmos próprios para tal fim: os Cryptographic Pseudo-
Random Number Generators (CSPRNG2). Todavia, se levarmos em consideração que um computador
é, na prática, uma máquina determinística, ou seja, ela só executa aquilo que é programado por nós, é
realmente difícil criar processos que gerem esses tipos de valores. Daí a importância de se utilizar
conjuntamente eventos mais “aleatórios” possíveis, como o movimento de um mouse, a digitação
contínua de caracteres em um teclado, os pixels gerados por uma imagem em um determinado
momento, a leitura e escrita em um disco, os dados que serão executados pela CPU e assim por diante.
Esse conjunto de informações cria um grau de entropia relativamente alto e, por consequência, um nível
final de aleatoriedade quase perfeito.
Vamos exemplificar a partir de agora como um CSPRNG pode ser projetado. O exemplo dado a seguir é
um dos algoritmos mais simples para a geração de números pseudoaleatórios: o Linear Congruential

                                                                                                                       
2
Geradores de números pseudoaleatórios criptograficamente seguros. São algoritmos destinados a prover a maior
aleatoriedade possível utilizando como entropia recursos computacionais.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 7

Generator (LCG3). Sua fórmula e implementação prática através de uma linguagem de programação é
relativamente simples. Contudo, ele não é computacionalmente seguro para operações criptográficas.
Por isso, o objetivo de demonstrar o funcionamento do LCG na disciplina é puramente didático para dar
a você, estudante, a noção exata de como os CSPRNG podem ser construídos.

Leia mais sobre o assunto acessando o link a seguir ou o acervo da


disciplina.
http://tinyurl.com/jpm8se9

A fórmula que define o LCG é a seguinte:


𝑋𝑛 + 1 = { 𝑋𝑛 ∗ 𝑎 +  𝑐  𝑚𝑜𝑑  𝑚 }
Onde:
Xn+1 = Próximo valor
X0 = Semente (ou valor inicial), onde 0 ≤ X0 < m
a = multiplicador, onde 0 < a < m

c = adicionador, onde 0 ≤ c < m


m = módulo
Observe que todos os valores utilizados estão dentro de um espaço
amostral finito definido por “m”, que é o valor máximo. O número
“m” em algumas implementações bem conhecidas por alguns
sistemas operacionais é tido pelo resultado de uma exponenciação
relativamente grande, como 232 ou 248.
A implementação prática do LCG para gerar números aleatórios
pode ser feita em UNIX Shell. O comando a seguir gera os seis
primeiros números pseudoaleatórios utilizando o algoritmo LCG:
mc$ for semente in {10..15}; do semente=$(((1103515245 * $semente) + 12345
% 2**48)); echo $semente; done
11035164795
12138680040
13242195285
14345710530
15449225775
16552741020

O número anterior 1103515245 foi supostamente um número escolhido ao acaso. Observe a diferença na
previsibilidade dos resultados se a semente, ou valor inicial, for igual ao número 1:

                                                                                                                       
3
Um dos mais simples geradores de números pseudoaleatórios, mas que não é apropriado para uso criptográfico de larga
escala.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 8

mc$ for semente in {10..15}; do semente=$(((1 * $semente) + 12345 %


2**48)); echo $semente; done
12355
12356
12357
12358
12359
12360

Com isso, o LCG, para ser usado criptograficamente, deveria ser alterado para, além de fornecer um
espaço amostral significativamente maior, também considerar “sementes” (ou valores iniciais) que não
gerem resultados tão previsíveis como estes últimos.
A seguir, segue a implementação do LCG em um simples interpretador Python. A sintaxe é a utilizada
diretamente no interpretador Python:

>>> c = 2**48
>>> for a in list(xrange(10,16)):
... a = (1103515245*a + 12345) % c
... print a
...
11035164795
12138680040
13242195285
14345710530
15449225775
16552741020

O LCG é um algoritmo muito simples e, como dito anteriormente, não deve ser aplicável a operações
criptográficas. Há outros algoritmos, como o Linear Feedback Shift Register (LFSR), que é largamente
utilizado em linguagens de programação como JavaScript, PHP e Java. Entretanto, o LFSR não provê uma
margem tão significativa a ponto de gerar números pseudoaleatórios “confiáveis”. O termo confiável é
utilizado do ponto de vista criptográfico por causa do nível de entropia.
Como dito na Aula 7, os dispositivos /dev/random e /dev/urandom são largamente utilizados em
sistemas UNIX, pois eles criam as “sementes” a partir de eventos quase que totalmente aleatórios, vindos
da atividade que o usuário faz no computador. Já a plataforma Microsoft utiliza a API
CryptGenRandom. Esses dispositivos estão intimamente conectados com o kernel do sistema
operacional, portanto, podem ser considerados “mais confiáveis”.

Termina aqui nossa primeira aula desta unidade. Introduzimos conceitos que serão importantes ao longo
desta parte do conteúdo. Continue os estudos desta disciplina e até breve!

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 9

Aula  14  |  PRINCÍPIOS DE CRIPTOGRAFIA DE CHAVE PÚBLICA  

Bem-vindos à Aula 14 da Unidade de Interação e Aprendizagem (UIA) 3. Nas UIAs anteriores, percebemos que
o mundo da criptografia é bem amplo, e abordamos alguns princípios básicos da criptografia, bem como a
abordagem de cifragem simétrica.

n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n

Continuando nosso aprendizado sobre chaves assimétricas, acesse o


Ambiente Virtual de Aprendizagem (AVA) da disciplina e assista à
videoaula.

n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n

A necessidade de se utilizar uma outra abordagem diferente da simétrica nasceu, fundamentalmente, a


partir do problema de troca de chaves. A Aula 10 colocou em pauta o problema da troca de chaves de
forma mais detalhada.

Sugerimos uma revisão da Aula 10 a fim de que os conceitos apresentados daqui


em diante fiquem mais sólidos para você, aluno.

Há indícios de que o serviço secreto britânico já havia inventado uma nova forma de se trocar chaves.
Apesar disso, a invenção do algoritmo Diffie-Hellman, em 1976, foi o marco histórico na criação dessa
nova abordagem, porque possibilitou a troca de chaves de forma “segura”. Note que o termo “seguro” já
foi amplamente discutido nas aulas anteriores, então, não iremos detalhá-lo novamente. O Diffie-
Hellman não provê a confidencialidade dos dados trocados e nem sequer pode ser considerado um
algoritmo de criptografia propriamente dito porque o objetivo dele é a troca de chaves criptográficas,
não de informações criptografadas.

Perceberam novamente a diferença?

Nesse sentido, a nova abordagem a ser discutida amplamente nesta aula é o detalhamento dos principais
pontos acerca da criptografia de chave assimétrica, ou chave pública e privada, ou simplesmente de
chave pública.
Assim como o algoritmo Diffie-Hellman deu início a uma nova era na criptografia moderna, o uso de um
valor arbitrário público é o principal ponto dessa nova abordagem. Qualquer pessoa pode ter acesso a
essa informação pública e, mesmo assim, não conseguir derivar
nenhum tipo de informação a partir dela, como, por exemplo, qual foi
a chave privada utilizada, qual a mensagem original em texto claro
que se transformou em uma mensagem criptografada e daí por
diante.
Durante os estudos do algoritmo Diffie-Hellman, você percebeu que a
dificuldade de se achar determinados valores possui uma base
puramente matemática. Os principais algoritmos de criptografia de

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 10

chave pública também utilizam uma forte base matemática que os tornam computacionalmente
impraticáveis em termos de quebra criptográfica. Na prática, há uma quantidade razoavelmente ampla
de algoritmos de chave assimétrica, mas apenas alguns deles são considerados realmente passíveis de
implementação: o RSA4, o El Gamal, o Rabin e o ECC. Eles se baseiam em problemas matemáticos de
difícil resolução, como a fatoração de números primos grandes, até mesmo para um supercomputador.
Além disso, a criptografia de chave pública veio resolver não somente a questão da troca de chaves de
forma segura, mas também garantir a confidencialidade dos dados, a autenticidade e o não repúdio de
seus autores. Esses tópicos serão abordados na UIA 4.
Um conceito derivado diretamente deles é o termo assinatura digital. É possível afirmar que Diffie-Hellman
já propunha isso em sua solução para a troca de chaves. Esses são pontos cruciais para quaisquer
algoritmos de chave pública, pois a utilização prática deles em alguns casos necessita daqueles três
fundamentos, pelo menos. Entretanto, tenha cautela ao analisar a questão da resolução do problema de
troca de chaves simétricas: os algoritmos de chave pública, na prática, não substituem o uso da abordagem
simétrica, mas os complementam. Os detalhes de como isso é feito serão demonstrados adiante.

O que vem a ser, então, criptografia por chave pública? É um método


criptográfico que utiliza um par de chaves, uma privada e uma pública.

Você irá notar, posteriormente e de forma detalhada, que o par de chaves é algo associado a algum
indivíduo ou organização, já que um dos princípios da criptografia assimétrica também é prover a
autenticidade de seus atores.
A criptografia de chave pública também é categorizada como computacionalmente segura porque o
espaço amostral das chaves, ainda que notadamente maior que a abordagem simétrica, pode ser
exaurido em algum determinado momento. Portanto, o projeto dos algoritmos de chave pública deve
sempre levar isso em consideração.
O princípio fundamental por trás da criptografia de chave pública reside,
então, na interação de duas partes:

•   Chave privada: chave gerada aleatoriamente e que deve ser


guardada em segredo pelo usuário que a gerou.

•   Chave pública: chave gerada a partir da chave privada e que


pode ser divulgada sem restrições.
É preciso deixar claro para você, estudante, que a geração aleatória da chave privada não pode ser
confundida com a senha, ou a frase-senha que a protege inicialmente. Muitas implementações de
software dos algoritmos requerem que a chave privada seja “protegida” com uma senha no momento de
sua criação. Essa senha, em alguns casos, até pode fazer parte da entropia para a geração da chave, mas
ela não é necessariamente “a chave criptográfica em si”.

Percebeu a diferença?

A geração da chave privada é um processo tão importante que o seu comprometimento, quando e se
houver, é equivalente a uma quebra criptográfica por força bruta.

                                                                                                                       
4
Algortimo de chave pública que utiliza um par de chaves: uma privada e uma pública. Inventado por três criptólogos do MIT:
Ronald Rivest, Adi Shamir e Leonard Adleman.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 11

Procure se aprofundar mais sobre esse conceito, além de rever os


conceitos já ministrados, acessando o link disponível a seguir.
http://tinyurl.com/znr8kzb

A geração das chaves utiliza algoritmos CSPRNG e um elevado grau de entropia: a combinação de vários
processos em execução em um determinado período no computador do usuário. Esse processo de
entropia e o conceito de um gerador pseudoaleatório foi explanado em detalhes na aula anterior.

Duas propriedades cruciais definem bem a segurança das chaves privada e pública em
qualquer dos algoritmos de chave assimétrica:
1.   As chaves estão relacionadas matematicamente entre si, já que uma é derivada da
outra.
2.   Sabendo o conteúdo da chave pública, é computacionalmente impraticável
derivar a chave privada da chave pública.

Você perceberá adiante que a relação matemática entre elas faz com que a mecânica de troca de
mensagens criptografadas resolve de vez o problema de troca de chaves, que é uma problemática
intrínseca dos algoritmos simétricos. Uma das chaves geradas – a chave pública – possui essa
terminologia porque ela pode e deve ser conhecida por qualquer um que queira criptografar uma
mensagem com essa chave.
Do ponto de vista da criptoanálise, um criptoanalista que está de
posse da chave pública de um usuário pode criptografar qualquer
mensagem em texto claro e comparar com a mensagem cifrada. Se a
quantidade de mensagens cifradas existentes for muito pequena, as
chances de um criptoanalista descobrir o conteúdo da mensagem
cifrada são muito grandes.
Perceba que esse tipo de “ataque” não compromete necessariamente
a chave privada ou sequer o algoritmo de criptografia. É uma simples
e natural característica dos algoritmos. Entretanto, hoje, é
computacionalmente impraticável executar ataque, porque as chaves
públicas possuem, historicamente, um tamanho significativamente
maior em comparação a quando os algoritmos foram inventados. O
custo computacional de se criptografar grandes mensagens ou
grandes massas de informações é uma das desvantagens dos criptossistemas assimétricos.
Em geral, o tamanho máximo prático do par de chaves hoje é de 4.096 bits, o que dá uma margem
computacional muito grande em termos ataque de força bruta. A necessidade de se ter chaves desse
tamanho, em comparação com a abordagem simétrica, reside basicamente no fato de que algoritmos de
chave pública utilizam problemas matemáticos, ao passo que algoritmos de chave simétrica utilizam
combinações de operações lógicas e permutações. Para se ter uma ideia da comparação de
desempenho, algoritmos de chave assimétrica demoram quase dez vezes mais para cifrar o mesmo
tamanho de dados em comparação com algoritmos simétricos.
Finalmente, como funciona a mecânica básica dos criptossistemas assimétricos, ou de chave pública? Duas
partes, X e Y precisam trocar mensagens de e-mail entre si, utilizando algum algoritmo de chave pública, onde:

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 12

X = parte 1
Y = parte 2
T = mensagem em texto claro
E = mensagem em texto cifrado
X’ = chave pública de X
Y’ = chave pública de Y
1.   X e Y trocam por e-mail suas chaves públicas, X’ e Y’.
2.   X, de posse da chave pública Y’, cifra uma mensagem “T”, utilizando a chave
pública de Y em conjunto com sua chave privada.
3.   A mensagem “T” se transforma em mensagem “E”, cifrada com a chave privada de
X e a chave pública de Y.
4.   X envia a mensagem “E” por e-mail para Y.
5.   Y, de posse da chave pública X’, decifra a mensagem “E” com a sua chave privada.

Considera-se, nesse caso, o e-mail é um meio inseguro porque os protocolos de transmissão de


mensagens eletrônicas enviam as mensagens nativamente em texto claro. Observe que, se qualquer
atacante interceptar as chaves públicas de X e Y antes de a mensagem cifrada chegar ao seu destinatário,
ele não tem condições de dizer qual a chave privada de ambos. Caso o atacante também intercepte a
mensagem “E”, deve ser computacionalmente impraticável chegar à mensagem “T” apenas com as
informações da mensagem “E” e com as informações das chaves públicas X’ e Y’.

Leia mais sobre esse nosso último assunto acessando o link disponível a
seguir.
http://tinyurl.com/jd3bkm5

De uma forma geral, o esquema mostrado acima funciona muito bem para informações de pequeno
tamanho, já que o custo computacional é relativamente grande para informações muito grandes.
Considere como um custo computacional alto não somente os esforços computacionais, como memória
RAM, CPU e dispositivos de entrada e saída, mas também o tempo que se leva para efetuar tais
operações. É possível que determinadas operações levem horas para serem finalizadas. Daí decorre o fato
de termos uma quantidade de algoritmos assimétricos que são computacionalmente seguros, mas a
implementação prática inviabiliza a usabilidade por parte de usuários finais, ou até mesmo por parte de
grandes centros de computação que precisam cifrar grandes quantidades de informações.
Além do esquema clássico mostrado acima, é possível também que qualquer usuário, de posse apenas
da chave Y’ (a chave pública da parte Y), mas que por si só não tenha um par de chaves, criptografe uma
mensagem para Y. Y conseguirá decifrar a mensagem normalmente com a sua chave privada, já que a
mensagem foi cifrada utilizando sua chave pública. Como elas estão relacionadas entre si, tal operação é
plenamente possível. O que não será possível é Y enviar uma mensagem cifrada de volta para o usuário
que a enviou originalmente, pois ele não possui um par de chaves.

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 13

Você pode estar se perguntando: todos os usuários que possuem um par de chaves
assimétricas precisam trocar entre si as suas chaves públicas para que uma
comunicação segura entre eles ocorra?

Em princípio, sim! Esse é um outro problema decorrente da


criptografia de chave pública chamado gerenciamento de chaves.
Quando se tem uma quantidade enorme de usuários com um par de
chaves, privada e pública, distribuir e compartilhar as chaves
públicas de cada um pode virar um trabalho árduo, quando feito
manualmente.
Um outro problema é a questão da autenticidade do usuário que
gerou o par de chaves: como garantir ou confiar que foi ele mesmo
quem criou o par de chaves? Todos os usuários deveriam, nesse caso,
possuir um mecanismo externo que mostrasse que realmente tal
usuário é quem ele diz ser, ou então simplesmente confiar que o usuário é quem ele diz ser.
Daí a importância, mormente hoje, de uma infraestrutura de chaves públicas, ou simplesmente PKI
(Public Key Infrastructure). O conceito e a aplicação prática desse tópico será dado posteriormente e você
verá que a PKI resolve não somente o problema de gerenciamento de chaves públicas, mas também o
problema da autenticidade dos usuários.

Chegamos ao final de mais uma aula. Estamos no caminho para adquirir as competências e habilidades
proporcionadas por esta Unidade de Interação e Aprendizagem (UIA). A próxima detalhará o principal
algoritmo de criptografia assimétrica, o RSA. Até lá.

Aula 15 |  ALGORITMO RSA

Bem-vindos à Aula 14. Nesta aula, abordaremos um pouco da história e os detalhes do algoritmo de
criptografia assimétrica RSA. Continue os estudos desta disciplina e boa aula!

n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n

Acesse o Ambiente Virtual de Aprendizagem (AVA) da disciplina e


assista à videoaula sobre o algoritmo criptográfico mais utilizado no
mundo hoje, RSA.

n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n

O RSA é, provavelmente, o algoritmo de chave pública mais utilizado mundialmente. De fato, tornou-se
um verdadeiro padrão de criptografia assimétrica e é utilizado por inúmeras aplicações, plataformas e
protocolos ao redor do mundo. A sigla RSA deriva dos nomes de seus autores, os criptólogos Ronald
Rivest, Adi Shamir e Leonard Adleman.

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 14

Adi Shamir, um dos criadores do RSA. Leonard Adleman.


Fonte: http://tinyurl.com/hlqr8l5 Fonte: http://tinyurl.com/gpwmhcy
Sabe-se que o RSA é, em parte, derivado do conceito teórico do algoritmo Diffie-Hellman, que foi o
primeiro algoritmo a descrever troca de chaves de forma segura. Nesse sentido, o RSA é conceitualmente
um algoritmo de troca de chaves, mas seu uso prático se estende a operações criptográficas reais.
Historicamente, o “monopólio” da agência governamental
americana NSA (National Security Agency) manteve-se
inabalável até o grande salto dado, em 1976, por Diffie-Hellman,
ao conseguirem publicar a teoria de chaves públicas. O
conceito de chave pública foi criado absolutamente longe da
autoridade da NSA e criou um impacto imediato no ambiente
acadêmico. Pode-se dizer que, após a publicação do Diffie-
Hellman, houve uma autêntica competição na tentativa de
traduzir, na prática, as ideias reveladas por eles.
A “batalha” foi vencida em 1977 por Rivest, Shamir e Adleman, três pesquisadores do famoso Massachussetts
Institute of Technology (MIT). Com base nas ideias de Diffie-Hellman, eles construíram um dos mais poderosos
algoritmos criptográficos que o mundo conhecera até a época: o RSA. Em 1983, a patente do RSA foi aceita, o
que, na prática, representou a primeira patente de um algoritmo criptográfico.
Entre o anúncio da invenção em 1977 e o recebimento da patente, Rivest, Shamir e Adleman não
publicaram detalhes do RSA. Apesar disso, em setembro de 1977, os três pesquisadores entregaram um
texto relatando a pesquisa para Martin Gadner, com o objetivo de ser publicado na revista Scientific
American. O artigo incluía a oferta de enviar o relatório técnico completo para qualquer um que enviasse
um envelope selado com o próprio endereço. Foram recebidos milhares de pedidos vindos de todo o
mundo. A NSA contestou a distribuição desse relatório para estrangeiros e os relatórios não foram
enviados, que se tornou em uma situação ideal para os inventores, que intuíram a necessidade de não
dar maior divulgação ao algoritmo antes de conseguir a patente.

Para adentrarmos um pouco mais nos detalhes do RSA, é preciso revermos


brevemente um conceito matemático de fundamental importância para esse tipo
de cifra: os números primos e a sua relação com a computação.

Segundo o Teorema Fundamental da Aritmética, todos os números inteiros 𝑛 ≥ 2 podem ser


decompostos, ou fatorados, como produtos de números primos. Assim, os números primos são – de fato
– a essência para a construção dos números inteiros.

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 15

Exemplo: Fatorando 20 e 18 como um produto de números primos, temos:


20 = 22 x 5
18 = 32 x 2
Descobrir um modo eficaz de encontrar números primos tem sido a tarefa árdua de matemáticos por
muito tempo, que, apesar de alguns progressos, ainda continua sem uma “solução” praticável. Entenda
que o termo praticável aqui também é utilizado na matemática porque é impraticável descobrir
manualmente esse tipo de número a partir de uma certa quantidade de dígitos.

A computação tem sido, de certa forma, uma grande aliada na busca do


maior número primo existente, que hoje possui cerca de 22 milhões de
dígitos. Veja mais no link a seguir.
http://tinyurl.com/jdz4tgz

Definição clássica de um número primo: Um inteiro p ≠ ±1 é um número primo quando seus únicos
divisores são ±1 e ±p. Um dos métodos formais de se descobrir se um inteiro qualquer é primo ou não é
fatorando-o.

Observe as diversas implementações em diferentes linguagens de


programação desse método, chamadas por alguns autores de “Trial
Division”. Acesse o link a seguir e saiba mais.
http://tinyurl.com/hrjgjed

A dificuldade em saber se um número inteiro é primo ou não está


diretamente relacionada com o seu tamanho: quanto maior a quantidade
de dígitos do inteiro, maior a composição ou mais custosa fica a operação
de fatoração do número.

No mundo da Matemática, é “humanamente”


impossível determinar se um número com 2 milhões de
casas decimais é primo ou não.

Somente poderosos computadores possuem essa capacidade e ainda assim levam uma grande
quantidade de tempo para descobrir se é ou não um número primo. Ou seja, responder à pergunta “É
primo, ou não?” é um problema matemático-computacional dos mais complexos.

Leia mais (em inglês) sobre essa explicação, acessando este outro site,
disponbivel no link a seguir.
http://tinyurl.com/jgvxd68

Tente executar o código-fonte a seguir em um interpretador Python, procurando pelos números primos
entre 2 e 1000:
Observação: a identação do código-fonte em Python é fundamental.
  #!/usr/bin/env python
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 16

''' PEP8 Compliant '''


import sys
maximo = int(sys.argv[1])
lista = []
for inteiro in range(2, maximo + 1):
for x in range(2, inteiro):
if inteiro % x == 0:
break
else:
lista.append(inteiro)
for primo in lista:
print primo,

Ao executá-lo em um Shell UNIX, perceberá a seguinte saída:


 
mc$ ./primos.py 1000
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191
193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283
293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401
409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509
521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631
641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751
757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877
881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997

Considerando os fatores acima, a resistência do algoritmo RSA reside – essencialmente – na dificuldade de


fatoração de grandes números primos. Alguns autores consideravam inteiros primos “grandes” como
números de 200 dígitos, o que, à época, já era uma tarefa computacionalmente impraticável. Vimos que o
maior número primo, atualmente, possui 22 milhões de dígitos. Isso se deve em parte, novamente, ao poder
computacional existente. Daí a relação intrínseca entre números primos e computação; entre algoritmos
robustos, como o RSA, e a computação. Dependemos hoje da computação para muitas coisas, mas podemos
afirmar com um certo grau de maturidade que a criptografia não mais sobrevive sem a computação.
No algoritmo RSA, a chave privada, usada para decifrar, consiste de dois
números primos muito grandes (P e Q). A chave pública, usada para cifrar,
é definida por N, onde o valor N é obtido pelo produto N = P x Q. A chave
pública N pode ser comunicada a todo mundo e figurar, por exemplo, em
uma espécie de lista pública de chaves. Observe que o produto N é o que
produz a chave pública. Se um atacante possui conhecimento do valor N,
é computacionalmente impraticável descobrir P e Q.
O fundamento que sustenta a impossibilidade virtual de Eva, a partir do conhecimento do número N, de
encontrar seus fatores primos P e Q é a teoria de fatoração dos números inteiros. A teoria institui que se

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 17

um número N tem mais do que 10160 dígitos e é alcançado como produto de dois números primos, cada
qual com mais de 1070 dígitos, torna-se, então, computacionalmente impraticável encontrar P e Q.
No RSA, a chave secreta jamais deverá ser exposta a ninguém, ao passo que a chave pública é difundida
sem restrição alguma. A regra de segurança crucial da cifra RSA garante que é computacionalmente
impraticável deduzir a chave secreta a partir da chave pública apenas. Esse é o fator de sucesso do
algoritmo.
Idealmente, a escolha de P e Q deve ser aleatória entre um rol de números primos grandes. Se P e Q
forem escolhidos baseados em algum fator determinístico, a chance de um atacante conseguir descobri-
los é maior, mas não necessariamente muito maior. Daí a importância do uso de um CSPRNG aplicado a
números primos.
Além disso, o algoritmo RSA especifica a escolha de alguns números para compor a operação de
criptografia. O primeiro deles é um número chamado de coprimo5, que, no RSA, é dada pela função φ(x)
= (p - 1) * (q - 1). Calcular tal número é tão ou mais difícil do que determinar os fatores de um número
primo, como P e Q.
O segundo deles é um número “e”, em que 1 < “e” < φ(x), de forma que “e” seja coprimo de φ(x). Assim, o
número “e” é definido na prática pelo MDC(φ(x), e) = 1, sendo e > 1. A chave pública fica então definida
pelo conjunto (N, e).

Leia mais sobre a operação matemática MDC, acessando o link a seguir.


http://tinyurl.com/ho6e8ea

A chave privada é encontrada utilizando o inverso multiplicativo modular do número “e”. Um inverso
multiplicativo é conhecido na matemática como a * (a ^ -1) = 1. Ora, se todo número possui um inverso
multiplicativo, então, o MDC(φ(x), e) = 1. Assim,
1 = 𝑑×𝑒 − (𝑟×𝜑(𝑥))
Onde “d” é o inverso modular de “e”.
Você, aluno, não precisa decorar tais fórmulas ou aplicá-las no seu dia a dia, porque o algoritmo RSA é
implementado na prática por alguns aplicativos.
Finalmente, a função de cifragem e decifragem do RSA é definida pela aritmética modular, mais
precisamente pelas seguintes funções, respectivamente:
c = me mod N
m = cd mod N
Onde “e” e “N” fazem parte da chave pública e “m” é o valor numérico da letra correspondente de uma
mensagem qualquer.
O inverso é verdadeiro, onde “d” é a chave privada, determinada pela fórmula acima.
Em relação à quantidade de bits do par de chaves do RSA, é estimado que 1.024 bits de uma chave RSA
equivalem a 80 bits do algoritmo AES, por exemplo. Atualmente, a implementação do RSA opera em

                                                                                                                       
5
Chamamos números primos entre si (ou coprimos) um conjunto de números onde o único divisor comum a todos eles é o
número 1. Um conjunto de números inteiros é chamado de mutuamente primo se não existir um inteiro maior do que 1 que
divida todos os elementos. Por exemplo, os inteiros 30, 42, 70 e 105 são mutuamente primos.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 18

versões com 1.024, 2.048 e 4.096 bits. É preciso esclarecer que, quanto maior o tamanho do par de
chaves, maior é o custo computacional. Portanto, conforme dito na aula anterior, essa é uma
desvantagem clara do RSA por conta das operações matemáticas envolvendo a fatoração de grandes
números primos.
Apesar do RSA ser amplamente utilizado mundialmente em várias aplicações, seu uso está restrito ao
ciframento de pequenas quantidades de dados, pois, como vimos nesta aula, seu desempenho é
comprometido para grandes massas de dados. Vale relembrar que o RSA não veio somente resolver o
problema da troca de chaves, mas também o da autenticidade, como veremos na próxima UIA.

Chegamos ao fim de mais uma aula da UIA 3. Continue estudando para desenvolver as competências e
habilidades necessárias a essa área de atuação e do conhecimento. Até a próxima.

Aula 16 |  PRETTY GOOD PRIVACY (PGP)

Bem-vindos à última aula desta Unidade de Interação e Aprendizagem (UIA).


Nesta aula, trataremos de uma aplicação utilizada amplamente pela comunidade
de segurança, o PGP6 (Pretty Good Privacy).
 
Podemos afirmar – antes de mais nada – que o PGP é um exemplo prático de
tudo o que estudamos até agora: a implementação de cifras simétricas,
assimétricas, algoritmos de hash, geração de números pseudoaleatórios, entre
outros vários aspectos.
Se colocarmos os termos “pretty good privacy” em palavras mais amigáveis,
ou em tradução livre, significaria “privacidade bem boa”, que foi a intenção de seu inventor, Phil
Zimmermann, um criptólogo estadunidense. Em 1991, Zimmermann inventou o PGP com o propósito
declarado de ajudar ativistas políticos a protegerem suas comunicações por e-mail. Sua visão desde o
início era ser um instrumento de criptografia fácil de usar, sem backdoors e com código-fonte aberto.

Phil Zimmermann, criador do PGP. Fonte: http://tinyurl.com/jk333tg

                                                                                                                       
6
Sistema de criptografia que utiliza algoritmos criptográficos bem conhecidos para cifrar mensagens de e-mail, mas também
pode ser utilizado para cifrar arquivos.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 19

A versão inicial do PGP utilizava um algoritmo de criptografia proprietário inventado também por Phil
Zimmermann, chamado de BassOmatic. Phil trocou o seu uso pelo padrão americano à época, o IDEA.
Apesar da implementação de algoritmos simétricos no começo e uma série de disputas judiciais entre
ele, o governo americano e a RSA Security Inc., o PGP foi de fato o primeiro programa disponível
abertamente para uso criptográfico em mensagens de e-mail, utilizando criptografia de chave pública.
Entre as idas e vindas em torno do PGP, o nome PGP é hoje uma marca adquirida pela empresa de
segurança Symantec. Contudo, o software PGP e sua concepção original ainda podem ser utilizados
livremente sob licenças de código aberto, além de ser padronizado pela RFC 4880 (NETWORK WORKING
GROUP, 2007), derivada do padrão OpenPGP. Praticamente todas as implementações abertas do PGP
seguem o padrão OpenPGP, o que significa dizer que você pode utilizar o PGP para salvaguardar suas
mensagens de e-mail tranquilamente, inclusive empregando quaisquer dos principais algoritmos
criptográficos existentes, como o AES, o Twofish, o RSA, MD5, SHA-256, RIPEMD, entre outros.

Na  prática,  o  PGP  pode  prover  os  seguintes  serviços  de  segurança:  


1.   Criptografia (simétrica e assimétrica).
2.   Autenticidade (através de assinaturas digitais).
3.   Compressão dos dados.
4.   Gerenciamento de chaves e certificados.

Vamos agora nos aprofundar nos detalhes de como o PGP funciona em termos de criptografia. Não
somente a dinâmica do programa – mas também as especificações oficiais – preveem que o PGP é de
fato um software híbrido. Apesar de criar pares de chaves, públicas e privadas, as operações
criptográficas são um composto de cifragens simétricas e assimétricas. Em linhas gerais, a chave simétrica
a ser utilizada para cifrar o texto claro é cifrada com a chave pública do destinatário. O destinatário,
então, decifra a chave simétrica para então decifrar o texto cifrado.

Colocando em passos, essas operações ficam assim definidas:


1.   O emissor cria uma mensagem qualquer em texto claro.
2.   O emissor gera um número aleatório para ser utilizado como “chave de sessão”
para esta mensagem apenas.
3.   A “chave de sessão” é cifrada utilizando a chave pública do destinatário.
4.   O emissor, então, cifra a mensagem em texto claro com a “chave de sessão”, ou a
chave simétrica.
5.   O destinatário decifra a chave de sessão utilizando sua chave privada.
6.   O destinatário finalmente decifra a mensagem cifrada revertendo-a para texto
claro.

Um dos pré-requisitos fundamentais para o uso massivo do PGP é o uso e a distribuição das chaves
públicas. A criação do par de chaves, que de uma certa forma estará associada a um usuário, precisa ser
“protegida” por uma frase-senha, porque uma das chaves precisa ser mantida em segredo: a chave
privada.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 20

Uma vez criada, a chave pública pode ser distribuída de qualquer forma. Uma delas é o proprietário
enviar a chave por e-mail junto com a mensagem cifrada. Outra forma é efetuar o upload da chave
pública para um repositório de chaves.

Há vários repositórios públicos disponíveis na Internet. No Brasil, por


exemplo, um desses repositórios é mantido pela RNP (Rede Nacional de
Pesquisa). Veja pelo link a seguir.
http://tinyurl.com/gwntfbv

Um outro repositório bem conhecido mundialmente é o servidor PGP


do MIT, tamb;em disponível no link a seguir.
http://tinyurl.com/h2baks5

Se você pesquisar em um desses servidores públicos PGP pela chave “0x196FE3EE”, você encontrará a
chave PGP válida do autor desse material. Toda chave PGP possui um “Key ID”, representado, na maioria
dos casos, por uma string hexadecimal.
Um dos softwares de código-fonte aberto que implementa o padrão OpenPGP é o famoso GnuPG,
mantido pelo projeto GNU. O GnuPG pode ser utilizado livremente em várias plataformas UNIX, que
também foi portado para a plataforma Windows através do Gpg4win, também mantido pelo próprio
projeto GNU, em uma tentativa de favorecer o seu uso em diferentes sistemas operacionais.
Na plataforma UNIX, um par de chaves pode ser criado com o seguinte comando em um Shell UNIX. O
comando fornece uma interação direta com o usuário durante o processo de geração das chaves,
conforme demonstrado a seguir.
[root@bsd11 ~]# gpg --full-gen-key
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 2y

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 21

Key expires at Thu Mar 22 11:26:44 2018 BRT


Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.

Real name: crypto-teste


Email address: crypto-teste@iesb.edu.br
Comment:
You selected this USER-ID:
"crypto-teste <crypto-teste@iesb.edu.br>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to
perform
some other action (type on the keyboard, move the mouse, utilize
the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
Please enter the passphrase to
protect your new key
Passphrase:
Repeat:
We need to generate a lot of random bytes. It is a good idea to
perform
some other action (type on the keyboard, move the mouse, utilize
the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key BF46F2C7 marked as ultimately trusted
gpg: directory '/root/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/root/.gnupg/openpgp-
revocs.d/2E80C5752B7EA82D8F2DC632CC19C90FBF46F2C7.rev'
public and secret key created and signed.
 

Após a geração do par de chaves, cujo algoritmo de chave pública escolhido foi o RSA, a chave pública
do usuário hipotético “crypto-teste” pode ser exportada com o seguinte comando. Observe a string ---
--BEGIN PGP PUBLIC KEY BLOCK-----: ela identifica um bloco de dados que corresponde à
chave pública do usuário. Tal informação ou bloco de dados é público e, de acordo com os princípios da
criptografia, é impraticável derivar a chave privada a partir das informações contidas no bloco de dados
da chave pública.

[root@bsd11 ~]# gpg -a --export crypto-teste


-----BEGIN PGP PUBLIC KEY BLOCK-----

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 22

Version: GnuPG v2

mQINBFbxVlMBEADfYW6v3pmXm/oATWclMDrCjIE7h9RIyNVM7IMh2d6BSrjmgfNT
53uXYOskLMJahx2vdPx3fjEaeD5yZpb3/hHM9cwWyC9oXjq73UBocEy5rOsKgtgC
0q+o65/NFFfIY4vJDoyJZ+1KO11cZkKuo337GiricBRc/4jJgHT8k+hhGt8Yu0vh
A4V3Bzm0di+XUDzBG5XDCt3lw2C4sLmQqIZEJbZIpqTo730lLarnIz2LBMwwvJkj
NoXHVJ46AktLcFZ/VhuVnHM3xowuCzs87sTpnMg7loAM328lX3co5pOWj38y0pOz
GvvpMB0Pn/6h+Oo24fDvIEuMOJgqpiUl/iDP4J6YXiQ1IsZSOZgxnollvWaZ244D
w218NhUSTg8xJpmtZCIBfH0sevFmqglx3RR7ILB44OziBwhjg311P8CwbhMPg9q/
5lQiWcId8uUcptrlYqFWo8stNPktC2V55aDc5nJniF2EFJIWAB8puBmzNd72cTkt
9ONIYKl28pkj5tIB57P2QHGO38QxSyuTLLSg5zOtlZi620zwAsZMJl5QTEu1cMZF
ZFgaMTPNs/6gD0oFwysvVdUa6no39oibtOIQYCIutqavdGQPiOsEwMRWu53C75aP
I783rf5yq4JpT8esKqvB0hYZYn5usSAQaQp2f4lkNvWsPGnQ5A0w3zVaKwARAQAB
tCdjcnlwdG8tdGVzdGUgPGNyeXB0by10ZXN0ZUBpZXNiLmVkdS5icj6JAj0EEwEI
ACcFAlbxVlMCGwMFCQPCZwAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQzBnJ
D79G8schRQ//XadKH6xcBmV48KM7Gqvx/Nbq7U+9y6f/uC6kjREtBYukan8upXR2
nxFVRROhSZ8+XFQPnSRhWNkYYqcS6cY19+3gwmWT0Xmq6t3ygN3opDg7GPuL20B0
HGH6DTswImBYS2pi70GRhxpvwmU8f2014r2y3aPG0UNp777KMikdiKTFdNgekss6
iEqmNsJ+ihFvQ2CqbxvrKs/JyRYfeV4Ep/hyUCUKdJlmpQWuPR0Rt14Y7eRemzxw
zeQF1Sb8w35Mas3ObJ3wSmgBFBE6MC7d73arq8/TBplVva/2SEm0XyM/4jKls8SN
e7P8GOAZr5sPwmpZETWiMyiRqNG6ByVUhuJgJxO6IB+y09mMO2D5p9e1VQvpQqTb
7i+3OMtzCS+5rg784RipRU2txuIXujsddZTq1CDtet9RLi369q1ofSGzFLRRL74B
I8jsXHWdtfD6jvEt6o1InSYWrvvMU6DcAbCdbVILDSJ6FZIeK2SiYvouc7SSXC6S
7WHtp0irFyBYqZZX0EE8U42HMT8nLwmOhNV4TXcu41jWBN7/+QF/yE1EizqoUpcI
tNdRUMyjlTZyJE9y/zcsdSHECuf23L4JkEUPLqlCX2n0+pbRzj1jHzuEvY3jPk/W
bX1SP3y438Ur8NzqoD2Ob+oxaQJQawhcDI3JIQM+DucrlnRW1Ox0Bnq5Ag0EVvFW
UwEQAN+OJq9XsyD1XkMU2MqS/yHpZYoh0RldYaMRblsqYsjvvxhUx8dedFBdRLlb
7InMCFAneVidlK9msxlDk3CCv98Tr8SOXMMmykaHXori3BEQ73G9PETCZYzBGBPr
kn5bnyPWd9j6ugPG+zLTVpUlkygn+5jrhde7vIOj3g05IyhvgfNOofck0GP2VkAk
SWzuWBIJLfrKFMIHk5krLfGk3nD6X7uFnkms50S/GsKJP5rx+bxy/iSoVNjs7SQP
IFEDVtB8JqdTtcOK539ULf2Oon9xM6375JGfblgBZaTIY7M2g5dVC5Mu0y/zVAGG
9wAGuP8uQD/Uxp4Ih2BgnpYiOnojUxfZWay/+koUzF0Kw+ymbDlmKH8uKG0zCKaz
nG3J1TMabJ8kcSK8DIJDIZwRg83MyeKwpsG3fyQBHOJwD08AQHDSYEtTe6mw/5G5
bNp2sRRzNBE1VrQY9zFhKE/n1zg32gCUJssfDvFWIYgO1Egqx1usnJJrHBScirFJ
1rcgD2RROUruM8IbQnrLCWB0a2vTcGmamVFEERvmAKycm8b5q/vQ/g14OkVTYvzo
Scu9qFd1kappu6Fotnb7PlP0Fm83nBiGJZQitYbN2X80IgORq1HLM0NlW/Ab56W4
jO5ky/orENpEmuWzTnE+50365xgyyePOkPB8VYVJ5feC6VbRABEBAAGJAiUEGAEI
AA8FAlbxVlMCGwwFCQPCZwAACgkQzBnJD79G8seBnQ/+OQmLi9rLCi3qqPjxzNzq
6bhV56Ue4p5ReRJ0NVkwTOi0fz3dGecmJ7g+zdXVDKabwaOsdOIRYd0dUVlsRu0M

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 23

KM8PgTD/4p08rp1Etf1Y38k26vY4Z4Ks7X5MOmhgCPemijLofmjOlCWEYwhAGrxi
n6Zw9n0hz4vkUbB3qntV495yzUX4VJ1vJZHUKyI4AztwZIHByhGk/6EQMtdVt4K+
5w3mP+K+IbgSn4tEcVI9Hgk6HJcrWlFv+emTKvtkXjPr8haRgV27UGQHplli+JV6
+WTqdHAqnRXakPynnG5W3n7tQm+cZCsvgwbc7WohccJv1rz79ino44dR+RA1Nk33
uLL63JWwyOa26udRdpfhGMx7KZPydL+0Z8F+juMmANsm9j7PMcBlGteulmcr/fMp
SfXRwmfo4HhY85kYmEF+8lOFdhJKwD5AKQEsLdZnUjuZq4rpToTUmL42IOxpDAn+
vMDKCm6njJxl3kCF5uyP+3VY9WEiQfliZGVSY3G+zJIXGYSvdguwKFbtgHnbPHcM
ke3/WEOkguu3NFhcCskqq+ryvKv5R2ZmZWkZTRoq4Zi3GzzA4ZITL4A+6qc48VeH
StHmuwBlTgdQDTraERalP3l41bKPB5UWDpjlhWvFgfw2qgXx5eC8cBFTGSkXki0N
pt2K0PX7XyxvQxYj0a/vmmY=
=deS7
-----END PGP PUBLIC KEY BLOCK-----

Já em relação ao processo de criptografia assimétrica utilizando chaves públicas, o seguinte comando do


GPG em Shell UNIX pode ser utilizado. Observe que os destinatários são dois, já presentes no sistema
operacional: “Marcos Cicero” e “crypto-teste”.
[root@bsd11 ~]# gpg -a --output teste.gpg --encrypt --recipient
"Marcos Cicero" --recipient "crypto-teste" teste.txt
[root@bsd11 ~]# cat teste.txt teste.gpg
teste
-----BEGIN PGP MESSAGE-----
Version: GnuPG v2

hQEMA1rKd58Zb+PuAQgAi9qXy69EFJ8wnd0FIc+cvMa3xHI/GR3tRbWZxBx1SRo+
StxX+e9zAUQPN5JiYzvMwM2kWJbRndGU3VADoDkqIuXJeibN3qKbLQPRqSfBVryD
B04p8z3wbKvpznak2YrJTN+DMu72Sk/sYZN1Uuq5OG4ugk1K974pyzn3bbdCbMzD
wvel8xRCCAABXvSf9WtK+5JXpXaf1T/ZasgYxvuCeLoAKwNBeu0TaZWOFl2Fu7bw
MCmoimtfcgOgR9ra6/xhk7ji5NgXF73YAEZi/VyKP12NFwFZv1VzHvwtZZY+f4Nm
tAz+5hCf5uJuXTfWJXK0IKOWgVaKnjhHapiLxMfN9IUCDAMrQS6fTUExIwEQAKvO
oQV4fbOVxar9/mo+GEz4GBNE6ZqRslUtrWmFadYRgiFWW1XgGzBjbN+oGHEpNg/o
fWU2adtBa5VF9xd+xYzSrF0MkI7IBU3ScdaOo+sSLm3FRHGE+HwurVAfoB+2IJaa
xgNmCJBLYvXc2vsHiLHFO6K/uaGK8SY1MdKpM1qOKRV/CKMYdmH6Wm+zTvP9Ndw2
NHpco6+o356L4MAwIkzkVuMT64HmwCdikfjvW4+h9A3JEMpAJ3gXEpGSH7u7bdaG
+ityFklalIbtbTBTKq7PBOAgk1RdBFZaaKuO48IF4SB8uSoq2DvdbZLl3/7QsgQV
ldt0n3p2H926ze7tJewZtjV3h86glOKefBHs4giLHkaPVdiN9d4nI0aCiXNvbanX
Cc1cvYsPzzjTflG7YGOi9PMSJISTez3X+G2uUTnB5yW0b33d735sD7JNJmXkjIL0
G2NXZ/dRCkK2znQrP0tY25D6KE+qTInApP8X9HO9F2b8vaxA0XIduoti8U5Twrwg
6bKZXHVH0iqKTIERxpiB8vQlsXiFQL294HXbnvQeVq3SLGeGKVF3NXpKgq65X/sK
6Aa0861G6Ax0XH9cGiYCzq3D56sxZW2FAw8wORD80ImsospNWa3N8ci5TZh91vBA

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 24

4et/Kb8YGqu2XDJPc21YDg7/k9sHP/j/onMQwVcg0kcBFTdJnxTZCePA/1IcHU5N
2xU2dhUoB2claPnQcqN6n2beU7nzjMu5vnWRXJBbY0KkMSrCQuFJYmvWk6VUD/fl
kpx0Vnx2Ow==
=y0rp
-----END PGP MESSAGE-----  

O bloco acima é o resultado da cifragem do arquivo “teste.txt”, que contém a palavra “teste”. A string --
---BEGIN PGP MESSAGE----- identifica o início de um bloco de dados cifrado e a string -----
END PGP MESSAGE----- identifica o fim desse mesmo bloco cifrado.

Você, estudante, pode estar se perguntando: Tal mensagem não deveria estar
guardada em segredo?. Não esqueçamos que, segundo o princípio de Kerckhoffs, a
única informação que deve ser guardada em segredo é a chave (privada nesse caso).

Se a mensagem acima for transmitida por um meio inseguro e esta mesma mensagem for interceptada, é
computacionalmente impraticável chegar ao texto claro “teste”. Nesse sentido, o PGP pode ser utilizado
com uma grande margem de segurança para a transmissão de mensagens ou arquivos cifrados.

Aprenda a utilizar o PGP para Windows utilizando este link oficial da


Electronic Frontier Foundation (EFF), disponível a seguir.
http://tinyurl.com/hq28trg

Chegamos ao fim de mais uma aula! Vamos seguir estudando! Até a próxima!

Aula 17 |  TÓPICOS AVANÇADOS EM CRIPTOGRAFIA ASSIMÉTRICA

Bem-vindos a mais uma de nossas aulas. Anteriormente,


vimos os detalhes técnicos, inclusive matemáticos, do mundo
da criptografia assimétrica. Nesta aula, trataremos alguns
tópicos mais avançados sobre essa abordagem, como a
aplicabilidade dos algoritmos e uma breve descrição de
outros algoritmos dentro da criptografia de chave pública.

Diferentemente dos algoritmos de chave única, os algoritmos de chave assimétrica têm, em sua maioria,
a aplicação direta de problemas matemáticos como forma de criar uma alta margem de segurança. Não é
costume fazer uma equivalência direta e determinística do nível de segurança entre algoritmos
simétricos e assimétricos, e isso se dá pelo fato de todos eles serem computacionalmente seguros. Todos
eles possuem uma margem de segurança muito alta. Entretanto, alguns algoritmos de chave pública, e
até mesmo alguns de chave simétrica, não são diretamente aplicáveis ao mundo real, porque demandam
um alto custo computacional, demandam muito processamento.

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 25

Para exemplificar – de forma até muito ampla – a questão da aplicabilidade desses algoritmos, vamos
relembrar o conceito da “procura por números primos”. Vimos na nesta UIA um programa escrito na
linguagem Python que procura por números primos dentro de um intervalo finito de números. Um simples
teste de tempo de execução, considerando vários intervalos de busca, nos revela o seguinte resultado,
através do seguinte experimento prático: executaremos o programa em Python (cujo código-fonte está
disponível na Aula 14) e mediremos o seu tempo com o binário time, presente em praticamente todas as
distribuições UNIX. Começaremos com 10 e pularemos para 100, 1.000, 10.000 e 10.0000.
mc$ time ./primos.py 10 &>/dev/null
real 0m0.034s
user 0m0.021s
sys 0m0.011s
mc$ time ./primos.py 100 &>/dev/null
real 0m0.034s
user 0m0.021s
sys 0m0.011s
mc$ time ./primos.py 1000 &>/dev/null
real 0m0.048s
user 0m0.034s
sys 0m0.011s
mc$ time ./primos.py 10000 &>/dev/null
real 0m1.126s
user 0m1.105s
sys 0m0.016s
mc$ time ./primos.py 100000 &>/dev/null
real 1m52.098s
user 1m48.372s
sys 0m1.601s

Perceba acima que o tempo “real” para a execução do programa entre os valores 10 e 100 não varia tão
significativamente, mas o tempo quase dobra quando passamos para 10.000 ou 100.000. A execução na
busca por primos até 1.000.000 demoraria vários minutos ou até horas para finalizar.

Obviamente, o você pode se perguntar: “Em quais condições o programa foi


executado?”

Você está certo se chegou a fazer essa pergunta, porque algumas variáveis devem de fato ser
consideradas, como qual o processador utilizado, se outros programas estavam em execução, o sistema
operacional utilizado, se foi utilizado paralelismo na execução da busca pelos números primos, entre
outros fatores importantes. Uma das formas de acelerar esse processo de execução seria utilizar
paralelismo de tarefas, cuja funcionalidade é presente na linguagem Python.

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 26

Existem bibliotecas prontas para otimizar a busca por números primos,


como esta, disponível no link a seguir.
http://tinyurl.com/jbanonf

Esse experimento consequentemente demonstra – de forma simples – que uma relativa simples
operação matemática como aquela pode consumir recursos computacionais. Cabe reafirmar que, na
Matemática, não há uma fórmula ou algoritmo exato para determinar se um inteiro é primo ou é
composto, apenas métodos aproximados.

Entenda melhor a questão dos números primos acessando a página,


disponível no link a seguir.
http://tinyurl.com/hyuva9r

Assim, algoritmos de chave pública, a exemplo do RSA, que utiliza fatoração de grandes números primos,
é computacionalmente “muito custoso”, pois demanda uma grande massa de cálculos matemáticos.

Seria possível utilizar chaves assimétricas com espaços amostrais maiores que 4.096
bits, como 8.192, por exemplo? A resposta é sim.

É possível, mas seria computacionalmente e desnecessariamente “sobrecarregado” para usuários finais,


pois o custo-benefício não se justificaria, uma vez que 4.096 bits fornece um espaço amostral
computacionalmente impraticável, mesmo para os atuais supercomputadores. Portanto, a aplicabilidade
dos algoritmos assimétricos está diretamente relacionada com o tamanho de suas chaves e os tipos de
operações matemáticas a serem exaustivamente satisfeitas.
Ainda dentro da lista de criptossistemas de chave assimétrica, um outro algoritmo de chave pública que
deve ser brevemente descrito é o ElGamal. A designação deriva do sobrenome de seu inventor, o
criptólogo egípicio Taher Elgamal. Assim como o RSA, o ElGamal utiliza um par de chaves: uma chave
privada e uma chave pública. Similarmente ao RSA, a mesma mecânica se aplica ao ElGamal em termos
de uso e troca de chaves por um meio inseguro: a chave pública é utilizada para criptografia; a chave
privada, para a decifragem da mensagem.

Criptólogo egípicio Taher Elgamal. Fonte: http://tinyurl.com/zvo25mn

Pode-se afirmar que o ElGamal é derivado dos conceitos do algoritmo Diffie-Hellman. Curiosamente,
Taher Elgamal teve como seu orientador de doutorado, em meados da década de 1980, o criptólogo
Martin Hellman, um dos inventores do Diffie-Hellman. Contudo, o algoritmo de criptografia ElGamal é
baseado no problema matemático que envolve a resolução de logaritmos discretos.

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 27

Sem adentrarmos nos mínimos detalhes da criação das chaves do ElGamal, o algoritmo precisa
primeiramente escolher aleatoriamente um número primo qualquer “p > 2”. Por razões matemáticas que
já conhecemos, quanto maior esse número, menores as chances de alguém “descobri-lo ao acaso” ou
computacionalmente. Uma segunda etapa do algoritmo, não menos importante, é a escolha de um
número inteiro qualquer “x” entre 1 e (p – 1). Segundo a descrição do próprio algoritmo, “x” deve ser a
chave privada e deve ser mantido em segredo pelo seu criador. O valor “x”, em geral, deve ser utilizado
apenas uma única vez. O restante dos valores pode ser publicado.
A dificuldade em achar “x” também reside no fato das operações matemáticas envolvendo logaritmos
discretos serem tão complexas quanto fatorar grandes números primos, até mesmo
computacionalmente. Ou seja, reverter para o valor “x” a partir de “p” ou (p – 1) é computacionalmente
impraticável no ElGamal.
Além disso, o ElGamal produz diversos “textos cifrados” a partir do “texto claro”, quase na razão de 2:1, ou
seja, para um texto claro qualquer, há uma variedade enorme de “diferentes saídas”. Essa é uma
vantagem do ElGamal em comparação ao RSA.
Sobre as funcionalidades do ElGamal, ele é uma das opções de algoritmos disponíveis no PGP e para os
processos de assinatura digital como um todo. Várias aplicações o utilizam como geradores de
assinaturas digitais, conceito que veremos com maior profundidade na próxima UIA.

Você pode se aprofundar na parte dos cálculos do ElGamal através


deste link (em inglês).
http://tinyurl.com/hvlgtte

Um outro algoritmo de chave pública datado de 1979 é o Rabin, cuja designação deriva do nome de seu
inventor, o criptólogo israelense Michael Oser Rabin. Da mesma forma que o RSA, o Rabin considera o
problema da fatoração de grandes números primos, só que especialistas da área conjecturam que o
Rabin provou ser matematicamente mais forte que o RSA porque o método matemático utilizado pelo
Rabin é considerado relativamente mais eficiente.
Em termos de aplicabilidade e usabilidade, até mesmo
comparado com os demais algoritmos de chave pública
vistos até agora, o Rabin não é largamente utilizado no
mundo criptográfico. Não é possível determinar uma
razão exata para tal fato.
Nesse ponto de nossa disciplina, você, estudante, pode
perceber que há uma diferença clara entre as
abordagens de chave simétrica e assimétrica: os de
abordagem assimétrica são baseados em problemas
matemáticos – de acordo com a teoria da complexidade computacional – denominados de intratáveis,
pois são resolvidos na teoria, mas na prática requerem muito tempo para uma solução “completa”. O
problema da fatoração de números inteiros é um deles. Nesse sentido, a segurança desses
criptossistemas reside na dificuldade de uma solução prática daqueles problemas matemáticos. Então,
teoricamente, uma vez resolvidos, talvez a “segurança” do RSA, ElGamal e Rabin fique comprometida.
Finalmente, uma outra abordagem mais avançada dentro dos criptossistemas assimétricos é o que
chamamos de criptografia baseada em curvas elípticas (Elliptic Curve Cryptography). O método de
criptografia do tipo assimétrico com base em curvas elípticas (ECC) foi proposto por dois pesquisadores,
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 28

Neal Koblitz e Victor Miller, em 1985, tendo como base matemática equações envolvendo curvas
elípticas.

O interesse por este preceito se deu pelo fato de a criptografia com base em curvas
elípticas proporcionar o mesmo nível de segurança que outros algoritmos
tradicionais, mas utilizando chaves exponencialmente menores.

Esse feito simplifica o desenvolvimento de aplicativos de segurança para dispositivos móveis, como
smartphones, pagers, tablets, entre outros, que possuem um poder de processamento e armazenamento
bem limitados em comparação com outros dispositivos computacionais utilizados em nosso dia a dia.
Na prática, existem diversas formas de se implementar um algoritmo com base em curvas elípticas, mas,
em princípio, todas elas atendem à seguinte definição matemática: Uma curva elíptica no conjunto dos
números reais pode ser definida como o conjunto de pontos (x,y) que satisfaça a seguinte equação:
𝑦 8 = 𝑥 9 + 𝑎𝑥 + 𝑏
Onde a e b são constantes reais, assim como as variáveis x e y.
Matematicamente, uma curva elíptica é simétrica, o que equivale a dizer que ela possui forma reflexiva,
semelhante em ambos os eixos.
Não é necessário que você, estudante, tente resolver essa equação demonstrando todo o espaço
amostral de resoluções. É suficiente saber que dois pontos da curva que atende a essa equação são os
pontos-chave para o uso criptográfico. Sejam, pois, P = (x1; y1) e Q = (x2; y2) dois pontos distintos
tomados em uma curva elíptica E. A soma desses dois pontos forma uma curva elíptica, que é definida
pelo traçamento de uma linha que atravesse P e Q. A soma é igual a R, que é chamado ponto de reflexão,
que forma a simetria mencionada anteriormente.

A implementação de um algoritmo por ECC é dada, resumidamente, pelos seguintes


passos:
1.   Um emissor A deseja se comunicar com B através de uma mensagem M.
2.   Então, A escolhe um inteiro aleatório “a” e torna público o ponto “aP”.
3.   A mantém o número “a” em segredo.
4.   B escolhe um inteiro aleatório “k” e calcula os pontos kP e akP = (xk; yk).
5.   Um valor “k” diferente deve ser adotado para cada nova mensagem M, que agora
está associada aos pontos (m1; m2).
6.   B envia para A o ponto kP e os elementos (m1; m2) = (M1xk; M2yk).
7.   Usando sua chave secreta “a” e através do cálculo de akP, A pode obter os pontos
(xk; yk).
8.   A mensagem original M(M1; M2) pode então ser decifrada por A.

As chaves na criptografia de curvas elípticas são escolhidas para serem exponencialmente menores, com
praticamente o mesmo nível de segurança de outros algoritmos assimétricos. Sobre a segurança do ECC,
nenhuma prova matemática de dificuldade foi publicada para a criptografia de curva elíptica até hoje. Há
alguns ataques teorizados por especialistas, mas nada concreto. Entretanto, a NSA já defendeu a
tecnologia de criptografia de curva elíptica.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 29

Ainda, conquanto a patente de RSA tenha expirado, há patentes que cobrem alguns aspectos de
criptografia de curva elíptica, e seu uso ainda está relativamente restrito.

Chegamos ao final de mais uma aula. Até a próxima, aula na qual finalizaremos nossa Unidade de Interação e
Aprendizagem (UIA).

Aula 18 |  ESTUDO DE CASO: MOEDAS DIGITAIS

Bem-vindos ao final da Unidade da Interação e Aprendizagem 3. Esta é a última aula desta UIA e, nela,
abordaremos um estudo de caso que envolve o conceito de moedas digitais, ou simplesmente
cryptocurrencies. Não será objeto de estudo avaliar se as moedas digitais são ou não vantajosas, ou fazer uma
correlação de valores com outros papéis-moedas, mas sim descrevê-las do ponto de vista de segurança, de
forma abrangente. Bons estudos!

Funções criptográficas – em seu modo mais amplo – no mundo


financeiro não é necessariamente uma novidade. De fato, é até uma
necessidade de segurança, mas que vem sendo adotada lentamente
e aperfeiçoada ao longo de vários anos pelos sistemas legados de
bancos, alguns deles definitivamente muito antigos.
Com o aumento do poder computacional e da “informatização” nos
últimos 30 anos, os sistemas financeiros do mundo inteiro vêm se
adaptando à nova realidade, sobretudo em um mundo
categoricamente conectado.

Quantos de nós não utiliza o internet banking para efetuar transações financeiras,
como pagamentos e transferências via Internet?

Observe o manual de segurança para transações criado e emitido pelo


Banco Central do Brasil, disponível no link a seguir e no acervo da
disciplina.
http://tinyurl.com/h9hdxw5

A exemplo de transações financeiras tradicionais, os conhecidos boletos bancários, que geram uma
sequência de números, é um espelho de como os algoritmos em geral fazem parte do mundo financeiro.
Obviamente, os números gerados em um boleto não são o resultado de um algoritmo criptográfico em
si, mas possuem uma lógica matemática criada para facilitar a emissão desse tipo de elemento. O
resultado dos números é traduzido em um código de barras unidimensional, e esse código pode ser
utilizado em diversas aplicações para facilitar a leitura dos números.

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 30

Observe os detalhes do padrão brasileiro de boletos bancários,


disponível no documento presente no link a seguir e no acervo da
disciplina.
http://tinyurl.com/hckh3j5

Você já deve ter observado que muitos dos códigos de barras existentes hoje estão migrando para um
padrão conhecido como “QR (Quick Response) Code”, que é um código de barras bidimensional e que
pode armazenar qualquer tipo de informação. O Banco do Brasil utiliza QR Codes gerados na hora para
efetuar uma espécie de autenticação adicional em transações bancárias, pois somente o cliente
cadastrado com o aplicativo em mãos consegue efetuá-las quando o recurso está habilitado. O nome
dessa aplicação específica foi batizado de “BB Code” e utiliza o HMAC como uma de suas bases de
segurança.

Aprenda mais sobre QR Codes, acessando o link a seguir.


http://tinyurl.com/mcx5f8q

Pois bem, dentro desse amplo conceito de sistemas financeiros, insere-se o termo “moeda digital”.
Entretanto, não será objeto desta aula detalhar minuciosamente os algoritmos inventados para as
cryptocurrencies. O conceito de moeda digital é, ao mesmo tempo, simples e muito complexo, pois seu
objetivo e resultados finais são simples, mas todos os pré-requisitos envolvidos no conceito e na
implementação são bem complexos, pois não envolve somente a taxonomia e a epistemologia das
“ciências econômicas” por si só, mas também das ciências da Computação e da Engenharia como um
todo, a exemplo de considerações sobre internet, redes peer-to-peer (P2P), protocolos de redes, sistemas
distribuídos e a essencial criptografia.

Correlacionar todos esses conceitos, a fim de revolucionar a forma de como


transações financeiras são feitas, não é uma tarefa trivial.

Historicamente, pode-se afirmar que a conceitualização de moedas digitais


também não é tão nova, mas seu uso prático de fato data de 2009 até os dias
atuais. O marco histórico das moedas digitais veio com a criação de um
algoritmo complexo denominado de Bitcoin7, cujo nome deve ser familiar a
você de alguma forma. O nome Bitcoin é tão famoso que agora possui um
caractere especial dentro do conjunto Unicode. O Bitcoin foi inventado por
uma pessoa, ou um grupo de pessoas anônimas, cujo codinome ficou
mundialmente conhecido como Satoshi Nakamoto. Não se sabe até hoje
quem é seu verdadeiro inventor, se realmente existe Satoshi Nakamoto e há
dezenas de especulações de quem realmente seja ele.
De qualquer forma, Satoshi Nakamoto projetou o algoritmo Bitcoin em
2008 e o liberou em forma de código-aberto em 2009 sob a “MIT license”.

                                                                                                                       
7
Tipo de moeda digital utilizada largamente para transações financeiras sem um intermediador. Utiliza métodos criptográficos
para garantir a segurança das transações e da própria rede Bitcoin.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 31

Se você tiver maior curiosidade no aprofundamento do código-fonte do


Bitcoin, é possível obter uma cópia nesses dois repositórios oficiais nos
links a seguir.
http://tinyurl.com/p922mam
http://tinyurl.com/64w62e6

Mas o que é o Bitcoin?

Há várias maneiras de explicar seu conceito e, mais adiante, detalharemos alguns de seus aspectos mais
técnicos. A primeira definição, e talvez a mais simples, é uma forma de dinheiro, assim como o real, o
dólar e o euro, com a grande diferença de ser genuinamente digital e não ser expedido por nenhum tipo
de governo ou banco ou nação. O seu valor é assentado pelos indivíduos no mercado. Para acordos e
transações on-line, é a forma ideal de pagamento, pois é rápido, sem custo algum e provavelmente a
forma mais segura existente até hoje.
Uma segunda definição seria: é uma moeda e um sistema de
pagamento ao mesmo tempo. O usuário, dono da moeda,
guarda o seu próprio balanço. Isso equivale a dizer que o
usuário pode ser seu próprio banco, pois ele é depositante e
depositário, simultaneamente. Os usuários podem efetuar
transações entre si sem depender de um intermediário ou um
banco, independentemente de sua localização geográfica.
Similarmente ao papel-moeda, de criação exclusiva do
sistema bancário de cada país, o Bitcoin é uma moeda
imaterial, cuja forma é controlada estritamente pelo algoritmo
e pelas operações criptográficas.
Dando uma visão mais técnica, o Bitcoin é um software de código-fonte aberto, mantido por uma rede
de computadores distribuída (peer-to-peer ou P2P), onde cada dispositivo é, ao mesmo tempo, cliente e
servidor. Não há uma central, nem qualquer entidade controlando a rede. O protocolo utilizado pelo
Bitcoin é baseado em padrões criptográficos abertos e define as regras de funcionamento do sistema, às
quais todos os nós da rede devem aderir, assegurando a veracidade das transações realizadas e evitando
qualquer transgressão das regras, matemática e computacionalmente falando, pois elas são
determinísticas e não estão sujeitas a erros humanos. Entretanto, todas essas definições não podem
demonstrar que o Bitcoin é completamente seguro, pois se alguém se apoderar de sua chave privada na
rede Bitcoin, teoricamente sua “carteira” é perdida para sempre.
Acerca do conceito mais amplo de segurança do Bitcoin, os nós são o ponto central da segurança da rede
Bicoin (cujo termo será alterado para Block Chain8 mais adiante), pois alguém com poder computacional
muito grande pode, teoricamente, tomar conta de todas as verificações criptográficas, atrasando-as, o
que permite rever de volta o que o atacante gastou em Bitcoins. O termo ressarcimento não existe no
sistema de pagamento Bitcoin: uma vez enviado não há a possibilidade de reversão, pois essa é uma das
especificações do protocolo.

Como faço para começar uma carteira Bitcoin?


                                                                                                                       
8
A essência de toda a rede Bitcoin, em que todas as transações confirmadas são armazenadas. É um banco de dados único, mas
distribuído via broadcast para toda a rede Bitcoin.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 32

Toda movimentação Bitcoin começa com a criação de uma carteira, e essa carteira é “identificada” pelo
par de chaves pública e privada. Essencialmente, uma carteira é um arquivo que contém ao menos uma
chave privada, mas é protegida por uma frase-senha, e o conceito de carteira se aplica somente ao lado
“cliente”. Aqui reside um conceito importantíssimo acerca do esquema de segurança de uma carteira
Bitcoin: uma vez comprometida sua carteira, você pode perder o acesso a ela, semelhantemente ao
conceito de um par de chaves PGP.
Sobre as transações (envio ou recebimento de Bitcoins), elas devem ser identificadas por um endereço de
destino único, e esse endereço único só deve ser utilizado para aquela transação específica. A maioria dos
softwares Bitcoin e alguns sites podem ajudar nesta tarefa, gerando um endereço novo cada vez que
você criar uma solicitação de pagamento. Eles são gerados sem custo algum. Um endereço Bitcoin é um
identificador de 26 a 34 caracteres alfanuméricos, começando com o número 1 ou 3, que representa um
possível destino para um pagamento Bitcoin.

Exemplos de endereços Bitcoin:


1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2
3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy

É importante observar que o receptor dos Bitcoins poderá assinar digitalmente


que recebeu uma transferência e enviar de volta uma espécie de “confirmação”,
mas a mensagem não contém o endereço de quem enviou. Ela segue como uma
transação normal para o Block Chain após confirmada. Todas as transações Bitcoin
confirmadas são armazenadas através de uma grande carteira chamada de Block
Chain. É chamada assim porque cada bloco individual de pagamento é assinado e
verificado digitalmente por vários “mineradores”, que são computadores que
verificam as transações no Block Chain. Qualquer cliente que contenha uma
carteira pode virar um minerador, ajudando as transações na rede a ficarem mais
rápidas e consistentes. O conjunto desses computadores, de forma descentralizada, é o que caracteriza o
poder de processamento e a segurança da rede Bitcoin.
Uma vez confirmada a transação, ela passa para o Block Chain, e cada usuário adiciona ao seu “saldo”, ou
à sua carteira, os valores transferidos por qualquer outra pessoa, vindos de qualquer parte do mundo. A
integridade e a ordem cronológica do Block Chain são garantidas por processos critptográficos.

Você, estudante, pode estar se perguntando: Então, há uma espécie de anonimato nas
transações? Sim, pois cada endereço em uma transação é utilizado apenas uma vez.

Determinada pessoa pode até divulgar em sua rede social um endereço Bitcoin e alguém associar a essa pessoa,
mas isso só acontecerá uma vez. Como o endereço é gerado por hashes criptográficos, como o SHA-256 e o
RIPEMD-160, é computacionalmente impraticável determinar a quem pertence tal endereço de pagamento.
Uma cópia completa do Block Chain contém cada transação já realizada na rede Bitcoin, e essa cópia com
novas transações são enviadas via broadcast para todos os mineradores. Com essa informação, pode-se
descobrir o quanto de valor pertencia a cada endereço em qualquer momento da história da rede.
Na prática, o “bloco original” gerou um “novo bloco”, cujo hash é calculado com base no hash do bloco
anterior. Essa cadeia de hashes é o que caracteriza o Block Chain. Como o bloco é criptograficamente
seguro, ou seja, a sua integridade é garantida com o uso de algoritmos de hash, é praticamente impossível
alguém alterar algum valor na cadeia sem alterar os valores iniciais. Portanto, daí pode-se concluir que
utilizar um mesmo valor para duas ou mais transações pode gerar um problema enorme na rede Bitcoin.
Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.
CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 33

Por mais que o Bitcoin tenha sido o divisor de águas das moedas digitais modernas, há
outras implementações, inclusive algumas delas propondo melhorias no protocolo
Bitcoin. Litecoin, Auroracoin, Ripple e DigitalNote são alguns dos exemplos de outras
moedas digitais, que de uma forma geral foram derivadas do Bitcoin.

O Bitcoin tem lados vantajosos indiscutíveis, mas como toda nova moeda, sua aceitação depende da
vontade das pessoas, que, nesse caso em específico, não estão ligadas a nenhum Estado. Daí decorre que
a independência da moeda pode ficar prejudicada, já que outros mercados ou qualquer vendedor pode
simplesmente não aceitar trabalhar com Bitcoins. Entretanto, lojas on-line já perceberam a importância e
a segurança de uma moeda digital (ou cryptocurrency) quando comparada com métodos tradicionais de
pagamento e estão passando a aceitar Bitcoins diretamente, ou até mesmo indiretamente,
intermediados pelo PayPal, como um dos exemplos.
Além disso, o Bitcoin tem entrado em um lado controverso da segurança da informação por garantir até
certo ponto o anonimato dos endereços de pagamento, já que criminosos cibernéticos estão fazendo
uso massivo dessas moedas digitais para evitarem serem rastreados facilmente, característica presente
nos métodos tradicionais de pagamento. Vários desenvolvedores de Ransomware, por exemplo, exigem
o pagamento de Bitcoins para destravarem os arquivos das vítimas infectadas.

Chegamos ao final de mais uma unidade de interação e aprendizagem. Esperamos que tenham aproveitado!
Até a próxima UIA.

Você terminou o estudo desta unidade. Chegou o momento de verificar sua aprendizagem.
Ficou com alguma dúvida? Retome a leitura.
Quando se sentir preparado, acesse a Verificação de Aprendizagem da unidade no menu
lateral das aulas ou na sala de aula da disciplina. Fique atento, essas questões valem nota!
Você terá uma única tentativa antes de receber o feedback das suas respostas, com
comentários das questões que você acertou e errou.
Vamos lá?!

   

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.


CRIPTOGRAFIA: ALGORITMOS E CERTIFICAÇÃO DIGITAL | UIA 3 | 34

REFERÊNCIAS

KONHEIM, Alan G. Computer security and cryptography. USA: Wiley-Interscience, 2007.

NETWORK WORKING GROUP. RFC 4880. 2007. Disponível em <https://tools.ietf.org/html/rfc4880>


Acesso em: 3 mar. 2016.

SCHENEIR, B. Applied cryptography. New York: John Wiley & Sons, 1996.

STALLINGS, William. Criptografia e segurança de redes: princípios e práticas. Editora: Prentice-Hall,


2008.

GLOSSÁRIO

Bitcoin: Tipo de moeda digital utilizada largamente para transações financeiras sem um intermediador.
Utiliza métodos criptográficos para garantir a segurança das transações e da própria rede Bitcoin.
Block Chain: A essência de toda a rede Bitcoin, em que todas as transações confirmadas são
armazenadas. É um banco de dados único, mas distribuído via broadcast para toda a rede Bitcoin.
CSPRNG: Geradores de números pseudoaleatórios criptograficamente seguros. São algoritmos
destinados a prover a maior aleatoriedade possível utilizando como entropia recursos computacionais.
Coprimo: Chamamos números primos entre si (ou coprimos) um conjunto de números onde o único
divisor comum a todos eles é o número 1. Um conjunto de números inteiros é chamado de mutuamente
primo se não existir um inteiro maior do que 1 que divida todos os elementos. Por exemplo, os inteiros
30, 42, 70 e 105 são mutuamente primos.
Estocástico: Determinado pelas leis da probabilidade; aleatório.
LCG: Um dos mais simples geradores de números pseudoaleatórios, mas que não é apropriado para uso
criptográfico de larga escala.
PGP: Sistema de criptografia que utiliza algoritmos criptográficos bem conhecidos para cifrar mensagens
de e-mail, mas também pode ser utilizado para cifrar arquivos.
RSA: Algortimo de chave pública que utiliza um par de chaves: uma privada e uma pública. Inventado
por três criptólogos do MIT: Ronald Rivest, Adi Shamir e Leonard Adleman.

Copyright © 2016 Centro Universitário IESB. Todos os direitos reservados.

Você também pode gostar