UNIVERSIDADE FEDERAL RURAL DA AMAZÔNIAbdta.ufra.edu.br/jspui/bitstream/123456789/544/1/Introdução...
Transcript of UNIVERSIDADE FEDERAL RURAL DA AMAZÔNIAbdta.ufra.edu.br/jspui/bitstream/123456789/544/1/Introdução...
UNIVERSIDADE FEDERAL RURAL DA AMAZÔNIA
BACHARELADO EM SISTEMAS DE INFORMAÇÃO
PAULO ROBERTO SANTOS RODRIGUES
VICTOR CARVALHO BINDA
INTRODUÇÃO AO USO DE BIBLIOTECAS PYTHON VOLTADAS PARA
CRIPTOGRAFIA DE DADOS
BELÉM
2019
PAULO ROBERTO SANTOS RODRIGUES
VICTOR CARVALHO BINDA
INTRODUÇÃO AO USO DE BIBLIOTECAS PYTHON VOLTADAS PARA
CRIPTOGRAFIA DE DADOS
TRABALHO DE CONCLUSÃO DE CURSO PARA
OBTENÇÃO DO TÍTULO DE BACHAREL EM
SISTEMAS DE INFORMAÇÃO PELA
UNIVERSIDADE FEDERAL DA AMAZÔNIA -
UFRA.
BELÉM
2019
Rodrigues, Paulo Roberto Santos
Introdução ao uso de bibliotecas Python voltadas para criptografia de dados / Paulo Roberto Santos Rodrigues, Victor Carvalho Binda. - Belém, 2019.
58 f.
Trabalho de Conclusão de Curso (Bacharelado em Sistemas de Informação) – Universidade Federal Rural da Amazônia, 2019. Orientador: Dr. Licinius Dimitri
Sá de Alcantara
1. Criptografia 2. Segurança da informação 3. Python I. Título. II.
Binda, Victor Carvalho III. Alcantara, Licinius Sá de (orient.)
CDD – 005.82
PAULO ROBERTO SANTOS RODRIGUES
VICTOR CARVALHO BINDA
TRABALHO DE CONCLUSÃO DE CURSO PARA
OBTENÇÃO DO TÍTULO DE BACHAREL EM
SISTEMAS DE INFORMAÇÃO PELA
UNIVERSIDADE FEDERAL DA AMAZÔNIA -
UFRA.
Orientador: Prof. Dr. Licinius Dimitri Sá de Alcantara
A banca examinadora dos Trabalhos de Conclusão, em sessão pública
realizada em _____/_____/_____, considerou os candidatos:
1) Examinadora: MSc. Decíola Fernandes de Sousa
2) Examinador: Dr. Fábio de Lima Bezerra
3) Orientador: Dr. Licinius Dimitri Sá de Alcantara
AGRADECIMENTOS
Em primeiro lugar eu gostaria de agradecer a Deus por ter posto pessoas boas
em minha vida e por me guiar até aqui, com forças suficientes para que eu não desistisse em
situações difíceis. Gostaria de agradecer principalmente aos meus pais, Paulo R. Souza
Rodrigues e Maria S. dos Santos, por serem um apoio crucial durante minha vida acadêmica.
Aos meus amigos, de classe e de estágio que me proporcionaram momentos
inesquecíveis e que favoreceram o meu aprimoramento como pessoa. Aos meus queridos
supervisores de estágio, Durvalino de Souza Brito, gerente da Divisão de Patrimônio desta
universidade, e André Luiz Bizerra, gerente da Gerência de Tecnologia da Informação, da
Agência de defesa Agropecuária do Pará - ADEPARÁ, que mais que mentores e conselheiros
referente às tarefas diárias que um profissional deve encarar, se tornaram bons amigos e
puderam contribuir de diversas maneiras com este trabalho. Daniele Cardoso, minha namorada,
que esteve sendo meu suporte para transpor essa caminhada de forma mais tranquila e suave.
Ao meu parceiro deste trabalho e amigo, Victor Carvalho Binda, que esteve
próximo neste percurso desde os primeiros semestres do curso, e que somado a este trabalho,
participou de numerosos outros, também com muito empenho e dedicação. Agradeço também
a sua companheira, Naiara Bissi, que nos manteve sempre focados e atentos aos nossos deveres,
e por se doar a esta tarefa muito além do que lhe era preciso.
E por fim e não menos importante ao nosso orientador Prof. Dr. Licinius
Dimitri Sá De Alcantara, que acolheu nosso pedido de bom grado e nos auxiliou a desenvolver
este trabalho pacientemente e nos guiando com o método adequado. E a todos os nossos
professores e professoras que investiram tempo e esforço para nos aperfeiçoar como
profissionais éticos e responsáveis para com a sociedade.
Paulo Roberto Santo Rodrigues
Primeiramente gostaria de agradecer a Sra. Maria Dalva S. Carvalho, minha avó,
a qual dedico este trabalho e agradeço todos os dias, pelo exemplo de perseverança,
honra e dignidade, que esteve ao meu lado este tempo inteiro me dando apoio, conselhos
com todo amor do mundo.
Aos meus pais, Giselle Carvalho e Pedro Moreira, que sempre me deram
suporte e todas as condições possíveis para que este dia chegasse, investindo e
acreditando na minha educação. Aos meus familiares, Miríades Magrinelli, Roberto
Magrinelli, Paulo Carvalho, Paula Carvalho, Cindy Magrinelli, Luiggi Magrinelli,
Kamilly Carvalho e Ana Laura Carvalho. Todos vocês são parte desta vitória, sem vocês
isso jamais seria possível. A minha família de Araruna, a qual me deu incentivo a
continuar em frente, aos meus avós Ligia Binda, Sady Binda e todos tios, primos e
parentes meu muito obrigado.
A minha namorada, a pessoa que mais se dedicou a aprender sobre
criptografia nos últimos meses, Naiara Bissi, que não tenho palavras para agradecer por
todo o apoio incondicional, se não fosse por você este trabalho talvez não estivesse
assim, ouvindo nossos lamentos de cansaço em meio a rotina corrida, outros problemas,
mudanças, que resistiu a tudo junto comigo, passando incansáveis horas de leitura e
estudo, a qual ouviu todos os minhas reclamações (que não foram poucas). Obrigado
por tudo, hoje e sempre.
Aos meus amigos, que puderam me ensinar tanto, só tenho a agradecer a todos
que percorreram essa caminhada até aqui. Amanda Viveiros, Arthur Sampaio, Athos
Sampaio, Augusto Sobral, Bruno Porpino, Cassia Mendes, Dayvison Portal, Felipe
Hage, Felipe Salgado, Fernanda Porpino, Fernando Silva, Helder Bitar, Higo Cardoso,
Jamir Palheta, Karoline Dieckmann, Lanna Lacerda, Leticia Miziara, Marcos Jorge,
Nathalia Luz, Nohan Gonzales, Paulo Godinho, Pedro Cardoso, Raphael Lucena, Samir
Fraiha, Tania Raiol, Tarik Coelho, Thabata Ferreira, Tiago Maia, Yuri Silva e a toda
familia Animazon.
E por último e não menos importante as pessoas que ajudaram a realizar este
trabalho, meu amigo e companheiro de equipe Paulo Rodrigues e o nosso orientador
Licinius Alcântara, que aceitou este desafio, nos auxiliando com toda paciência para
que pudéssemos concluir de forma satisfatória as etapas. A todos os professores da
universidade que sempre nos incentivaram e nos ajudaram a buscar nosso melhor. Muito
obrigado.
Victor Carvalho Binda
RESUMO
Este trabalho se propõe a realizar o estudo da história da criptografia, bem
como alguns de seus principais tipos, assim como apresentar técnicas para introdução ao uso
do software Python e algumas bibliotecas de criptografia criadas para o desenvolvimento e o
aprimoramento das ferramentas de segurança da informação. O intuito do mesmo é facilitar o
acesso ao conhecimento e a utilização aos usuários iniciantes em criptografia, reconhecer
problemáticas, bem como trazer novas perspectivas aos que já estão habituados a outras
linguagens. Exemplificaremos desde sua instalação, assim como possíveis falhas, formas de
utilização e aplicações.
Palavras chaves: criptografia; segurança da informação; python.
ABSTRACT
This work proposes to perform a study of the history of cryptography,
describe some of its main types and present an introduction to techniques for using Python
software and some cryptographic libraries, created for the development and improvement of
information security tools. The purpose of this work is to facilitate the access to the knowledge
and use for beginners in cryptography, recognize problems, and to bring new perspectives for
those who are already used to other languages as well. We will exemplify from its installation,
as well as possible failures, ways of use and applications.
Keywords: cryptography; data security; Python.
LISTA DE SIGLAS, SÍMBOLOS E ABREVIATURAS
AAAC
AES
ASCII
CBC
CMD
CWI
DES
EFF
FBI
FIPS
HMAC
IBM
IDE
INC
NBS
NEMA
NIST
NSA
ONG
PGP
SO
UTF-8
XOR
Associação Americana de Avanços da Ciência
Advanced Encryption Standard
American Standard Code for Information Interchange
Cipher-block chaining
Command Prompt
Centrum Wiskunde & Informatica
Data Encryption Standard
Eletronic Frontier Foundation
Federal Bureau of Investigation
Federal Information Processing Standard
Hash-based Message Authentication Code
International Business Machines
Integrated Development Environment
Instituto Nacional de Criminalística
National Bureau of Standards
NEue MAschine (“New Machine”)
National Institute of Standards and Technology
National Security Agency
Organização Não Governamental
Pretty Good Privacy
Sistema Operacional (“Operating System”)
8-bit Unicode Transformation Format
Exclusive Or
LISTA DE FIGURAS
Figura 1. Dados de interesse por cada linguagem de programação de 2014 a 2018. ..............
Figura 2. Dados das buscas pelo período de 2014 a 2018 por cada linguagem (...). ............
Figura 3. Mapeamento global de buscas por linguagens de programação de 2014 a 2018.
Figura 4. Gráfico de crescimento das principais linguagens de programação. .....................
Figura 5. Texto apresentado ao final dos chats iniciados no aplicativo de mensagens (...).
Figura 6. Cifrar (ou codificar) significa transformar uma informação comum em (...). .......
Figura 7. Exemplo da cifra de César, também conhecida como cifra de troca (...). .............
Figura 8. Exemplo da cifra de Bacon e sua representação binária. .......................................
Figura 9. Comparativo dos resultados das somas dos números binários. .............................
Figura 10. Relação entre letras e símbolos do código Braille. ..............................................
Figura 11. Alfabeto Morse. ...................................................................................................
Figura 12. Uma das máquinas Enigma. .................................................................................
Figura 13. Esquema de funcionamento da máquina Enigma. ...............................................
Figura 14. Esquema de funcionamento da estrutura do algoritmo DES. ...............................
Figura 15. Sistema de substituição da cifra de feistel. ...........................................................
Figura 16. Demonstração dos bits de distribuição dentro das S-Boxes. ...............................
Figura 17. Exemplificação de uma sequência de agrupamento de bits de uma S-Box. ........
Figura 18. Matriz de 16 bits (4X4), padrão do processo de encriptação AES. .....................
Figura 19. Demonstração da tabela verdade do XOR. ..........................................................
Figura 20. Demonstração do processo de aplicação do XOR nas matrizes de entrada (...).
Figura 21. Processo de mixagem para se gerar novas chaves a partir da chave inicial (...).
Figura 22. Exemplificação do processo de aplicação do XOR na última coluna. ................
Figura 23. xOR da primeira coluna da chave anterior com a última coluna da chave atual.
Figura 24. Processo de Confusão - S-Box para substituição dos dados da matriz. ...............
Figura 25. Processo de difusão em “empurrar” os bits para fazer a mistura de bits da (...).
Figura 26. Exemplo do layout do TrueCrypt. ........................................................................
Figura 27. Instalação da biblioteca Cryptography em Windows. ..........................................
Figura 28. Erro para atualização do pip. ...............................................................................
Figura 29. Sucesso ao atualizar o pip. ...................................................................................
Figura 30. Erro ao instalar o PyCrypto no Windows. ...........................................................
Figura 31. Atualização do pip por meio do cmd. ..................................................................
13
14
14
15
16
16
18
19
19
20
21
22
23
27
28
28
29
34
35
35
35
36
36
37
37
39
42
42
42
42
43
Figura 32. Instalação do cryptodome em Windows. .............................................................
Figura 33. Janela da área de configurações de instalação. ...................................................
Figura 34. Janela de instalação nova ou reutilizada. ............................................................
Figura 35. Área inicial do PyCharm. ....................................................................................
Figura 36. Tela de criação de novo projeto. .........................................................................
Figura 37. Tela para nomeação de um novo projeto. ...........................................................
Figura 38. Tela do local de pacotes instalados no momento. ...............................................
Figura 39. Tela de instalação de pacotes e suas versões. ......................................................
Figura 40. Aviso de instalação bem sucedida. ......................................................................
43
44
45
45
46
46
47
47
48
LISTA DE TABELAS
Tabela 1. Escalonamento de possibilidades por bits. .............................................................
Tabela 2. Demonstração de uma estrutura de um código Fernet. ...........................................
Tabela 3. Resultados obtidos do código Fernet. ....................................................................
Tabela 4. Código gerado por PyCrypto por meio do PyCharm em plataforma Linux. ..........
40
49
50
52
SUMÁRIO
1. METODOLOGIA ..................................................................................................
2. OBJETIVO .............................................................................................................
3. CRIPTOGRAFIA ..................................................................................................
3.1. Criptografia e seu contexto histórico ................................................................
3.1.1. Criptografia Manual ...............................................................................
3.1.2. Criptografia por Máquina .......................................................................
3.1.3. Criptografia por Software .......................................................................
3.1.3.1. Data Encryption Standard (DES) ...............................................
3.1.3.1.1. Análise do Algoritmo .....................................................
3.1.3.2. Advanced Encryption Standard (AES) .......................................
3.1.3.2.1. Análise do Algoritmo .....................................................
3.1.3.2.2. Aplicações ......................................................................
4. PYTHON CRYPTOGRAPHY ..............................................................................
4.1. História ..............................................................................................................
4.2. Instalação ...........................................................................................................
4.2.1. Instalação Via CMD ...............................................................................
4.2.2. Instalação Via PyCharm .........................................................................
4.3. Exemplo de Criptografia Utilizada pelo Python Cryptography .........................
4.4. Exemplo de Criptografia Utilizada pelo Python PyCrypto ...............................
5. CONSIDERAÇÕES FINAIS .................................................................................
6. REFERÊNCIAS .....................................................................................................
12
13
16
17
18
21
25
25
27
32
35
39
41
41
41
42
44
48
51
54
55
INTRODUÇÃO
A todo momento são desenvolvidas ferramentas que visam a proteção no
mundo digital. Em contrapartida, são criados métodos que contornam essas medidas de
segurança. Essa rotina se faz presente desde tempos remotos - onde a cítala grega era usada
para transferir mensagens em uma cinta que precisava ser enrolada em um bastão de
determinada espessura para ser escrita e depois ser decifrada pelo destinatário através de outro
bastão de mesma espessura1 -, até os dias de hoje - onde o incrível poder de um computador
quântico, tecnologia ainda nos seus primeiros passos, coloca em risco de quebra todos os
mecanismos criptográficos mais atuais.2 “Para a criptografia de chave pública, os danos
causados por computadores quânticos serão catastróficos.”2 (CHEN; Lily, 2017. Encontro
anual da AAAC - Associação Americana de Avanços da Ciência.).3
Embora a humanidade já tenha experimentado diversas metodologias de
segurança aplicadas nos mais diversos âmbitos da vida, com o advento da internet torna-se cada
vez mais uma tarefa crucial manter informações em um ambiente controlado e seguro. O
usuário comum - consumidor final destes serviços - está frequentemente exposto a ataques
cibernéticos, exigindo uma resposta rápida de sistemas de segurança. A Gartner, Inc., empresa
de consultoria fundada em 1979 por Gideon Gartner, previu que em 2017 mais de 8,4 bilhões
dos mais diversos tipos de dispositivos estariam conectados e em uso ao mesmo tempo por todo
o mundo e afirma que estes números chegarão a 20,4 bilhões em 2020.4
Dessa forma, o trabalho pretende contribuir no aprimoramento do
conhecimento dos usuários iniciantes em criptografia de dados, auxiliando no desenvolvimento
e na implementação de novas aplicações com foco na linguagem de programação Python,
utilizando sua biblioteca para encriptação: Python Cryptography e PyCrypto.
1 ALVARENGA, Luiz Gonzaga de. Criptografia Clássica e Moderna. p. 17 2 Microsoft News Center Brasil. O futuro é quântico: Microsoft libera preview gratuito do Kit de Desenvolvimento
Quântico. 2017. Disponível em: <https://news.microsoft.com/pt-br/o-futuro-e-quantico-microsoft-libera-preview-
gratuito-kit-de-desenvolvimento-quantico/>. Acesso em: 29 de janeiro de 2019. 3 VAMOSI, Robert. Artigo. Mind The Gap - How Quantum Computers May Leave Today's Online Services
Vulnerable. 2018. Disponível em: <https://www.forbes.com/sites/robertvamosi/2018/02/27/mind-the-gap-how-
quantum-computers-may-leave-todays-online-services-vulnerable/#4574e35852ce>. Acesso em: novembro,
2018. 4 PWC. Uncovering the potential of the Internet of Things. 2017. Disponível em: <
https://www.pwc.com/gx/en/issues/assets/pwc-GSISS-2017-uncovering-the-potential-of-iot.pdf>. Acesso em:
novembro, 2018.
12
1. METODOLOGIA
O papel deste trabalho de pesquisa é ser um ponto de partida para
pesquisadores da área de criptografia, tendo em vista a escassez de material específico de
linguagem acessível sobre o assunto em nosso idioma e de forma ampla. Com este objetivo,
desenvolvemos uma pesquisa descritiva que poderá ser vista como um manual básico de
criptografia, no qual será possível encontrar sua história, a descrição de tipos de algoritmos,
aplicações e exemplos na linguagem de programação.
Buscaremos compreender de forma qualitativa a evolução da criptografia, as
motivações de sua criação e desenvolvimento ao longo do progresso humano e tecnológico e,
assim, trazer este conhecimento para o usuário contemporâneo de forma simplificada. Para tal,
realizamos uma análise bibliográfica aprofundada sobre os tópicos que seriam abordados, de
forma a selecionar os fatos relevantes e entrar em um consenso sobre os fundamentos históricos
apresentados.
Paralelamente, buscamos a exploração do tema a partir do conteúdo
disponível nos mais diversos sites, sendo eles em forma de vídeos didáticos, artigos acadêmicos
e até mesmo explicações realizadas por meio de artes e desenhos em quadrinhos. Abordaremos
o assunto de forma prática, aplicando os conceitos estudados em testes-exemplos realizados no
python - objeto de estudo por ser uma das linguagens de programação mais promissoras do
momento.
Os principais autores que serviram como referência para este trabalho foram:
Bruce Schneier, Claude Shannon, Joan Daermen, Vicent Rijrmen e Viktoria Ktokz.
13
2. OBJETIVO
Este trabalho se deu origem ao perceber a formação de uma mudança em
relação a muitos alunos dos cursos de Bacharelado em Sistemas de Informação e Licenciatura
em Computação na Universidade Federal Rural da Amazônia estarem optando por Python ao
invés do tradicional Java, que é lecionado e utilizado como parte das avaliações semestrais.
Embora Python não fosse parte obrigatória das disciplinas, quando era permitido, os discentes
a utilizavam por considerarem de mais simples entendimento e desenvolvimento em suas
atividades, o que é uma verdade, visto que Python é utilizada para iniciar crianças e jovens à
prática da programação.
Ademais, não é à toa que de acordo com o Google Trends (fevereiro de 2014
- janeiro de 2019), no Brasil nos últimos anos as buscas pela linguagem de programação Java
vêm decaindo, conforme mostra a Figura 1, e relativamente se equiparam às pesquisas de outras
linguagens, como Python, PHP, JavaScript e C, naturalmente estas são as linguagens de
programação mais requisitadas no mercado.5
Figura 1: Dados de interesse por cada linguagem de programação de 2014 a 2018. Fonte: Google
Trends.
Em contrapartida as pesquisas em âmbito global, apresentam um
crescimento maior nas buscas por Python em países tecnologicamente desenvolvidos.6
5 DEVMIDIA. .Artigo Top 10 linguagens de programação mais usadas no mercado. Disponível em: I
<https://www.devmedia.com.br/top-10-linguagens-de-programacao-mais-usadas-no-mercado/39635> . Acesso
em: 29 de janeiro de 2019. 6 KUHNEN, Matheus. Top10 linguagens de programação mais usadas no mercado. 2018. Disponível em:
<https://www.devmedia.com.br/top-10-linguagens-de-programacao-mais-usadas-no-mercado/39635>. Acesso
em: 30 de janeiro de 2019.
14
Figura 2: Dados das buscas pelo período de 2014 a 2018 por cada linguagem de programação. Fonte:
Google Trends.
Figura 3: Mapeamento global das buscas por linguagens de programação realizadas no Google entre
2014 a 2018. Fonte: Google Trends.
Em 2017 o Stack Overflow7 realizou uma pesquisa em países considerados
ricos de acordo o Banco Mundial, essa pesquisa consiste em medir a tendência em que tais
países visitam diferentes conjuntos de tecnologias em relação ao resto do mundo. Python se
destaca pelo seu crescimento em país de alta renda, esta percepção é mais evidente do que em
pesquisas realizadas em outros rankings que mensuram e consideram o desenvolvimento de
software.
7 ROBSON, David. The Incredible Growth of Python. Disponível em:
<https://stackoverflow.blog/2017/09/06/incredible-growth-python/>. Acesso em: 30 de janeiro de 2019.
15
O estudo inicia discorrendo sobre dados de visualizações em Python no final
de 2011 e, no período de 2011 a 2017, podemos perceber a evolução da linguagem Python em
relação a outras cinco principais linguagens de programação. O gráfico da Figura 4 possui seis
das dez buscas mais visitadas no Stack Overflow em países de alta renda.
Figura 4: Gráfico de crescimento das principais linguagens de programação. Fonte: Medium.
Disponível em: < https://stackoverflow.blog/2017/09/06/incredible-growth-python/>. Acesso em: 28 de janeiro
de 2019.
16
3. CRIPTOGRAFIA
A criptografia nada mais é que um conjunto de princípios e técnicas
utilizadas para cifrar uma determinada escrita, tornando-a ininteligível para terceiros que não
tenham acesso e, assim, criando um meio de comunicação segura.8 “Cripto” vem da palavra
grega kryptos, significando “oculto; secreto; obscuro” e “grafia”, por sua vez, vem da palavra
grega graphein, que significa “escrever”. Criptografia, portanto, significa etimologicamente:
escrita escondida; escrita oculta.9
Sendo pouco conhecida e até mesmo erroneamente confundida com práticas
espíritas como a psicografia, poucos se dão conta de como a criptografia está extremamente
presente e vinculada ao funcionamento prático da vida moderna, protegendo nossas
informações e mantendo em sigilo dados confidenciais. Discretamente presente desde
mensagens de aplicativos de mensagens privadas até senhas de cartões de crédito, QR Codes,
transações bancárias ou de criptomoedas, telefones celulares, computadores, (…), a criptografia
é uma peça fundamental para assegurar segredo, autenticidade e garantir privacidade aos
usuários.
Figura 5: Texto apresentado ao final dos chats iniciados no aplicativo de mensagens instantâneas para
smartphones conhecido como Whatsapp, tendo um bilhão usuários ativos por dia espalhados por todo o mundo.10
Fonte: acervo próprio.
Qualquer informação pode ser criptografada - seja ela escrita, áudio ou
imagem. Resumidamente, códigos protegem informações, substituindo-as por códigos pré-
8 MORENO, E.; PEREIRA, F.; CHIARAMONTE, R. Criptografia em Software e Hardware. Novatec Editora,
2005, p. 21. 9 Dicio, Dicionário Online de Português. Disponível em: <https://www.dicio.com.br/criptografia/>. Acesso em:
novembro de 2018. 10 G1, Globo. WhatsApp atinge marca de 1 bilhão de usuários ativos por dia. Disponível em:
<https://g1.globo.com/tecnologia/noticia/whatsapp-atinge-marca-de-1-bilhao-de-usuarios-ativos-por-dia.ghtml>.
Acesso em: novembro de 2018.
17
definidos os quais somente o remetente e o destinatário deverão possuir a chave de acesso para
a descriptografar.
Figura 6: Cifrar (ou codificar) significa transformar uma informação comum em um texto secreto.
Decodificar, por sua vez, é a operação inversa: transformar o texto secreto cifrado de volta à informação original.
Fonte: acervo próprio.
Devido à este caráter sigiloso e enigmático, até recentemente a criptografia
e a criptoanálise eram consideradas uma arte - dominada somente por gênios da matemática ou
especialistas da área de informática. Foi somente à cerca de vinte anos que o estudo de ambas
ganhou o nome de criptologia e passou a ser considerada uma ciência.11
3.1. Criptografia e seu contexto histórico
A criptologia como ciência está apenas saindo da adolescência e, por esse
exato motivo, é comum se pensar que a criptografia é algo recente. Todavia, esta prática é
provavelmente tão antiga quanto a própria escrita, se fazendo presente desde o sistema de
escrita hieroglífica dos egípcios. Segundo Kahn (1967)12 - um dos papas da história da
comunicação secreta -, a primeira referência de escrita criptográfica data de 1900 a.C., da vila
egípcia Menet Khufu, próxima ao rio Nilo, onde o escriba responsável por registrar as
informações das construções realizadas pelo arquiteto Khnumhotep II para o faraó Amenemhet
II decidiu substituir - por sigilo ou talvez apenas por estética - palavras e trechos de seus textos
por hieróglifos distintos dos usuais, de forma que somente quem possuísse este conhecimento
poderia compreender as mensagens. “Caso o documento fosse roubado, o ladrão não
11 TKOTZ, Viktoria. Criptografia. Segredos Embalados para Viagem. Novatec Editora, 2003, p. 16. 12 MORENO, E.; PEREIRA, F.; CHIARAMONTE, R. Criptografia em Software e Hardware. Novatec Editora,
2005, p. 22.
18
encontraria o caminho que o levaria ao tesouro e morreria de fome perdido nas catacumbas da
pirâmide.” (MORENO; PEREIRA; CHIARAMONTE, 2005).
Mesmo que os hieróglifos não tenham sido usados propriamente como forma
de esconder segredos, essa substituição de símbolos pode ser considerada o primeiro contato
com a criptografia conhecido na história - tendo o tempo sido responsável pelo esquecimento e
ocultação dos significados. Muitos anos depois, foi por meio da criptoanálise do francês
Champollion que estes hieróglifos puderam ser desvendados.
Os hieróglifos surgem como um tipo de criptografia feita manualmente, por
substituição, evoluindo a partir daí para métodos cada vez mais complexos. BORGES (2005)13
divide a história da criptografia em três fases distintas: a criptografia manual, a criptografia por
máquinas e a criptografia em rede.
3.1.1. Criptografia Manual
A criptografia manual abrange todos os métodos anteriores à Segunda
Guerra Mundial. Estas técnicas se caracterizam por utilizar lápis e papel e podem ser decifradas
da mesma forma, tendo caído em desuso com o advento dos computadores por se tornarem
extremamente fáceis de desvendar. O primeiro registro que se tem da criptografia manual data
de impressionantes 1500 a.C., na Mesopotâmia. Escrita com caracteres cuneiformes (feitas a
partir de objetos em formato de cunha) num pequeno tablete de argila, esta cifra contém a
primeira fórmula conhecida pelo homem, contendo explicações de como fabricar esmalte para
louças.
O exemplo mais comum desse tipo de criptografia data de 50 a.C., quando
Júlio César usou a cifra de substituição com o objetivo de proteger e assegurar o sigilo
comunicações governamentais. Para realizar sua cifra César alterou letras do alfabeto as
substituindo pela terceira letra que viria após a letra escolhida. Dessa forma, A se tornaria D,
que se tornaria H, que se tornaria L e assim por diante. Como reforço, também substituía as
letras latinas por gregas. Este método, criado na antiguidade e descrito pelo escritor romano
Suetônio, ainda é utilizado até hoje, como em sistemas como o ROT13.14
13 BORGES, Waldizar. Criptografia. Universidade Católica de Brasília, 2014, p. 6. 14 ROT 13. Disponível em: <http://www.dantas.com/rot13/> Acesso em: 29 de novembro de 2018.
19
Figura 7: Exemplo da cifra de César, também conhecida como cifra de troca, código de César ou troca de
César. Fonte: Wikiwand <http://www.wikiwand.com/pt/Cifra_de_C%C3%A9sar>.
Nos dias atuais, o código de César se refere a qualquer cifra em que cada
letra da mensagem original é substituída por um outra através da deslocação de um número fixo
qualquer de posições. Levando em conta que o alfabeto romano possui 26 letras, há 26
possibilidades de códigos de César - os quais uma simples criptoanálise estatística será capaz
de decifrar.
Outro exemplo bastante conhecido entre as cifras manuais é a cifra de Bacon,
criada em meados do século XVI. O filósofo, escritor, político inglês, considerado o fundador
da ciência moderna, Francis Bacon, criou seu sistema de substituição utilizando um sistema
binário. Diferentemente de César, utilizou um alfabeto de 24 letras, atribuindo para cada um
grupo de 5 caracteres compostos somente pelas letras “a” e “b”. Como os grupos são formados
por 5 letras e cada caractere possui duas possibilidades (a ou b), pode-se gerar 25grupos,
representando 32 letras distintas. Uma outra forma de escrever a cifra de Bacon é associando
as letra a “0” e “1”:
Figura 8: Exemplo da cifra de Bacon e sua representação binária. Fonte: BORGES, Waldizar. Criptografia.
Universidade Católica de Brasília, 2014, p. 3.
20
No nosso sistema de numeração, temos os números de 0 a 9. Quando
passamos desse valor, 9+1, colocamos o 1 na frente seguido por um 0, reiniciando o processo.
No sistema binário, no entanto, utilizamos somente 0 e 1, de forma que para somar 1 + 1
colocamos 1 e 0, ficando com 10. Seguindo o mesmo pensamento, 3 será 10 + 1 = 11, enquanto
4 será 11+1 = 100. Dessa forma:
Figura 9: Comparativo dos resultados das somas dos números binários. Fonte: CAMPOS, Alexandre. Cifra
de Bacon, 2012. Disponível em: <http://www.alexandrecampos.com/2012/03/cifra-de-bacon.html>. Acesso em:
19 de dezembro de 2018.
Como este código pode vir a se tornar de fácil dedução por ser bastante
perceptível como código, pode-se utilizar outros padrões em conjunto para o tornar mais
complexo, como a associação de letras maiúsculas e minúsculas, ou alternância entre negrito e
itálico.
Outro exemplo de criptografia manual, bastante presente ainda nos dias
atuais, é o código de Braille, criado por Louis Braille (1809-1852) em seus 15 anos. Este código
se trata de um sistema de símbolos onde cada caractere é formado por uma matriz de 6 pontos
táteis posicionados de formas distintas. Existem diversos dispositivos para este tipo de escrita,
como teclados especiais, uso de voz artificial, máquinas de escrever, etc.
21
Figura 10: Relação entre letras e símbolos do código Braille. Fonte: BORGES, Waldizar. Criptografia.
Universidade Católica de Brasília, 2014, p. 4.
3.1.2. Criptografia por Máquinas
A criptografia por máquina por sua vez surge durante o período da Segunda
Guerra Mundial, correspondendo a todos os sistemas que se utilizam de um operador de
máquinas que, por meio de uma tabela, pode enviar mensagens criptografadas para pessoas
distantes.
O mais conhecido destes códigos é, sem dúvidas, o código Morse, criado por
Samuel Morse (1791-1872) em 183515. Para a criação deste código, originalmente, Morse
propôs realizar a enumeração de todas as palavras da língua de forma que estes números
pudessem ser transmitidos através de um telégrafo16 para um determinado receptor, que as
decifraria se utilizando de um enorme dicionário.
Posteriormente, o código foi definido como conjuntos de pontos e traços que
teriam como significado cada uma das letras do alfabeto. Estes pontos e traços poderiam ser
transmitidos por meio de escrita, sons ou até mesmo sinais luminosos. Utilizando-se do
telégrafo, uma espécie de lápis de ferro movido por uma bobina marcava instantaneamente os
sinais recebidos em um papel por meio de sons curtos (os chamados “DIT”) e longos (os
chamados “DAH”), sendo os "DAH" três vezes mais longos que os sons curtos. Considerando-
se a média de pausas geradas pela formação do código, através desse método é possível
transmitir dez palavras por minuto.
15 TodaMatéria, O que é Código Morse? Disponível em: <https://www.todamateria.com.br/o-que-e-codigo-
morse/>. Acesso em: 04 de janeiro de 2018. 16 Dispositivo que utiliza correntes elétricas para controlar eletroímãs que atuam na emissão e na recepção de
sinais. Morse Code & the Telegraph. Disponível em: <https://www.history.com/topics/inventions/telegraph>
22
Figura 11: Alfabeto Morse. Fonte: TodaMatéria, O que é Código Morse? Disponível em:
<https://www.todamateria.com.br/o-que-e-codigo-morse/>. Acesso em: 04 de janeiro de 2018.
Para a marcação da passagem de letras tempos precisos eram utilizados: uma
pausa curta equivalente a três “DIT”. Enquanto isso, uma pausa maior, equivalente a sete
“DIT”, serviria para sinalizar a finalização da palavra. O Código Morse teve sua versão final
definida em 1851, se tornando então a primeira forma de se comunicar a distância em tempo
real, revolucionando as comunicações marítimas e terrestres e trazendo para a criptologia um
novo desafio: a comunicação secreta em rede aberta.
Com o início da Segunda Guerra Mundial, o desafio da criptografia se tornou
ainda maior, uma vez que o desenvolvimento de tecnologias para fins militares se tornou peça
fundamental. Armamentos especiais, aviões, submarinos, dispositivos de comunicação e
transmissão como rádios e radares. Todos estes dispositivos viriam a requerir um sistema
cifrante que garantisse o sigilo das informações compartilhadas. Dessa forma, máquinas
produtoras de códigos combinatórios passaram a ser criadas, equipadas com rotores
criptográficos - e dentre as mais famosas e significativas delas estão as máquinas Enigma - um
teclado conectado a uma unidade codificadora -, incorporadas às forças alemãs nos anos 20.17
O primeiro modelo da máquina Enigma foi desenvolvida em 1915 pelo
holandês Hugo Alexander Koch, tendo sido patenteada três anos depois por Arthur Scherbius,
empresário alemão que a comercializou para bancos, empresas e, em 1926, após muitas
melhorias, para a própria marinha alemã. O exército veio a se interessar em 1928 e as forças
aéreas somente em 1935.18
17 Brasil Escola, Máquina Enigma. Disponível em: <https://brasilescola.uol.com.br/historiag/maquina-
enigma.htm> Acesso em: 05 de janeiro de 2019. 18 ELLIS, Claire. Exploring the Enigma. Disponível em
<http://plus.maths.org/content/os/issue34/features/ellis/index>. Acesso em: 05 de janeiro de 2019
23
Figura 12: Uma das máquinas Enigma. Fonte: REUVERS, Paul; SIMONS, Marc. Enigma Cipher Machine (em
inglês). Disponível em <http://www.cryptomuseum.com/crypto/enigma/>. Acesso em: 05 de janeiro de 2019.
O segredo da máquina Enigma estava em seus rotores. Possuindo 5 opções
destes discos rotativos equipados com 26 possibilidades de letras cada, o operador deve escolher
três e os instalar cada um na máquina em uma das suas possíveis 26 posições. Após cada tecla
digitada da mensagem no teclado QWERTY, um rotor seria utilizado e mudaria uma posição
passando para o próximo. Ao passar uma vez por cada rotor, o Enigma refletiria a ordem,
voltando entre os rotores, de forma que o sinal de cada letra passaria duas vezes por cada rotor.
Esse sistema por si só garantia que cada letra possuísse um alfabeto distinto de substituição e,
com três rotores, 26 x 26 x 26 = 17567 possibilidades de posições iniciais ou “chaves”. No
entanto, além dos rotores, o Enigma ainda permitia que letras fossem trocadas através de 6
cabos que poderiam ser conectados a um painel de plugues, o que resultaria no final em 10
quintilhões de possibilidades de combinações. Após este processo ser finalizado, a letra
criptografada resultante apareceria acesa em um painel luminoso.
24
Figura 13: Esquema de funcionamento da máquina Enigma. Fonte: STILL, Albert. Understanding the Enigma
machine with 30 lines of Ruby. Star of the 2014 film ‘The Imitation Game’ (em inglês). Disponível em:
<https://blog.red-badger.com/2015/02/23/understanding-the-enigma-machine-with-30-lines-of-ruby-star-of-the-
2014-film-the-imitation-game>. Acesso em: 05 de janeiro de 2019.
Estima-se que cerca de 100.000 máquinas Enigma tenham sido produzidas,
sofrendo sucessivos refinamentos e reparos objetivando manter seu caráter sigiloso devido às
constantes tentativas de desvendar seu funcionamento. Em 1939 uma operação foi criada por
poloneses e britânicos reunindo os mais diversos perfis (matemáticos, codebreakers, campeões
de xadrez, especialistas em palavras cruzadas, …) para conseguir realizar esta façanha19.
Ficando conhecida como “Projeto Ultra”, foi um de seus integrantes, o matemático inglês Alan
Turing, o principal responsável pela criação da calculadora eletromecânica Bomb, que tornou
possível a decifração dos códigos da Enigma. Turing posteriormente utilizou a própria Bomb
como inspiração para criar o primeiro computador - batizado de “Colossus” - se tornando,
assim, o pai da computação.
Após o final da Segunda Guerra, as máquinas Enigma se tornaram base para
a criação de muitas outras máquinas de criptografia, como o NEMA suíço, o KL7-ADONIS
americano e o M-125 russo, caindo, assim em desuso. Com o advento da computação e,
principalmente, o surgimento da internet, a criptografia ganhou nova relevância, sendo
aprofundada ainda mais.
19 DAVIES, Norman. A Europa em Guerra (1939-1945). Lisboa: Edições 70, 2008. pg. 55
25
3.1.3. Criptografia por Software
Até princípios do século XX, os sistemas clássicos de criptografia foram
profusa e efetivamente utilizados em diversos setores da vida cotidiana. No entanto, com os
avanços tecnológicos, a demanda por proteção e sigilo foi se tornando cada dia maior. Senhas
de bancos, comércio eletrônico, e-mails… A segurança da informação nunca foi tão essencial.
Dessa forma, interessados em suprir esta necessidade, empresas passaram a desenvolver
projetos em busca de algoritmos criptográficos eficientes.
3.1.3.1. Data Encryption Standard (DES)
Em 1972, após concluir um estudo formal sobre as necessidades de
segurança do governo norte-americano, a NBS (National Bureau of Standards), atualmente
chamada de NIST (National Institute of Standards and Technology) - órgão de padrões do
governo americano - solicitou uma proposta de algoritmo que atendesse à seus critérios
rigorosos. Após uma segunda solicitação subsequente, Horst Feistel, um funcionário alemão da
IBM (International Business Machines, em Nova Iorque) enviou um algoritmo desenvolvido
com sua equipe que foi finalmente aceito: o algoritmo Lucifer.20
Lucifer foi originalmente criado em 1971. Feistel a princípio o nomeou
Dataseal. A IBM, no entanto, passou a usar o termo "Demonstration Cipher" para se referir a
ele, o que o fez ganhar o apelido de "Demon" - demônio, em inglês. Por esse mesmo motivo, o
nome definitivo foi modificado para Lucifer que, de acordo com Feistel, mantinha o "atmosfera
diabólica" do apelido. DSD-1, cifra de Feistel e rede de Feistel também foram outros nomes
pelos quais ficou conhecido.21
Sendo considerado a primeira cifra de relevância na história dos softwares
de segurança da informação, Lucifer se tratava de uma estrutura simétrica usada na construção
de cifras em blocos: suas operações de cifragem e decifragem eram muito semelhantes - até
mesmo idênticas em alguns casos -, de forma que apenas tinham como requisito a utilização
das mesmas chaves na ordem inversa (criptografia simétrica).
Chegando a ser utilizado pelo Lloyds Bank of London, segundo maior banco
do Reino Unido, e pela NSA (National Security Agency), agência de segurança nacional dos
20 SCHNEIER, Bruce. Applied Cryptography, Protocols, Algorithms, and Source Code in C. Segunda Edição.
John Wiley and Sons, New York (1996) p. 257 21 BAUER, Craig P. Secret History: The Story of Cryptology. Boca Raton, FL: CRC Press, 2013. p. 360.
26
Estados Unidos e uma das precursoras de pesquisa no campo da criptografia, a cifra de Feistel
sofreu diversas melhorias e modificações, chegando ao padrão de 64 bits de leitura, com a
aplicação de uma chave com 56 bits à mensagem. Este novo algoritmo foi denominado como
DES (Data Encryption Standard). Esta versão foi aprovada pelo governo como padrão em
novembro de 1976, sendo publicada no Diário Oficial do Governo Federal dos Estados Unidos
da América como FIPS padrão FIPS PUB22 46 em 15 de julho 1977.
Sendo considerada a cifra de bloco mais popular da história, o DES foi
massivamente utilizada durante mais de 20 anos. Apesar de mostrar sinais de envelhecimento,
o algoritmo teve grande relevância para a história da segurança da informação, tendo uma
geração inteira passado anos de suas vidas analisando e buscando formas de o quebrar. Nas
palavras de Bruce Schneier (1996)23: “O DES fez mais pelo campo da criptoanálise do que
qualquer outro. Agora há um algoritmo para estudar.” Isto se deu em grande parte pela
autorização da IBM para a publicação gratuita do algoritmo em domínios públicos - o que não
impediu que dinheiro fosse feito por outras empresas que se apropriaram do sistema,
implementando-o.
Para melhor compreendermos o DES, faz-se necessário a análise de sua
estrutura, que é formada por um um algoritmo simétrico (ou seja, que usa a mesma chave tanto
para encriptação quanto para desencriptação) composto pela junção de dois blocos (conjunto
de dígitos da chave) da criptografia - técnicas conhecidas como substituição e permutação. Na
verdade, todas as técnicas criptográficas convencionais são derivadas deste mesmo sistema,
sendo substituição o nome dado ao processo no qual há a troca simples de um dos dígitos ou
de um bloco de dígitos por outros e a permutação o nome dado à troca da posição dos blocos
em pares ordenados ou processos de arranjo.
Também se faz necessário conhecer duas técnicas de informações ocultas
derivadas dos conceitos de Claude Shannon24 em sua teoria de informação secreta (que
objetivava frustrar a criptoanálise estatística), publicadas em 1949: a confusão e a difusão. Na
confusão, parte da informação é modificada, de forma que os bits de saída não possuem relação
óbvia com os bits de entrada. Já na difusão, tenta-se propagar os efeitos de um bit de texto
simples para outros bits no texto cifrado. O elemento mais comum para alcançar a confusão é
a substituição; já o elemento mais comum de difusão simples é a permutação de bits.
22 Publicação oficial na Federal Information Processing Standards. 23 SCHNEIER, Bruce. Applied Cryptography, Protocols, Algorithms, and Source Code in C. Segunda Edição.
John Wiley and Sons, New York (1996) p. 267 24 SHANNON, Claude. Communication theory of secrecy systems. Bell Systems Technical Journal 28 (1949),
pg. 656 a 715.
27
Resumidamente, as substituições são as responsáveis por promover a confusão; enquanto as
permutações - também chamadas de transposições -, promovem a difusão.25
De acordo com SALEVANE e GADIS (2001)26, a estrutura de
funcionamento do algoritmo DES pode ser dividida em três partes: permutação inicial,
cifragens com operações de chave e permutação final. A permutação inicial e a permutação
final se tratam de processos de transposição de blocos de entrada, sendo a leitura executada da
esquerda para a direita. Por sua vez, a cifragem com operações de chave é executada havendo
16 repetições da mesma operação. O bloco de entrada e a chave são divididos em duas metades
de tamanhos iguais, sendo então executada a permutação, a transformação e a expansão de
chave. Após cada bloco executado, uma chave nova é gerada. Por sua vez, a desencriptação
poderá ser executada no mesmo algoritmo de entrada - apenas alterando para a ordem inversa
da operação. “Mesmo não sendo uma técnica criptográfica, as chaves são de extrema eficiência
no ato de barrar a quebra do arquivo cifrado. As chaves são agregadas ao código, buscando
manter a mesma distribuição de freqüência encontrada das letras dentro do texto.” SALEVANE
e GADIS (2001).
3.1.3.1.1. Análise do Algoritmo
A encriptação do DES é formada pelo conjunto de cifras em blocos de 64
bits. O processo depende de uma chave contendo 56 bits com o adicional de 8 bits de paridade
para verificação de autenticidade, sendo assim todo 8º bit é um bit de paridade e, por isso, são
removidos na primeira permutação com seleção ou permutação de chave - ou seja, os bits das
posições 8, 16, 24, 32, 40, 48, 56 e 64 não são usados. A eficiência do DES é obtida mediante
o uso destas técnicas de forma repetida e intercalada até um total de 16 ciclos, como pode-se
observar na imagem abaixo:
25 TIMOFIECSYK, Sabrina. Criptografia. Disponível em:
<http://www.batebyte.pr.gov.br/modules/conteudo/conteudo.php?conteudo=1384> Acesso em: 10 de janeiro de
2019. 26 SALEVANE, Leandro; GADIS, Vinícius. Um Estudo Comparativo entre algoritmos de criptografia DES –
Lucifer (1977) e AES – Rijndael (2000). Universidade Luterana do Brasil, 2001.
28
Figura 14: Esquema de funcionamento da estrutura do algoritmo DES. Fonte: Acervo próprio.
Uma das propriedades do DES no qual o código de 64 bits logo na primeira
permutação quando assume que são 32 bits, ou seja, a quantidade de bits originalmente será
dividida originando uma nova ordem de separação L0 (Left 0 - em português Esquerda 0) e R0
(Rigth 0 - em português Direita 0) além uma chave K. Assim como na Cifra de Feistel, esta
propriedade também é utilizada nos algoritmos Blowfish, RC5, Twofish, 3DES, dentre outros.
No DES ainda há uma troca no final, chamada “SWAP” onde consiste em voltar a ordem correta
dos bits, caracterizados anteriormente por L0 e R0 para Li e Ri para então efetuar sua permutação
final e ter como saída o texto criptografado.
29
Figura 15: Sistema de substituição da cifra de feistel. Disponível em:
<http://www.ic.unicamp.br/~rdahab/cursos/mo421-mc889/2014-1s/Welcome_files/SlidesPaarPelzl-Portugues-
pdfs/ch03-DES-slides-pt.pdf > Acesso em: 16 de janeiro de 2019
As S-Boxes (Caixas S - caixas de substituição) seriam as substituições no
DES. São existentes em 8 tabelas nas quais temos blocos de 6 bits de entrada e 4 bits de saída,
sendo o primeiro e o último bit tomados como se fossem um número de 2 bits, formando assim
as linhas das tabelas das caixas S. Os bits 2 a 5 agrupados formam um vetor de 0 a 15.
Figura 16: Demonstração dos bits de distribuição dentro das S-Boxes. Fonte: acervo próprio.
Temos então uma matriz 4 x 16 onde a primeira linha é formada por números
hexadecimais que são representados por 4 bits que estão posicionados no meio dos 4 bits de
entrada e a primeira coluna é formada por números decimais que possam ser representados em
2 bits que estão nas extremidades para complemento dos 6 bits de entrada.
30
Figura 17: Exemplificação de uma sequência de agrupamento de bits de uma S-Box. Fonte:
<http://www.ic.unicamp.br/~rdahab/cursos/mo421-mc889/2014-1s/Welcome_files/SlidesPaarPelzl-Portugues-
pdfs/ch03-DES-slides-pt.pdf > Acesso: 17 de janeiro de 2019.
Apesar de complexo, o DES é um algoritmo bastante repetitivo, o que é
favorável para sua implementação em chips de propósito único (mecanismos com somente uma
função). Todavia, o algoritmo possui fraquezas conhecidas - que não necessariamente limitam
sua efetividade de uso. Durante anos, diversos estudos sobre segurança foram realizados para
descobrir tais fraquezas. De forma a tornar possível reconhecer suas falhas.
Durante a década de 80, os cientistas Eli Biham e Adi Shamir foram
responsáveis pela publicação de alguns desses estudos. O método mais utilizado até então para
descriptografia era o brute force. Todavia, sabendo-se que a chave do DES contém 56 bits, com
8 bits de paridade, nos deparamos com um total de 2⁵⁶ chaves possíveis, o que significa
aproximadamente 72 quatrilhões de possibilidades. Sendo o poder computacional da época
incompatível com a quantidade de dados a serem verificados, Biham e Shamir buscaram um
método de quebra que fosse mais eficiente. Outro estudo de relevância foi o método de chaves
de Diffie-Hellman27, realizado pelos cientistas Whitfield Diffie e Martin Hellman, que também
se tornaram responsáveis por reforçar o desenvolvimento da criptoanálise diferencial,
permitindo a averiguação e constituição de uma lista de chaves que foram classificadas como
“fracas” ou “pseudo-fracas”.
Após realizarem diversos estudos de comparação de textos cifrados em pares
de “texto original” e “texto cifrado” - conhecidos como criptoanálise diferencial -, Biham e
Shamir coletaram dois textos originais aleatoriamente e realizaram diversas simulações para
que pudessem encontrar requisitos ou padrões na decodificação. Mediante isso, puderam
constatar que a estrutura dos “textos originais” tinham alta probabilidade de se mostrar
semelhantes aos pares de “textos cifrados”, formando um padrão ao longo da criptoanálise. A
27 KOCHER, Paul C., Timing Attacks on Implement at ions of Diffie-Hellman, RSA, DSS, and Other Systems.
Stanford, CA 94309, USA. 1996.
31
análise estatística se mostrava eficaz na maioria dos casos verificados, além de ser eficaz contra
códigos semelhantes ao DES e também contra os que usavam as S-Boxes no código.
Com a rápida evolução da criptoanálise e aumento do poder computacional,
na década de 90, o algoritmo DES foi se tornando obsoleto, o que botou em risco a segurança
de quem o utilizava. Da mesma forma, a relação de confiabilidade de empresas como a IBM e
NSA foi posta em questionamento, tendo sido até mesmo acusadas de terem gerado um
backdoor28. Por conseguinte, objetivando a proteção dos usuários do DES, o código foi
considerado por todos como carente de modificações e atualizações. Pelo tamanho de sua
popularidade, uma nova onda de testes de análise criptográfica foram exaustivamente feitos por
estudantes e especialistas, buscando constatar a real credibilidade do algoritmo.
A gota d’água para o fim da credibilidade do DES se deu quando este foi
facilmente quebrado pela máquina da Electronic Frontier Foundation (EFF), a EFF DES
Cracker, que violou a segurança proposta pela RSA Laboratory no DES Challenge II, em um
desafio que oferecia um prêmio de US$ 10.000 ao vencedor. Não tão somente quebrar, mas a
EFF DES Cracker conseguiu violar o segredo em apenas três dias, enquanto o último bem
sucedido havia conseguido em custosos 39 dias se utilizando de uma rede composta por
milhares de computadores. O prêmio não custeou a empreitada da E F Foundation - seu projeto
custou cerca de US$ 250.000 -, mas o dinheiro não era o objetivo da ONG.
A iniciativa de desenvolver o projeto da DES Cracker surgiu como uma
forma de afrontar à alegação do governo americano de que os governos não poderiam
descriptografar quaisquer mensagens sob a proteção do DES e, caso conseguissem, não seria
sem altíssimos custos e meses para o fazer. "A EFF provou o que tem sido discutido por
cientistas há vinte anos, que o DES pode ser quebrado rapidamente e de forma barata.”29,
afirmou J. Gilmore, co-fundador e gerente do projeto, em uma de suas entrevistas para a
imprensa.
O objetivo era simples: revelar ao público que o DES não era mais tão
seguro quanto o governo afirmava, em vista de que se uma ONG pode violar tal segurança,
qualquer um poderia fazer o mesmo. Por meio disso, criou-se uma consciência comum da
responsabilidade de não se comprar produtos que prometem a verdadeira privacidade, como o
DES. Também se refutou de uma vez por todas para a comunidade acadêmica a ideia pregada
28 Método de acesso a sistemas (software, plataformas, dispositivos etc.) não documentado, podendo ser usado
de forma legítima ou ilegítima por fabricantes para obter admissões. 29 Press Release. EFF DES Cracker Machine brings honesty to crypto debate. Disponível em:
<ttps://www.eff.org/press/releases/eff-des-cracker-machine-brings-honesty-crypto-debate> Acesso em: 17 de
janeiro de 2019.
32
pelo governo de que era impossível criar mecanismos como o EFF DES Cracker de forma
simples, com baixo custo e alta eficiência.
Apesar de tudo isso, o DES durou mais do que o previsto. Seu prazo
presumido de utilização era de até metade dos anos 80. Todavia, em 1983 o algoritmo foi
reafirmado como padrão, sendo revisado em 1988 e aprovado pelo governo americano como
FIPS-46-1. Em 1993 foi publicado novamente na FIPS-46-2 e, pela última vez, em 1999 como
FIPS-46-3 - ficando também conhecida como “Triple DES” ou “3DES”.30
3.1.3.2. Advanced Encryption Standard (AES)
Em janeiro de 1997, o NIST (National Institute of Standards and
Technology), percebendo que o tempo de utilização do DES e suas variações estava em seu
limite, chegou à conclusão que, a partir daquele momento, havia surgido a necessidade da
criação de um novo algoritmo que tivesse as qualidades necessárias para se tornar o novo padrão
FIPS, trazendo melhor segurança e otimização sem a utilização de padrões antigos como o
3DES. Dessa forma, criaram um concurso público que fomentasse a elaboração de um novo
algoritmo que viria a ser chamado de AES.
Os preparativos para a escolha desse novo algoritmo foram iniciados pouco
mais de seis meses depois - tempo suficiente para a convocação dos participantes e da
comunidade criptográfica. O NIST, no entanto, não realizaria nenhum dos testes, fossem eles
testes de ataque ou criptoanálise diferencial: esta responsabilidade seria da própria comunidade,
sendo esta a mais capaz de medir sua própria segurança e qualidade.
Com a convocação oficial dos candidatos os pré-requisitos foram
estabelecidos: os algoritmos deveriam ser melhor otimizados do que o seu antecessor (o DES)
e suas variações, podendo ser implementados em softwares e hardwares simétricos com suporte
a blocos de 128 bits e chaves de 128, 192 e 256 bits. Além disso, todos os algoritmos submetidos
deveriam ter consentimento para serem divulgados publicamente, livres de direitos autorais.
No ano seguinte, entre os dias 20 e 22 de agosto de 1998, os organizadores
selecionaram 15 algoritmos dentre os concorrentes. Foram eles (em ordem alfabética): CAST-
256, CRYPTON, DEAL, DFC, E2, FROG, HPC, LOKI97, MAGENTA, MARS, RC6,
Rijndael, SAFER+, Serpent e Twofish. Todos passaram por uma seleção prévia onde foram
30 DATA ENCRYPTION STANDARD (DES). Dados disponíveis em:
<https://csrc.nist.gov/CSRC/media/Publications/fips/46/3/archive/1999-10-25/documents/fips46-3.pdf>.
33
classificados por sua segurança, eficiência computacional, adequação aos hardwares,
adequação aos softwares e por sua simplicidade. Como poucos competidores apresentaram
design teórico de falhas de seus algoritmos, não foi possível determinar quais seriam suas
possíveis fraquezas, o que os levou a realização de novos testes de eficiência dos algoritmos
em diferentes plataformas.
Uma segunda reunião de seleção foi realizada em março de 1999, em Roma
- fato curioso, uma vez que uma cidade européia foi escolhida pelo governo americano para
sediar uma discussão de escolha de um padrão de segurança americano. A cidade foi escolhida
para combinar a data da conferência com o evento anual do “Software Encryption Workshop”,
facilitando o acesso do público alvo: especialistas para os testes.
Levando também em conta os resultados obtidos na primeira reunião,
algumas conclusões importantes foram definidas. Os algoritmos DEAL, FROG, HPC, LOKI97
e Magenta não ofereciam os requisitos de segurança. Da mesma forma, o DEAL, o FROG, o
Magenta, o SAFER + e o Serpent foram considerados lentos. Nos testes de microcontroladores
de 8 bits e smart cards, o algoritmo Rijndael teve uma notória vantagem sobre os outros
algoritmos, se mostrando o mais adequado para esse tipo de plataforma. O Serpent, apesar do
desempenho baixo nos testes de velocidade, compensou devido a sua alta performance de
segurança. O CAST-256 tinha um custo elevado quando comparado aos demais. O Crypton foi
comparado ao Rijndael e Twofish mas nitidamente possuía uma segurança inferior. O DFC foi
classificado como de baixa segurança e baixo desempenho em processadores de 64bits. E, por
fim, o E2 foi comparado ao Rijndael e ao Twofish em estrutura, mas obteve baixo rendimento
em segurança, além de seu alto custo de implementação. Dentre os 15 algoritmos analisados,
foram selecionados apenas 5 para passarem para a próxima etapa. Foram eles: MARS, RC6,
Rijndael, Serpent e Twofish.
A terceira conferência se daria em abril de 2000, na cidade de Nova York.
No entanto, pouco tempo depois da segunda reunião, com as avaliações cada vez mais críticas
sendo efetuados pela comunidade criptográfica, iniciou-se o processo de ajustes e testes de
desempenho no qual a NSA foi uma das principais responsáveis pelos resultados de simulações
relevantes obtidos. No âmbito de ataques não houveram grandes avanços. Notavelmente, os
códigos ali apresentados eram extremamente complexos e procuraram ao máximo não se expor
à falhas, fazendo com que a confiabilidade de qualquer um fosse aceita rapidamente. Dessa
forma, a comunidade voltou seu foco para a realização de testes de desempenho, implementação
e custos.
34
Os primeiros resultados obtidos foram favoráveis ao Serpent, ganhando este
o elogio de “performance excelente” em jornais e revistas especializadas da época. O Rijndael
e o Twofish também se saíram bem, conquistando elogios quanto à sua adequação à
implementação em hardware. Já o RC6 e o MARS acabaram caindo no conceito devido ao seu
custo de implementação.
No dia 2 de outubro de 2000, após todos os testes, deliberações, respostas às
críticas e a coleta de todas as informações possíveis, o NIST finalmente anunciou o grande
vencedor: o algoritmo Rijndael, escolhido por sua alta performance e por sua facilidade de
implementação, que eram os principais objetivos naquele momento. No relatório final, o NIST
declara que a comunidade foi motivada por sua segurança, consistência em sua implementação
por ter uma boa performance tanto em software quanto em hardware, pelo tempo de
configuração da chave, agilidade e também pelo fato de que nas demonstrações dos ataques não
obtiveram grandes mudanças de desempenho, mostrando uma significativa economia de
memória ao sistema.
Dessa forma, o Rijndael se tornou o padrão FIPS PUB 197 - o eleito “AES”.
Desenvolvido pelos pesquisadores Vincent Rijmen e Joan Daemen - sendo o nome do código
a junção do início de seus sobrenomes -, sua utilização começou em 26 de maio de 2002 com a
assinatura do Secretário de Comércio Donald L. Evans, que oficializava e permitia seu uso. Em
julho de 2005 o algoritmo obteve sua primeira aprovação na norma ISO/IEC 18033-331, sendo
reafirmada em 2016 pelos padrões adotados. Alguns outros algoritmos também são aprovadas
por esta mesma ISO. São eles o: TDEA, MISTY1, CAST-128 e HIGHT, de 64 bits; e o AES,
Camellia e SEED, de 128 bits.
31ISO/IEC 18033-3:2005. Information technology -- Security techniques -- Encryption algorithms -- Part 3: Block
ciphers. Disponível em: <https://www.iso.org/standard/37972.htm> Acesso em: 24 de janeiro de 2019.
35
3.1.3.2.1. Análise do Algoritmo
O algoritmo AES inicia seu processo de encriptação carregando os dados
inseridos em uma matriz 4x4 (ou seja, de 16 bits) - matriz característica de todos os processos
deste algoritmo.
Figura 18: Matriz de 16 bits (4X4), padrão do processo de encriptação AES. Fonte: Acervo próprio.
Para a primeira rodada da encriptação, o AES aplicará o processo conhecido
como XOR (Exclusive Or32) em cada byte de entrada correspondente ao byte da primeira rodada
da matriz 4x4 da chave gerada. O XOR se trata de um processo lógico de comparação de bytes
que filtra o processo por artifício de uma tabela “verdade”, na qual o resultado somente será
positivo se os bytes forem ímpares. Seu uso é indicado por ser uma forma barata e eficiente de
acelerar o processo de encriptação, diminuindo seu tempo significativamente. Isto se dá por
utilizar um mínimo do hardware e poder ser feito como um processo paralelo, já que nenhum
bit desnecessário será carregado.
Figura 19: Demonstração da tabela verdade do XOR. Fonte: Acervo próprio.
32 Chamado de “Ou exclusivo” em português.
36
Figura 20: Demonstração do processo de aplicação do XOR nas matrizes de entrada e da chave. Fonte: Acervo
próprio.
Pelo seu design simples e repetitivo, o AES necessitará de diversas chaves
ao longo de seu processo de criptografia. Estas serão geradas a partir derivação da chave inicial
mediante um método simples de mixagem: pega-se a última coluna da chave da rodada anterior
e move-se o bit do topo para o final. Cada bit será então passado por procedimento uma caixa
de substituição que o mapeará em um bit diferente.
Figura 21: Processo de mixagem para se gerar novas chaves a partir da chave inicial: primeiro move-se o
primeiro bit e, após, passa-se cada um por um box de substituição. Fonte: Acervo próprio.
Logo após, esta coluna passará por um processo de XOR com uma “rodada
constante” que será diferente em cada rodada.
37
Figura 22: Exemplificação do processo de aplicação do XOR na última coluna. Fonte: Acervo próprio.
Por fim, esta coluna será passada pelo processo de XOR conjuntamente com
a primeira coluna da chave da rodada anterior de forma a gerar uma completamente nova
primeira coluna.
Figura 23: XOR da primeira coluna da chave anterior com a última coluna da chave atual. Fonte: Acervo
próprio.
As demais colunas passam por um processo mais simplificado uma vez que
apenas serão passadas pelo processo de XOR com a mesma coluna da chave da rodada anterior.
Posteriormente, dá-se início as rodadas intermediárias, sendo “rodada” chamada cada série de
passos que serão repetidos n vezes, sendo esta quantidade definida de acordo com o tamanho
da chave: 10 vezes para chaves de 128 bits; 12 vezes para chaves de 192 bits; 14 vezes para
chaves de 256 bits. A margem mínima de segurança do algoritmo foi definida como sendo 10
repetições uma vez que conseguiram criar um atalho para cifras geradas com apenas 6 rodadas.
Na próxima etapa da criptografia do AES serão aplicados as técnicas de
confusão e difusão, já explanados anteriormente. Primeiramente será gerada a confusão por
recurso do uso de uma caixa de substituição (S-Box) que irá mapear cada bit em um bit
38
diferente, de forma a nublar a relação entre eles. Em seguida, aplicar-se-á a confusão mediante
a troca da posição das linhas da esquerda com as linhas da direita.
Figura 24: Processo de Confusão - S-Box para substituição dos dados da matriz. Fonte: Acervo próprio.
Figura 25: Processo de difusão em “empurrar” os bits para fazer a mistura de bits da matriz.
Fonte: Acervo próprio.
Posteriormente, há uma mistura dos bits de cada coluna e, ao final de cada
uma destas rodadas, ainda será aplicada uma nova rodada de chave após as passar pelo processo
de XOR. Na rodada final da encriptação pelo AES, será pulado o passo em que se mistura os
bits das colunas, uma vez que isto não aumentaria a segurança (não haveria próxima rodada
para proveito da difusão gerada), apenas desacelerando o processo. Apesar de ter uma estrutura
simples, o AES garante sua segurança mediante acúmulo de confusões e difusões gerados
através da repetição de todas estas rodadas explicadas anteriormente - de forma que, quantas
mais, melhor. Para descriptografar, deve-se “apenas” fazer o caminho reverso.
39
3.1.3.2.2. Aplicação
Um dos exemplos mais interessante da aplicação prática da criptografia AES
pode observado no contexto da Operação Satiagraha, em 2008 - operação cujo nome foi dado
como referência ao termo Satyagraha33, usado por Mahatma Gandhi em suas campanhas pela
independência do Estado indiano.
Satiagraha foi uma operação realizada pela Polícia Federal contra a
corrupção, focada em expor desvios de verba pública e lavagens de dinheiro. Iniciada em 2004,
culminou com a prisão de diversas figuras importantes no cenário nacional, como empresários,
diretores de bancos, investidores e políticos - e, dentre eles, esteve Daniel Dantas, empresário
e membro de uma das mais tradicionais famílias da Bahia.
Dantas foi preso em junho de 2008 com 6 discos rígidos e um computador
portátil, somando um potencial de armazenamento de 2,08 terabytes cujos dados poderiam
provar seu envolvimento em esquemas de corrupção. Todavia, estavam criptografadas pelo
AES 256 bits, um dos mais sofisticados no mercado até então.
Após meses de tentativas de quebrar o código, o INC (Instituto Nacional de
Criminalística) pediu, em 2009, ajuda para o FBI (Federal Bureau of Investigation) unidade do
Departamento de Justiça dos Estados Unidos responsável pelo serviço de inteligência do país.
Em junho de 2010 os aparelhos foram devolvidos ao Brasil, sem sucesso na decodificação. Uma
vez que o governo brasileiro não possuía nenhum tipo de argumento jurídico para obrigar
Dantas a ceder acesso ao código, o banqueiro foi solto e liberado de sua pena de 10 anos. O
banqueiro desde então declarou, por meio de sua assessoria, que foi alvo de armações e
espionagens, e que o Satiagraha foi feito apenas para atender a interesses privados.34
Os programas utilizados para esta inquebrável criptografia foram o PGP e o
Truecrypt, disponível gratuitamente. Bastante conhecido e relevantes na comunidade de
segurança da informação, o TrueCrypt foi desenvolvido em 2004 e se tratava de uma plataforma
de criptografia on-the-fly (em tempo real) capaz de criptografar discos rígidos inteiros, partições
ou discos virtuais.
33 Satyagraha é um termo hindi (सत्याग्रह) composto por duas palavras: satya, que significa “verdade”; e graha, que
significa “firmeza”. Traduz-se como “o caminho da verdade”, se tratando de uma filosofia de não-agressão, de
não-violência. Disponível em: <https://pt.wikipedia.org/wiki/Satyagraha>. Acesso em: 27 de janeiro de 2019. 34 G1. Nem FBI consegue decifrar arquivos de Daniel Dantas, diz jornal. Disponível em:
<http://g1.globo.com/politica/noticia/2010/06/nem-fbi-consegue-decifrar-arquivos-de-daniel-dantas-diz-jornal.ht
ml>. Acesso em: 27 de janeiro de 2019.
40
Figura 26: Exemplo do layout do TrueCrypt. Fonte: <https://www.lifewire.com/truecrypt-review-2619179>.
Acesso em: 27 de janeiro de 2019.
No auge de sua fama35, não existiam formas de o violar sem o uso de brute
force. Dependendo do número de bits utilizados, suas combinações se tornam incrivelmente
grandes - o suficiente para qualquer uma das melhores máquinas do mundo passassem meses
na tentativa de encontrar a chave de criptografia.
TABELA 1:: Tabela de demonstração do escalonamento de possibilidades por bits. Fonte: acervo próprio.
35 EDSTRÖM, Björn. TrueCrypt Explained. 2008. Disponível em: <http://blog.bjrn.se/2008/01/truecrypt-
explained.html>. Acesso em: 30 de janeiro de 2019.
Tamanho da
Key
Combinações
possíveis
Tamanho da
Key
Combinações
possíveis
1 bit 2 56 bits (DES 7.2 x 1016
2 bits 4 64 bits 1.8 x 1019
4 bits 16 128 bits (AES) 3.4 x 1038
8 bits 256 192 bits (AES) 6.2 x 1057
16 bis 65536 256 bits (AES) 1.1 x 1077
32 bits 4.2 x 109
41
4. PYTHON CRYPTOGRAPHY
4.1. História
Foi durante seu período de estadia no CWI (Centrum Wiskunde &
Informatica), Guido Von Rossum, que ao fim dos anos 80 trabalhava no desenvolvimento da
extinta linguagem ABC. Com o encerramento do projeto, ele foi remanejado para trabalhar no
sistema operacional distribuído, Amoeba. A busca por uma linguagem de nível superior
esbarrou na necessidade da criação de utilitários de administração, porém estava tomando muito
tempo desenvolvê-los em C e sua alternativa, em Bourne Shell, não funcionaria por diversos
motivos. O principal detalhe é que as operações primitivas do Amoeba se diferenciavam muito
das operações primitivas do Shell Bourne, por serem mais refinadas, então o Python foi criado
como uma ferramenta para ser um elo de conexão entre o C e o Shell Bourne.
Tendo algum reconhecimento, o Python deu seus primeiros passos e em 1989 já havia
sido desenvolvida por Guido uma versão minimamente funcional e no ano seguinte já era mais
utilizado no CWI que a própria ABC.
4.2. Instalação
Para download do Python Cryptography é necessário o interpretador python,
que pode ser adquirido gratuitamente no site “https://www.python.org”. Quando dentro desta,
deve-se selecionar a opção “downloads” que abrirá uma página contendo a opção “Download
Windows x86-64 executable installer”.
A versão baixada tem em torno de 25.5MB, possuindo o nome de “python-
3.7.1.exe”. Durante a instalação, a única alteração necessária foi assinalar a opção de “add
python 3.7 to PATH” depois a opção “Install Now”.
42
4.2.1. Instalação Via CMD
A instalação do módulo do Python Cryptography pode ser efetuada também
pelo prompt de comando (CMD) por meio da instrução “pip install”, com a qual se torna
possível baixar e automaticamente instalar várias bibliotecas e ferramentas para o Python de
forma simplificada. A seguir, apresentaremos um tutorial base para a instalação.
Para dar início, deve-se abrir o prompt de comando (CMD) como
administrador e digitar inserir o comando “pip install cryptography” e o “pip install
pycryptodome”36, assim como demonstrado na imagem abaixo:
Figura 27: Instalação da biblioteca Cryptography em windows. Fonte: acervo próprio.
Em busca de uma alternativa para instalação, encontramos o PyCrypto, ainda
sim tentamos correr com a instalação normalmente pela função “pip install pycrypto” mas pela
quantidade de erros não foi possível como mostrado abaixo.
Durante o processo, acabaram ocorrendo erros de instalação:
Figura 28:Erro para atualização do pip. Fonte: acervo próprio.
python -m pip install --upgrade pip
36 Pypi. Pip install cryptography. Disponível em: <https://pypi.org/project/cryptography>. Acesso em: 30 de
janeiro de 2019.
43
Figura 29: Sucesso ao atualizar o pip. Fonte: acervo próprio
Tentamos instalar o PyCrypto por meio do comando “pip install pycrypto”:
Figura 30: Erro ao instalar o Pycrypto no windows. Fonte: acervo próprio.
No site Nitratine37 (2018), é mencionado que é necessária uma versão do
Microsoft Visual C++ para a instalação:
Como o Python não vem com nada que possa criptografar arquivos,
precisaremos usar um módulo de terceiros. O PyCrypto é bastante popular,
mas como ele não oferece ferramentas incorporadas, se você não tiver o
Microsoft Visual C ++ Build Tools instalado, será solicitado a instalá-lo. Em
vez de instalar ferramentas extras apenas para seu funcionamento, eu estarei
usando o módulo Cryptography”, por este motivo acabamos deixando de usar
o PyCrypto em nossas análises iniciais.
Instalação da biblioteca cryptodome em alternativa a utilização da pycrypto
por recurso do sistema operacional windows por meio do comando “pip install pycryptodome”.
37 NITRATINE. Encryption and Decryption in Phyton. 2018. Disponível em:
<https://nitratine.net/blog/post/encryption-and-decryption-in-python/>. Acesso em: novembro de 2018.
44
Figura 31: Atualização do pip por meio do cmd. Fonte: acervo próprio
Figura 32: Instalação do cryptodome em windows. Fonte: acervo próprio
4.2.2. Instalação Via PyCharm
Uma IDE (Integrated Development Environment ou Ambiente de
Desenvolvimento Integrado) é uma programa de computador que sua função consiste na
integração de diversas ferramentas de desenvolvimento de software, como editores de texto,
compiladores, depuradores, modeladores, que antes trabalhavam de forma isolada.
No navegador pesquise por Pycharm, então acesse o link que vá ao endereço
jetbrains.com, ao clicar em Download será carregada a página onde estarão as opções
Profissional, que contém algumas funcionalidades a mais e é uma versão paga, e a Community
que é a voltada a comunidade educacional e científica. Escolha esta última.
Crie um atalho de acordo com a arquitetura de seu SO, perceba que usaremos
64 bit. Em Create Associations, selecione esta caixa para que ele reconheça estas extensões de
arquivos.
45
Figura 33: Janela da área de configurações de instalação. Fonte: Acervo Próprio.
Figura 34: Janela de instalação nova ou reutilizada. Fonte: Acervo Próprio.
Após reiniciar, ao iniciar o PyCharm, pedirá que escolha uma pasta para
utilizar as configurações anteriores, como estamos partindo da premissa que é um primeiro
contato, esta será a primeira instalação, marque a segunda opção e prossiga com a instalação.
46
Figura 35: Área inicial do Pycharm. Fonte: Acervo próprio.
Esta é área inicial do Pycharm a partir de um novo projeto (“New Project”).
Na aba arquivo (“File”) crie um novo projeto em “New Project”. Ele deverá encontrar o
interpretador previamente instalado, utilizamos o Python 3. Escolha um local de
armazenamento e dê nome ao projeto, clique no botão “Create”.
Figura 36: Tela de criação de novo projeto. Fonte: Acervo próprio.
Clique com o botão direito do mouse no nome dado ao seu projeto e surgirão
opções, vá em “New” e escolha “Python File”.
47
Figura 37: Tela para nomeação de um novo projeto. Fonte: Acervo próprio.
Nomeie seu arquivo Python. Para instalar o Interpretador: na aba “Files”, vá
em “Settings”, encontre Project: ‘nome do projeto’, “Project Interpreter”. Aqui você encontrará
uma listagem contendo os interpretadores instalados e usados no seu projeto, assim como seus
pacotes:
Figura 38: Tela do local de pacotes instalados no momento. Fonte: Acervo próprio.
À direita no ícone “+” você irá adicionar o pacote contendo o Cryptography,
digitando seu nome na pesquisa. Note que existem vários pacotes disponíveis.
48
Figura 39: Tela de instalação de pacotes e suas versões. Fonte: Acervo próprio.
Clique em Install Package e aguarde a confirmação de instalação.
Figura 40: Aviso de instalação bem sucedida. Fonte: Acervo próprio.
4.3. Exemplo de Criptografia Usando Python Cryptography
Para entendermos o funcionamento da biblioteca do Python Cryptography
precisamos compreender como este funciona na prática. Faremos isso por intermédio da análise
do código abaixo, criado com o intuito de demonstrar uma operação simples de criptografia por
meio do Fernet. Se trata de uma implementação de criptografia simétrica autenticada que utiliza
AES em modo CBC com uma chave de 128 bits. Ele utiliza preenchimento PLCS7 e HMAC,
usando SHA256 para autenticação e o os_urandom para gerar valores38. Para simplificar a
explicação do código, o mesmo foi dividido em 7 etapas, conforme mostrado na Tabela 1:
38 Cryptography. Fernet (symmetric encryption). Disponível em: <https://cryptography.io/en/latest/fernet/>.
Acesso em: 27 de janeiro de 2019.
49
Etapa Criptografia por meio do Fernet
1
2
3
4
5
6
7
from cryptography.fernet import Fernet
key = Fernet.generate_key()
print (key)
token = Fernet(key)
print (token)
plaintext = input("Insira sua senha: ")
print (plaintext)
bytetext = plaintext.encode()
print (bytetext)
encrypt = token.encrypt(bytetext)
print (encrypt)
decrypt = token.decrypt(encrypt)
print (decrypt)
TABELA 2: Demonstração da estrutura de um código Fernet.
Fonte: acervo próprio.
Resultado da Criptografia por meio do Fernet
1
2
3
4
5
6
7
b'BCa9IOGuuSJScUS9_O2hs5rF7IqkInh3yERK-hy1aPU='
<cryptography.fernet.Fernet object at 0x03FA4070>
Insira sua senha: 123456
123456
b'123456'
b'gAAAAABcThqui2nB4LI5DB7eLQhrFU8gDxl3k0tJV-
1eoIUKTPEKGrCNia9Y3bmXocNQiw_h_HKS448zMpTQDPLnM2Q_U
gN_Og=='
b'123456'
TABELA 3: Demonstração dos resultados obtidos por etapa
Fonte: acervo próprio.
Algumas de nossas variáveis e termos que serão aqui utilizados, sendo
eles: plain text, ou texto simples, que é a mensagem a ser cifrada, no código representada pela
variável “plaintext”; cipher text, ou texto cifrado, que se trata do texto obtido após o processo
de encriptação; encryption, que se refere ao processo de encriptação; decryption, que é o
processo inverso, de desencriptação; byte text, nome dado ao texto obtido em bytes, uma vez
que para o processo ser executado precisa ser convertido em bytes no código representada pela
variável “bytetext”; e, por fim, double strength encryption, que nada mais é que o processo de
encriptar um texto já encriptado para o tornar mais seguro.
50
No início do código-exemplo (Tabela 1), na etapa 1, realizou-se a
importação da biblioteca cryptography.fernet. Na etapa 2, foi gerada uma chave que foi
armazenada na variável “key” usando o método da classe “Fernet.generate_key()”, tendo como
parâmetro 32 bytes codificada em base64 que representa a codificação binária em UTF-8 (8-bit
Unicode Transformation Format) faz uso de 1 a 4 bytes (1 byte em ASCII e 4 em UNICODE)
em octetos por caractere em cada símbolo. Após este processo, obtivemos então como resultado
a string mostrada na linha 1 da Tabela 2. Apesar de parecer algo óbvio, há uma recomendação
na própria documentação da biblioteca na qual a chave deve ser guardada/escondida para não
sofrer desencriptação ou até mesmo realizar a operação de double strength encryption.
Na etapa 3, iremos gerar o código Fernet, sendo este armazenado na variável
“token” utilizando uma mensagem obtida pelo usuário (uma sequência arbitrária de bytes).
Como resultado, um código é gerado trazendo consigo um formato que não pode ser lido ou
alterado sem a chave. Obtivemos como saída o código demonstrado na linha 2 da Tabela 2.
Na etapa 4, iremos receber o texto do usuário, como é mostrado na linha 3
da Tabela 2. Para iniciarmos o processo de encriptação desse texto em caracteres, como
representado na linha 4 da Tabela 2, ele precisará ser convertido em bytes, uma vez que o
python 3 não reconhece objetos em caracteres como matrizes de bytes e não possui nenhuma
estrutura nativa para codificar. Para fazer tal conversão utilizamos o comando
“plaintext.encode()”, como representado na etapa 5 da Tabela 1, obtendo os resultados
necessários para a encriptação demonstrador na linha 5 da Tabela 2. Por fim, com todas as
etapas concluídas, iremos então encriptar o texto obtido.
O método da classe encrypt utiliza a variável “token” para fazer a
encriptação. No exemplo, foi usado o “token.encrypt (bytetext)” que será armazenado na
variável “encrypt”, obtendo como resultado o texto mostrado na linha 6 na Tabela 2 - uma string
de tamanho variável (quanto maior a mensagem, maior será o tamanho da encriptação) mas
sempre múltipla de 128 bits, correspondentes com o tamanho dos blocos utilizados no AES.
A desencriptação do código obtido somente será possível caso o usuário
possua o token que foi utilizado no processo de encriptação. Caso este seja conhecido, somente
será necessária a realização do processo inverso, no qual a mensagem encriptada, salva pela
variável “encrypt” na etapa 6 da Tabela 1, será copiada e aplicada ao “token.decrypt(encrypt)”,
que será então armazenado na variável decrypt. A desencriptação será então realizada na etapa
7 da Tabela 1 e o resultado será a mensagem inicial, como demonstrado na linha 7 da Tabela 2.
51
4.4. Exemplo de criptografia utilizada pelo Python PyCrypto
Este exemplo foi desenvolvido em uma plataforma Linux pelo PyCharm, sua
instalação segue o padrão do sistema operacional, usando seu terminal, e busca pelo navegador
https://pypi.org/project/pycrypto/. Devido a plataforma usada, o erro ao instalar o pacote
advindo da necessidade do Microsoft Visual C++, não ocorre.
Linha Exemplo de código em PyCrypto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from Crypto.Cipher import AES
import base64
import os
def encriptacao(privateInfo):
BLOCK_SIZE = 16
PADDING = '{'
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) *
PADDING
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
secreto = b'\xf9J\xa4\xd1\t\x17\xb8\xabt\xfe\x06\x96\xe3\xe8(.'
print('Chave de criptografia:', secreto)
print('Tipo de chave:', type(secreto))
cifra = AES.new(secreto)
encoded = EncodeAES(cifra, privateInfo)
print('Cadeia criptografada:', encoded)
print('Tipo de string criptografada:', type(encoded))
def descriptografia(encryptedString):
PADDING = '{'
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).decode('utf-
8').rstrip(PADDING)
key = b'\xf9J\xa4\xd1\t\x17\xb8\xabt\xfe\x06\x96\xe3\xe8(.'
cifra = AES.new(key)
decoded = DecodeAES(cifra, encryptedString)
52
32
33
34
35
36
print('Decodificado:', decoded)
encriptacao("As maquinas me surpreendem muito frequentemente.")
descriptografia(b'2fq4okb5+rz742C8zRg2me9GLrmRP2v9Ev4Xcrvd/uzsRMj
rh5VxErf/3TnS8gf71FCZFwrOVXCSa6iWcw4kig==')
TABELA 4: Demonstração de um código em PyCrypto. Fonte: Acervo próprio.
Para que façamos os processos necessários neste código, usaremos o módulo
base64 (linha 2), este módulo fornece funções para codificar dados binários em caracteres
ASCII imprimíveis e decodificá-los de volta para dados binários, adequados para transmissão
por via de protocolos de texto simples. Definimos a função encriptacao(privateInfo) e seu
tamanho de bloco (BLOCK_SIZE), 16 bytes (para AES o tamanho do bloco pode ser 16, 24 ou
32) , o que equivale a 128 bits, este será o tamanho da key. A variável PADDING = ‘{’ é usada
para preenchimento do plaintext de modo a garantir que o valor criptografado seja sempre um
múltiplo do BLOCK_SIZE (linha 6). Na atribuição da variável pad, esta por sua vez preenche
o texto a ser criptografado, utilizamos lambda como abstração, e definimos parâmetro s de pad
e então dois pontos, o repetimos e somamos com o resultado do cálculo entre parênteses e a
multiplicação com a variável PADDING (linha 9), sobre este cálculo, tamanho do bloco (16),
menos o resultado entre o comprimento do parâmetro s (len) dividido pelo tamanho do bloco,
note o operador % (resto ou modulus).
Na linha 12 é realizada a encriptação com AES, codificada pela biblioteca
base64, atribuída ao EncodeAES. Ao fazermos uso desta biblioteca observamos uma de suas
funções, especificamente para codificação, base64.b64encode, ele codifica o objeto s em bytes
e os retorna os bytes já codificados. Nesta etapa (linha 14) definimos o secreto (esta é a chave
de segurança privada, deve ser mantida sempre em sigilo, pois serve para converter o arquivo
criptografado, neste exemplo a fixamos), e o exibimos na linha seguinte e após ele, sua classe
por via do método type. Nas linhas 15 e 16 recebemos o output (saída) da chave secreta e do
tipo de objeto ao qual ela pertence. Na linha 17 o secreto será usado para gerar a cifra e esta
por sua vez fará parte da codificação na linha 19, a secreto, nas duas próximas linhas já será
exibida a cadeia criptografada e sua classe (tipo de string) tal qual no output anterior.
A partir da linha 22 será realizada reversão do processo, para isso é definida
a função descriptografia(encryptedString), reinserimos PADDING = ‘{’ para que cumpra
53
novamente a função de preenchimento, após isso, atribuímos DecodeAES, este fará o papel de
decodificar em base AES e seu parâmetro c. Assim sendo a função base64.b64decode
decodifica o objeto usando base64 e retorna os bytes codificados, no entanto foi expressa a
codificação UTF-8 (linha 28), o detalhe é que esta codificação abrange tanto o ASCII quanto
UNICODE, logo a mensagem poderá ser lida não importando se foi codificada em qualquer um
dos dois (linha 26). Atribui-se key à chave de descriptografia e na linha abaixo, a cifra designada
AES.new(key), e por fim decoded chama Decoded já contendo a chave de descriptografia e
exibindo a mensagem na linha 31.
Nas linhas 34 e 36 fazemos as chamadas de função encriptacao e
descriptografia, definidas pr def, colocadas ao final do código, pois geraria erro ao chamar a
função caso ocorresse no início.
54
5. CONSIDERAÇÕES FINAIS
Desde seus primórdios, a criptografia vem crescendo em sua relevância e
tornando-se intrínseca aos avanços tecnológicos. Da grécia antiga aos dias atuais, mensagens
secretas mudaram o curso de guerras, somado a isso, despertaram curiosidade e zelaram pela
nossa segurança e privacidade. Hoje, ela está em tudo que nos cerca: bancos, mídias sociais,
mensagens instantâneas, .... Tudo que concerne à segurança e individualidade envolve
criptografia - e a demanda pela proteção de dados e informações sensíveis fica cada dia maior.
Por esse mesmo motivo, se faz de fácil compreensão a extrema importância
do estudo e do contínuo desenvolvimento da qualidade dos algoritmos e dos softwares voltados
para a criação de sistemas de segurança. Novos programadores com novas visões sobre os fatos
se fazem gradativamente mais necessários - especialmente os focados na linguagem Python,
em razão de que está se mostra com boa tendência de crescimento no mercado atual.
Dessa forma, este trabalho possui como principal objetivo guiar estes novos
usuários por intermédio do conhecimento da história sobre os algoritmos que foram referências
em segurança pelo tempo de uso. Desde seu surgimento, passando pelo “boom” do DES,
extremamente popular até cair em desuso e ser substituído pelo 2DES (e, posteriormente, pelo
3DES), até o surgimento do AES, criado durante uma busca por um novo algoritmo que seria
tão seguro quanto e de ótimo desempenho. Isso se faz necessário especialmente pela restrição
de acesso à informações de qualidade sobre o assunto.
Acreditamos que por meio da compreensão do processo de surgimento da
criptografia, novos usuários amadores e programadores profissionais possam ter seu interesse
despertado e/ou renovado sobre a criação de soluções inéditas e linguagens que possam ser
implementadas de forma simples, segura e efetivas.
Todavia, ainda faz-se importante aprender mais, aprofundar, reconhecer e
apresentar novas soluções, de forma a expandir os horizontes, sempre buscando algoritmos
inovadores que possam oferecer constantemente mais segurança para os usuários. Assim como
a sociedade, a criptografia evolui. Da mesma forma, métodos de quebrar seus códigos de
segurança surgem, e assim sucessivamente. A necessidade de buscar e aprimorar ferramentas -
igualmente como a busca pelos melhores profissionais da área da computação voltados à
programação e segurança da informação - nunca terá um fim.
55
REFERÊNCIAS
ALVARENGA, Luiz Gonzaga de. Criptografia Clássica e Moderna. 2011.
Microsoft News Center Brasil. O futuro é quântico: Microsoft libera preview gratuito do Kit
de Desenvolvimento Quântico. 2017. Disponível em: <https://news.microsoft.com/pt-br/o-
futuro-e-quantico-microsoft-libera-preview-gratuito-kit-de-desenvolvimento-quantico/>.
MANDELBAUM, Ryan. A criptografia atual está em risco com os avanços da computação
quântica. 2018. Disponível em: <https://gizmodo.uol.com.br/computacao-quantica-
criptografia/>.
PWC. Uncovering the potential of the Internet of Things. 2017. Disponível em: <
https://www.pwc.com/gx/en/issues/assets/pwc-GSISS-2017-uncovering-the-potential-of-
iot.pdf>.
DEVMIDIA. Top 10 linguagens de programação mais usadas no mercado. 2018. Disponível
em: <https://www.devmedia.com.br/top-10-linguagens-de-programacao-mais-usadas-no-
mercado/39635>.
KUHNEN, Matheus. Top 10 linguagens de programação mais usadas no mercado. 2018.
Disponível em: <https://www.devmedia.com.br/top-10-linguagens-de-programacao-mais-
usadas-no-mercado/39635>. Acesso em: 30 de janeiro de 2019.
ROBSON, David. The Incredible Growth of Python. Disponível em:
<https://stackoverflow.blog/2017/09/06/incredible-growth-python/>. Acesso em: 30 de janeiro
de 2019.
MORENO, E.; PEREIRA, F.; CHIARAMONTE, R. Criptografia em Software e Hardware.
Novatec Editora, 2005.
Dicio, Dicionário Online de Português. Disponível em:
<https://www.dicio.com.br/criptografia/>. Acesso em: novembro de 2018
BORGES, Waldizar. Criptografia. Universidade Católica de Brasília, 2014.
ROT 13. Disponível em: <http://www.dantas.com/rot13/> Acesso em: 29 de novembro de
2018.
TodaMatéria, O que é Código Morse? Disponível em: <https://www.todamateria.com.br/o-que-
e-codigo-morse/>. Acesso em: 04 de janeiro de 2018.
Brasil Escola, Máquina Enigma. Disponível em:
<https://brasilescola.uol.com.br/historiag/maquina-enigma.htm> Acesso em: 05 de janeiro de
2019.
ELLIS, Claire. Exploring the Enigma. Disponível em
<http://plus.maths.org/content/os/issue34/features/ellis/index>. Acesso em: 05 de janeiro de
2019
56
DAVIES, Norman. A Europa em Guerra (1939-1945). Lisboa: Edições 70, 2008.
SCHNEIER, Bruce. Applied Cryptography, Protocols, Algorithms, and Source Code in C.
Segunda Edição. John Wiley and Sons, New York (1996).
AUER, Craig P. Secret History: The Story of Cryptology. Boca Raton, FL: CRC Press, 2013.
p. 360.
SHANNON, Claude. Communication theory of secrecy systems. Bell Systems Technical
Journal 28 (1949), pg. 656 a 715.
TIMOFIECSYK, Sabrina. Criptografia. Disponível em:
<http://www.batebyte.pr.gov.br/modules/conteudo/conteudo.php?conteudo=1384> Acesso
em: 10 de janeiro de 2019.
SALEVANE, Leandro; GADIS, Vinícius. Um Estudo Comparativo entre algoritmos de
criptografia DES – Lucifer (1977) e AES – Rijndael (2000). Universidade Luterana do Brasil,
2001.
KOCHER, Paul C., Timing Attacks on Implement at ions of Diffie-Hellman, RSA, DSS, and
Other Systems. Stanford, CA 94309, USA
Press Release. EFF DES Cracker Machine brings honesty to crypto debate. Disponível em:
<ttps://www.eff.org/press/releases/eff-des-cracker-machine-brings-honesty-crypto-debate>
Acesso em: 17 de janeiro de 2019.
ISO/IEC 18033-3:2005. Information technology -- Security techniques -- Encryption
algorithms -- Part 3: Block ciphers. Disponível em: <https://www.iso.org/standard/37972.htm>
Acesso em: 24 de janeiro de 2019.
G1. Nem FBI consegue decifrar arquivos de Daniel Dantas, diz jornal. Disponível em:
<http://g1.globo.com/politica/noticia/2010/06/nem-fbi-consegue-decifrar-arquivos-de-daniel-
dantas-diz-jornal.html
EDSTRÖM, Björn. TrueCrypt Explained. 2008. Disponível em:
<http://blog.bjrn.se/2008/01/truecrypt-explained.html>. Acesso em: 30 de janeiro de 2019.
Pypi. Pip install cryptography. Disponível em: < https://pypi.org/project/cryptography> Acesso
em: 30 de janeiro de 2019.
NITRATINE. Encryption and Decryption in Phyton. 2018. Disponível em:
<https://nitratine.net/blog/post/encryption-and-decryption-in-python/>. Acesso em: novembro
de 2018.
Cryptography. Fernet (symmetric encryption). Disponível em:
<https://cryptography.io/en/latest/fernet/>. Acesso em: 27 de janeiro de 2019.