Livro Criptografiaemhwesw Isbn85 7522 069-1-121124093411 Phpapp01
Short Description
Download Livro Criptografiaemhwesw Isbn85 7522 069-1-121124093411 Phpapp01...
Description
Dedicatória
Agradeço à minha familia pelo apoio, incentivo e compreensão nos momentos de ausência e, em especial, por terem sempre paciência e muito amor. À minha familia da Colômbia por seu eterno amor. Edward
Dedico este livro à minha esposa Ednéia, e ao meu filho, Pedro Luís, que iluminam o meu caminho. Aos meus pais que sempre me apoiaram, e aos meus amigos, que sempre me incentivaram em todos os sentidos. Fábio
Ofereço este livro aos meus pais Alcides e Marta, e à minha irmã Josiane, que sempre estiveram ao meu lado, apoiando-me e incentivando. Aos meus familiares pela compreensão e atenção em todos os momentos. Rodolfo
3
Agradecimentos
A DEUS pois, sem Ele, não estaríamos aqui e não fariamos nada daquilo que fazemos. À Mantenedora do UNIVEM, Fundação de Ensino Eurípides Soares da Rocha, pelo comprometimento com a educação de ensino superior, formando profissionais com excelência acadêmica e responsabilidade social, e principalmente, por oferecer condições acadêmicas integradas à realização de pesquisas, pois entendem que é um dos caminhos para se alcançar excelência acadêmica, universitária e profissional. Aos amigos e colegas do UNIVEM (Centro Universitário Eurípides de Marília, S.P.) que trabalham no LAS – Laboratório de Arquitetura e Sistemas Computacionais. Em especial a Cesar Giacomini Penteado e Rodrigo de Almeida Pericini que dividiram momentos de dificuldade e sucesso nos projetos e na vida. Aos amigos Paulo Henrique Trecenti, Luis Fernando Ruivo Gatti, Eduardo Elias Laíno de Oliveira, Thiago Albuquerque Pinto; cujos trabalhos de Conclusão de curso apresentado no curso de Bacharelado em Ciência da Computação do UNIVEM auxiliaram e, muito, a realização deste livro. Aos profissionais da área de computação e informática: Emiliano da Silva Alves, Vivian Patricia Mascarin e Everson Luiz Vilela Tescaro, que fizeram a sua especialização em engenharia de software, nos cursos lato-sensu do UNIVEM. Aos alunos do Mestrado em Ciência da Computação e alunos da especialização em redes de computadores e segurança da informação do UNIVEM. A todas as outras pessoas que, mesmo não citadas aqui, deram muito apoio e incentivo, que, sem os quais, esse livro não chegaria à sua conclusão.
4
Sobre os autores
Edward David Moreno é professor Doutor no UNIVEM (Centro Universitário Eurípides de Marília), e atua tanto no programa de mestrado stricto-sensu em ciência da computação quanto no curso de BCC (Bacharelado em Ciência da Computação). Também é Professor credenciado no programa de Pós-graduação da Universidade de São Paulo (USP, São Paulo) e membro do grupo HPCAC (High Performance Computer Architecture and Communications) da POLI-USP. O Prof. Moreno finalizou seu Pós-Doutorado na UFSCar (Universidade Federal de São Carlos), São Carlos/SP, 2000 na área de Aplicações em Computação de Alto Desempenho, o seu Doutorado em Eng. Elétrica/POLI-USP, 1998 na área de Computação de Alto Desempenho e Arquiteturas Avançadas de Computador e o seu Mestrado em Eng. Elétrica/POLI-USP, 1994 na área de Arquitetura de Computadores. Finalmente, a Graduação foi em Eng. Elétrica/Universidad del Valle, Cali,Colômbia,1991, com o projeto de Microcontroladores em Gate Arrays CMOS. No ano de 1999, fez uma especialização em Gestão de Projetos, na PUCParaná. As áreas de interesse do Prof. Moreno são: Arquitetura de Computadores, Computação de Alto Desempenho, Avaliação de Desempenho, Computação Reconfigurável e Prototipação de Sistemas Digitais. O Prof. Moreno tem escrito e publicado, como autor principal e co-autor, aproximadamente 100 artigos em eventos nacionais e internacionais. Experiência internacional trabalhando como pesquisador convidado em projetos tais como “NUMAchine Multiprocessor” desenvolvido na universidade de Toronto, Canadá, e no projeto “Large Databases for Multiprocessors” desenvolvido em Chalmers University of Technology, Gotebörg, Suécia. Ele participa ativamente na comunidade internacional, tendo já colaborado como membro de comitê de programa em aproximadamente 50 eventos de renome internacional. Fábio Dacêncio Pereira é bacharel e Mestre em Ciência da Computação pelo UNIVEM (Centro Universitário Eurípides de Marília). O projeto do mestrado foi na área de processadores para Segurança. Foi monitor do Laboratório de Arquitetura e Sistemas Computacionais (LAS) e Bolsista de IC da FAPESP (Fundação de Amparo à Pesquisa do Estado de São Paulo), no período de Agosto 2000 a Dezembro 2002, e bolsista CAPES no ano de 2004. Atualmente professor do UNIVEM. As áreas de interesse são: Circuitos e Sistemas Digitais em FPGAs, Avaliacao de Desempenho e Projeto de Processadores em FPGAs. Tem publicado alguns trabalhos em eventos nacionais e internacionais na área com ênfase no livro recente: Projeto, Implementação e Desempenho de Sistemas Digitais em FPGAs. 5
Rodolfo Barros Chiaramonte é bacharel em Ciência da Computação pelo UNIVEM. Atualmente mestrando na mesma instituição, no projeto “Sistemas Inteligentes de Segurança”, com bolsa da CAPES. O Rodolfo foi monitor do Laboratório de Realidade Virtual (LRV) do UNIVEM e Bolsista de Iniciação Científica, durante 3 anos, da FAPESP (Fundação de Amparo à Pesquisa do Estado de São Paulo), no período de Março 2001 a Dezembro 2003. As áreas de interesse são: Segurança de dados, Algoritmos de Criptografia, Circuitos e Sistemas Digitais em FPGAs, Avaliação de Desempenho. Tem publicado alguns trabalhos em eventos nacionais na área de criptografia e segurança da informação. Além disso, tem participado em algumas palestras e workshops sobre os assuntos acima mencionados.
6
Prefácio
Objetivos: •
Apresentar os principais algoritmos de criptografia utilizados na área de segurança e respectiva implementação em software (linguagem C e Java) e hardware (VHDL e FPGAs);
•
Explicar alguns códigos em C, enfatizando nas similaridades e diferenças de se programar usando linguagem C e VHDL (amplamente usada em projetos de hardware);
•
Comparar o desempenho desses algoritmos, tanto na implementação em software quanto em hardware. A análise comparativa é realizada através de parâmetros tais como: desempenho (velocidade, utilização de memória, impacto provocado pelo tamanho das chaves, etc.), nível de segurança, flexibilidade e facilidade de implementação e utilização;
•
Mostrar a importância da criptografia implementada em hardware (usando-se de circuitos programáveis tais como FPGAs e equipamentos modernos tais como HSM e Smart Cards);
•
Facilitar o aprendizado de segurança da informação usando-se de algoritmos de criptografia e a existência de algumas bibliotecas tais como CryptoAPI, JCA, OpenSSL e JCA;
•
Motivar o aprendizado de projeto de sistemas digitais próprios da área de segurança de dados, usando-se de técnicas de prototipação rápida de sistemas de segurança em hardware.
Dessa maneira, o livro oferece ao leitor uma ferramenta de aprendizagem sobre os diferentes algoritmos de criptografia atualmente utilizados, enfatizando em aspectos de desempenho, a qual está amplamente relacionada com a forma de implementação. O livro ensina os aspectos teóricos, relacionando-os com a parte prática (implementação e utilização), e pode ser lido tanto por iniciantes quanto por profissionais e acadêmicos que queiram se aprofundar mais no assunto.
Resumo: O texto está composto de 17 capítulos, organizados em quatro partes: Parte I: Conceitos Básicos de Segurança, Software e Hardware Parte II: Algoritmos Clássicos de Criptografia 7
Parte III: Algoritmos Modernos de Criptografia Parte IV: Ferramentas e Dispositivos Modernos de Segurança
Em termos gerais, a proposta do livro apresenta de maneira clara os principais algoritmos de criptografia (tanto simétricos e assimétricos), explicando de maneira simples o respectivo funcionamento, sem necessidade de aprofundamentos nos conceitos matemáticos. O livro destaca a implementação de alguns algoritmos de criptografia utilizando principalmente a linguagem C, assim como, a liguagem JAVA e VHDL, enfatizando a analise de desempenho de cada algoritmo, permitindo que o leitor saiba quando um algoritmo é melhor do que outro e porque. Isto é, apresenta, pela primeira vez, detalhes de performance (desempenho) desses algoritmos. Além de apresentar os níveis de segurança e aplicações, apresenta-se a velocidade com que cada algoritmo pode executar para diferentes tipos de arquivos de diferentes aplicações. Mais uma grande diferença, é a apresentação das potencialidades oferecidas por implementações em hardware desses algoritmos. Assim, ele apresenta uma nova técnica de projetar sistemas digitais em uma tecnologia moderna chamada de circuitos programáveis (FPGAs). Para isso se mostram os conceitos da linguagem própria para hardware (VHDL) e como se projetam esses circuitos específicos de criptografia a partir das respectivas implementações em software (a maioria em linguagem C e alguns outros algoritmos em Java). Finalmente, se faz uma comparação entre as respectivas implementações em Software e Hardware. Finalmente, no último capítulo, o décimo sétimo (17) se oferecem informações de uma ferramenta, chamada pelos autores de WEBCRY, e se disponibiliza um site na Internet com algumas informações públicas para que os leitores se atualizem a respeito dos algoritmos discutidos no livro, assim como a possibilidade de acessar alguns códigos e exemplos fornecidos no livro e a utilização da ferramenta WEBCRY criada pelos autores. Dessa maneira, os leitores e usuários podem exercitar a parte prática do livro e vivenciar por si mesmos os conhecimentos, experiências, resultados e os efeitos de desempenho desses algoritmos.
Público alvo: Estudantes e Professores da área da Computação e Informática (tais como Ciência da Computação, Sistemas de Informação, Engenharia da Computação, Engenharia Elétrica, Engenharia Eletrônica), interessados em adquirir e aprofundar os conhecimentos na área de segurança, do ponto de vista de algoritmos, sistemas digitais e desempenho. Profissionais que estejam realizando pós graduação lato sensu ou stricto sensu, nas áreas de segurança de dados e da informação.
8
Engenheiros e profissionais atuando na área de segurança de dados e da tecnologia da informação, com interesse em programação, no projeto de circuitos e sistemas digitais, e principalmente, no desempenho de sistemas de segurança.
Informações adicionais, tais como códigos da maioria dos algoritmos apresentados no livro podem ser acessados no link http://www.novateceditora.com.br/downloads.php, assim como detalhes da ferramenta WEBCRY.
9
Parte I Conceitos Básicos de Criptografia, Software e Hardware
A primeira parte divide-se em cinco capítulos, e é é feita uma introdução sobre o que será abordado no livro, como ele está estruturado e como pode ser lido. Este capítulo apresenta o assunto e motiva a necessidade do estudo de VHDL e a possível inserção de FPGAs como alternativa de projeto de circuitos e sistemas digitais, enfatiza principalmente os aspectos de implementação e desempenho de algoritmos de criptografia tanto em software quanto em hardware. Apresenta um algoritmo de criptografia, criado pelos autores e denominado de ALPOS, o qual visa, fundamentalmente, mostrar aos leitores com pouca experiência na área, como é possível criar soluções criptográficas. Esse algoritmo não é muito seguro, mas é uma versão didática que facilita o entendimento de vários conceitos relacionados à segurnaça de dados.
10
Capítulo 1 Conceitos de Segurança de Dados e Criptografia
Neste primeiro capítulo, Conceitos de Segurança de Dados e Criptografia, se apresenta e enfatiza a necessidade da segurança de dados nos tempos modernos, focalizando principalmente o papel dos algoritmos de criptografia e as vantagens de se ter conhecimento dos conceitos, implementação e, principalmente, do seu desempenho.
1.1 A Criptografia A criptografia pode ser entendida como um conjunto de métodos e técnicas para cifrar ou codificar informações legíveis através de um algoritmo, convertendo um texto original em um texto ilegível, sendo possível através do processo inverso recuperar as informações originais (SIMON, 1999), ver processo na figura 1.1.
Figura 1.1 – Esquema geral para cifragem de um texto.
Pode-se criptografar informações basicamente através de códigos ou de cifras. Os códigos protegem as informações trocando partes da informação por códigos predefinidos. Sendo que todas as pessoas autorizadas a ter acesso à uma determinada informação devem conhecer os códigos utilizados. As cifras são técnicas nas quais a informação é cifrada através da transposição e/ou substituição das letras da mensagem original. Assim, as pessoas autorizadas podem ter acesso às informações originais conhecendo o processo de cifragem. As cifras incluem o conceito de chaves, que será apresentado em outra seção. Os principais tipos de cifra são: as cifras de transposição que é a mistura dos caracteres da informação original. Por exemplo, pode-se cifrar a palavra "CRIPTOGRAFIA" e escrevê-la "RPORFACITGAI"; e as cifras de substituição que através de uma tabela de substituição predefinida é possível trocar ou substituir um caractere ou caracteres de uma informação. 11
1.1.1 Uma Breve História da Criptografia A criptografia é tão antiga quanto a própria escrita, já estava presente no sistema de escrita hieroglífica dos egípcios. Os romanos utilizavam códigos secretos para comunicar planos de batalha. Com as guerras mundiais e a invenção do computador, a criptografia cresceu incorporando complexos algoritmos matemáticos. A criptologia faz parte da história humana porque sempre houve fórmulas secretas e informações confidenciais que não deveriam cair no domínio público ou na mão de inimigos. Segundo Kahn (1967), o primeiro exemplo documentado da escrita cifrada aconteceu aproximadamente no ano de 1900 a.C, quando o escriba de Khnumhotep II teve a idéia de substituir algumas palavras ou trechos de texto. Caso o documento fosse roubado, o ladrão não encontraria o caminho que o levaria ao tesouro e morreria de fome perdido nas catacumbas da pirâmide. Em 50 a.C, Júlio César usou sua famosa cifra de substituição para cifrar (criptografar) comunicações governamentais. Para compor seu texto cifrado, César alterou letras desviando-as em três posições; A se tornava D, B se tornava E, e etc. Às vezes, César reforçava seu método de criptografar mensagens substituindo letras latinas por gregas. O código de César é o único da antigüidade que é usado até hoje. Atualmente qualquer cifra baseada na substituição cíclica do alfabeto denomina-se de código de César. Apesar da sua simplicidade (ou exatamente devido a ela), esta cifra foi utilizada pelos oficiais sulistas na Guerra de Secessão americana e pelo exército russo em 1915. Em 1901, iniciou-se a era da comunicação sem fio. Apesar da vantagem de uma comunicação de longa distância sem o uso de fios ou cabos, o sistema é aberto e aumenta o desafio da criptologia. Em 1921, Edward Hugh Hebern funda a Hebern Electric Code, uma empresa produtora de máquinas de cifragem eletro-mecânicas baseadas em rotores que giram a cada caracter cifrado (TKOTZ, 2003). Entre 1933 e 1945, a máquina Enigma que havia sido criada por Arthur Scherbius foi aperfeiçoada até se transformar na ferramenta criptográfica mais importante da Alemanha nazista. O sistema foi quebrado pelo matemático polonês Marian Rejewski que se baseou apenas em textos cifrados interceptados e numa lista de chaves obtidas através de um espião (KAHN, 1967). A seguir, outros acontecimentos relacionados à utilização da criptografia (TKOTZ, 2003): 1943 - Máquina Colossus projetada para quebrar códigos. 1969 - James Ellis desenvolve um sistema de chaves públicas e chaves privadas separadas. 1976 – Diffie-Hellman é um algoritmo baseado no problema do logaritmo discreto, é o criptosistema de chave pública mais antigo ainda em uso.
12
1976 - A IBM apresenta a cifra Lucifer ao NBS (National Bureau of Standards) o qual, após avaliar o algoritmo com a ajuda da NSA (National Security Agency), introduz algumas modificações (como as Caixas S e uma chave menor) e adota a cifra como padrão de criptografia de dados nos EUA (FIPS46-3, 1999), conhecido hoje como DES (Data Encryption Standard). Hoje o NBS é chamado de National Institute of Standards and Technology, NIST. 1977 - Ronald L. Rivest, Adi Shamir e Leonard M. Adleman começaram a discutir como criar um sistema de chave pública prático. Ron Rivest acabou tendo uma grande idéia e a submeteu à apreciação dos amigos: era uma cifra de chave pública, tanto para confidencialidade quanto para assinaturas digitais, baseada na dificuldade da fatoração de números primos grandes. Foi batizada de RSA, de acordo com as primeiras letras dos sobrenomes dos autores (TKOTZ, 2003). 1978 - O algoritmo RSA é publicado na ACM (Association for Computing Machinery), um dos melhores meios de divulgação de pesquisas científicas. Maiores detalhes desta organização podem ser obtidos no link www.acm.org. 1990- Xuejia Lai e James Massey publicam na Suiça "A Proposal for a New Block Encryption Standard" ("Uma Proposta para um Novo Padrão de Encriptação de Bloco")(LAI, 1990), o assim chamado IDEA (International Data Encryption Algorithm), para substituir o DES. O algoritmo IDEA utiliza uma chave de 128 bits e emprega operações adequadas para computadores de uso geral, tornando as implementações em software mais eficientes (SCHNEIER, 1996). 1991- Phil Zimmermann torna pública sua primeira versão de PGP (Pretty Good Privacy) como resposta ao FBI, o qual invoca o direito de acessar qualquer texto claro da comunicações entre usuários que se comunicam através de uma rede comunicação digital. O PGP oferece uma segurança alta para o cidadão comum e, como tal, pode ser encarado como um concorrente de produtos comerciais como o Mailsafe da RSADSI. Entretanto, o PGP é especialmente notável porque foi disponibilizado como freeware e, como resultado, tornou-se um padrão mundial enquanto que seus concorrentes da época continuaram absolutamente desconhecidos (BROWN, 2000). 1994- Novamente o professor Ronald L. Rivest, autor dos algoritmos RC2 e RC4 incluídos na biblioteca de criptografia BSAFE do RSADSI, publica a proposta do algoritmo RC5 na Internet. Este algoritmo usa rotação dependente de dados como sua operação não linear e é parametrizado de modo que o usuário possa variar o tamanho do bloco, o número de estágios e o comprimento da chave. 1994- O algoritmo Blowfish, uma cifra de bloco de 64 bits com uma chave de até 448 bits de comprimento, é projetado por Bruce Schneier (SCHNEIER, 1993). 1997- O PGP 5.0 Freeware é amplamente distribuído para uso não comercial. 1997- O código DES de 56 bits é quebrado por uma rede de 14.000 computadores (CURTIN, 1998).
13
1998 - O código DES é quebrado em 56 horas por pesquisadores do Vale do Silício (DESKEY, 2001). 1999 - O DES é quebrado em apenas 22 horas e 15 minutos, através da união da Electronic Frontier Foundation e a Distributed.Net, que reuniram em torno de 100.000 computadores pessoais ao DES Cracker pela Internet (MESERVE, 1999). 2000 - O NIST (National Institute of Standards and Technology) anunciou um novo padrão de uma chave secreta de cifragem, escolhido entre 15 candidatos. Este novo padrão foi criado para substituir o algoritmo DES, cujo tamanho das chaves tornouse insuficientes para conter ataques de força bruta (MESERVE, 1999). O algoritmo Rijndael cujo o nome é uma abreviação dos nomes dos autores Rijmen e Daemen foi escolhido para se tornar o futuro AES (Advanced Encryption Standard) (FIPS197, 2001). 2000 – 2004 – Muitos professores e profissionais da computação com vínculo em centros de pesquisa, universidades e empresas motivam-se e começam a pesquisar novas formas de implementar algoritmos e soluções de segurança. Surge assim, uma “onda” de pesquisas e desenvolvimentos voltados a realizar otimizações dessas primeiras implementações e uma dessas tendências é a implementação em hardware. Assim, este livro, mostra a importância de se implementar alguns desses algoritmos criptográficos em hardware, em especial, através do uso da tecnologia de circuitos programáveis (FPGAs), a qual é acessível e diminui de forma significativa os tempos e custos associados à realização de projetos e protótipos. Os computadores são a expressão maior da era digital, marcando presença em praticamente todas as atividades humanas. Da mesma forma com que revolucionaram a informação, também influenciaram na criptologia: por um lado ampliaram seus horizontes, por outro, tornaram a criptologia quase que indispensável. Na próxima seção apresenta-se a importância da criptografia.
1.1.2 A Importância da Criptografia Nesta seção é discutida a importância da criptografia, a segurança dos sistemas operacionais e porque se deve utilizar este recurso contra intrusos que desejam acessar informações alheias. A segurança eletrônica nunca foi tão amplamente discutida: casos de violação de contas bancárias, acesso a informações sigilosas, invasão e destruição de sistemas são cada vez mais comuns. Informações são transmitidas com mais eficiência e velocidade, mas como se sabe, nem sempre de forma segura. A privacidade é importante para pessoas e para as empresas. Muitos problemas podem acontecer se uma pessoa não autorizada tiver acesso a dados pessoais como: contracheque, saldo bancário, faturas do cartão de crédito, diagnósticos de saúde e senhas bancárias ou de credito automático. No caso de empresas, os danos podem ser de maior magnitude, atingindo a organização e os próprios funcionários. Dados estratégicos da empresa, previsão de venda, detalhes técnicos de produtos, resultados 14
de pesquisas e arquivos pessoais são informações valiosas que caso alguma empresa concorrente tiver acesso de forma indevida, pode acarretar em sérios problemas. A Internet é um ambiente que viabiliza principalmente a comunicação, a divulgação, a pesquisa e o comercio eletrônico. Em 1999 havia mais de 100 milhões de usuários da Internet nos Estados Unidos. No final de 2003 esse número alcançou 177 milhões nos Estados Unidos e 502 milhões no mundo todo (BURNETT, 2002). O comércio eletrônico emergiu como um novo setor da economia norte-americana, sendo responsável por cerca de U$100 bilhões em vendas durante 1999, em 2003 o comércio eletrônico excedeu a U$1 trilhão. Ao mesmo tempo, o Computer Security Institute (CSI) constatou um aumento de crimes cibernéticos, 55% dos entrevistados na pesquisa informaram atividades maliciosas relacionadas com pessoas da própria organização. Ciente disso pode-se ter certeza que as empresas em expansão precisam de produtos, mecanismos e soluções de segurança (BURNETT, 2002). Não muito tempo atrás a segurança era uma questão de se trancar uma porta ou um cofre. Atualmente as informações geralmente não estão armazenadas somente em papéis e sim em banco de dados. Como proteger essas informações? O que os sistemas operacionais (SO) oferecem para essa proteção ? Os sistemas operacionais oferecem um sistema de proteção através de permissões (ver figura 1.2). Isto é, através do SO é possível criar usuários com diferentes níveis de acesso para as informações contidas em um computador. Tal acesso é implementado via procedimento de login. Assim quando um determinado usuário fazer login em um computador terá acesso às pastas e arquivos designados pelo seu nível de permissão, isto é, se um usuário tiver restrições para o acesso de pasta, arquivos e programas, este não conseguirá acessar. Os cadastros de usuários e as permissões são concedidos pelo superusuário ou administrador do sistema. Este é responsável pelo gerenciamento do sistema, inclusive pode permitir que outros usuários possam alterar algumas permissões, como de uma pasta pessoal. Independente das restrições impostas, com o login de superusuário pode-se ter acesso a todas as funções do sistema. A questão é como o sistema operacional sabe que a pessoa que está acessando o sistema é realmente o superusuário? O SO concede a permissão através de um nome de usuário e senha, normalmente os nomes de usuários administradores são “root”, “su” ou “administrador” e infelizmente sabe-se que as técnicas para superar essas defesas são amplamente conhecidas (BURNETT, 2002). A seguir são descritos alguns dos principais ataques.
15
Figura 1.2 – Configuração da permissão de acesso a uma pasta no Windows 2000.
Ataque contra senhas: Vários sistemas operacionais vêm com um nome de usuário e senhas predefinidas e muitas vezes o mesmo login é utilizado para realizar várias tarefas como: criação de usuários, manutenção e backup, instalação de programas assim por diante. Não é uma boa prática utilizar o login predefinido. A utilização da senha predefinida ou de uma senha derivada de uma data de aniversário ou qualquer dado pessoal, pode facilitar o ataque ao sistema. Se o invasor não tiver a competência para descobrir a senha, este poderá utilizar aplicativos, chamados de software de cracking de senha. Esses softwares testam exaustivamente as possibilidades de senhas até encontrar uma válida, se a senha for fraca, em questão de minutos o invasor terá acesso ao sistema. Seria interessante dar preferência a diferentes senhas de superusuário para cada função do sistema, pois se o sistema for invadido, o intruso não terá acesso a todas as informações do sistema, mesmo acessando com um login de superusuário. Uma outra maneira para invadir e recuperar os dados do sistema é desviando do controle de permissões do SO, chamado de ataque de recuperação de dados. Ataques de recuperação de dados: O sistema operacional organiza as informações em arquivos e diretórios para que o usuário possa fazer um acesso rápido a uma determinada informação. Contudo, os dados assim como o controle de acesso a esses dados são bits eletrônicos. Assim, é possível fazer uma leitura destes bits não como arquivos de texto ou de números e sim como bits, independente do SO. Estes ataques 16
desviam do SO e capturam os bits brutos, reconstituindo-os em arquivos originais, burlando os controles de permissão do SO. Ataque de reconstrução de memória: Freqüentemente, o material sigiloso está armazenado na memória do computador. Quando executar um programa, este será armazenado em uma área da memória principal e o SO marca esta área como indisponível. Quando o programa é finalizado, o SO apenas disponibiliza a área sem sobrescrevê-la. O invasor simplesmente aloca a memória liberada e examina o que sobrou (BURNETT, 2002). Como impedir que um invasor tenha acesso a informações privadas? Para impedir o acesso a informação privada pode-se utilizar a proteção por criptografia. A proteção por criptografia é uma solução prática para proteger informações sigilosas, independente do algoritmo criptográfico utilizado sempre ocorrerá uma transformação de um texto legível em um ilegível. Mesmo que o invasor obtenha o conteúdo de um arquivo, este será ilegível. Para ter acesso à informação original, o invasor terá que resolver um problema matemático de difícil solução. A criptografia pode adicionar também maior segurança ao processo de identificação de pessoas, criando identidades digitais fortes. De modo algum a criptografia é a única ferramenta necessária para assegurar a segurança de dados, nem resolverá todos os problemas de segurança. É um instrumento entre vários outros. Além disso, a criptografia não é à prova de falhas. Toda criptografia pode ser quebrada e, sobretudo, se for implementada incorretamente, ela não agrega nenhuma segurança real (BURNETT, 2002).
1.1.3 Alguns Termos utilizados na Criptografia Junto com o conceito de criptografia, tem-se alguns termos oficiais comumente utilizados, que são conceituados nesta seção. O ato de transformar um texto legível (texto claro, texto original, texto simples) em algo ilegível (cifra, texto cifrado, texto código) é chamado de “encriptar” (codificar, criptografar, cifrar). A transformação inversa é chamada de “decriptar” (decodificar, decriptografar, decifrar). O algoritmo de criptografia é uma seqüência de procedimentos que envolvem uma matemática capaz de cifrar e decifrar dados sigilosos. O algoritmo pode ser executado por um computador, por um hardware dedicado e por um humano. Em todas as situações o que diferencia é a velocidade de execução e a probabilidade de erros. Existem vários algoritmos de criptografia, neste livro apresenta-se especificamente o DES, AES, RC5, IDEA e RSA, MD5 e SHA-1, pois são os mais utilizados atualmente, além do ALPOS (um algoritmo didático criado pelos autores). Além do algoritmo, utiliza-se uma chave. A chave na criptografia computadorizada é um número ou um conjunto de números. A chave protege a informação cifrada. Para decrifrar o texto cifrado o algoritmo deve ser alimentado com a chave correta, 17
que é única. Na figura 1.3 tem-se a ilustração do esquema geral de cifragem utilizando chave.
Figura 1.3 – Esquema geral de cifragem com chave.
Na história da criptografia sempre ficou evidente que não existe um algoritmo que não possa ser quebrado (descoberto ou solucionado). Com a criptografia computadorizada, atualmente, os algoritmos são divulgados à comunidade e o sigilo das informações é garantido apenas pela chave. Isto significa que se alguém descobrir a chave para decifrar uma determinada informação, todas as outras informações cifradas com este algoritmo ainda estarão protegidas, por terem chaves diferentes. Já um algoritmo criptográfico que não utiliza o recurso de chaves para cifrar as informações pode levar a um efeito cascata perigoso. Se este algoritmo for quebrado, todas as informações cifradas com ele estarão desprotegidas, pois o que garante o sigilo das informações seria o próprio algoritmo. Assim, toda criptografia moderna e computadorizada opera com chaves. A criptografia desde seu inicio, foi desenvolvida para impedir que um invasor ou intruso, alguém que está tentando acessar informações sigilosas tivesse sucesso. Há pouco tempo a criptografia era amplamente utilizada para proteger informações militares. Atualmente protege uma gama maior de diferentes informações. Os invasores não necessariamente só querem acessar informações sigilosas, mas também desativar sites, excluir informações de uma pessoa ou empresa, danificar sistemas em geral. O estudo sobre a quebra de sistemas criptográficos é conhecido como análise criptográfica. Semelhante ao invasor, o criptoanalista procura as fraquezas dos algoritmos. O criptógrafo desenvolve sistemas de criptografia. É importante que a comunidade de criptografia conheça as fraquezas, pois os invasores também estão procurando por elas. É quase certo que os invasores não irão publicar suas descobertas para o mundo (BURNETT, 2002).
18
1.1.4 Algoritmos de Bloco e Fluxo Pode-se classificar os algoritmos de criptografia através tratamento dado as informações que serão processadas assim, tem-se os algoritmos de bloco e os algoritmos de fluxo. A cifra de blocos opera sobre blocos de dados. O texto antes de ser cifrado é dividido em blocos que variam normalmente de 8 a 16 bytes que serão cifrados ou decifrados. Quando o texto não completa o número de bytes de um bloco, este é preenchido com dados conhecidos (geralmente valor zero “0”) até completar o número de bytes do bloco, cujo tamanho já é predefinido pelo algoritmo sendo usado. A forma mais comum de preenchimento é determinar o número de bytes que deve ser preenchido e utilizar este valor para preencher o bloco. Por exemplo: Suponha que o tamanho do bloco em um determinado algoritmo seja de 16 bytes e foi utilizado apenas 9. Deve-se preencher os 7 bytes restantes com o valor 07. Um problema na cifra de bloco é que se o mesmo bloco de texto simples aparecer mais de uma vez, a cifra gerada será a mesma facilitando o ataque ao texto cifrado. Para resolver este problema são utilizados os modos de realimentação. O modo mais comum de realimentação é a cifragem de blocos por encadeamento (Cipher Block Chaining - CBC). Neste modo é realizada uma operação de XOR do bloco atual de texto simples com o bloco anterior de texto cifrado. Para o primeiro bloco não há bloco anterior de texto cifrado assim, faz-se uma XOR com um vetor de inicialização. Este modo não adiciona nenhuma segurança extra. Apenas evita o problema citado da cifra de bloco. Portanto, os algoritmos de blocos processam os dados como um conjunto de bits, são os mais rápidos e seguros para a comunicação digital. Tem ainda como vantagem que os blocos podem ser codificados fora de ordem, o que é bom para acesso aleatório, além de ser resistente a erros, uma vez que um bloco não depende do outro. Entretanto, possuem como desvantagem que se a mensagem possui padrões repetitivos nos blocos, o texto cifrado também o apresentará, o que facilita o serviço do criptoanalista. Outra desvantagem é que um bloco pode ser substituído por outro modificando a mensagem original. Os algoritmos de fluxo criptografam (cifram) a mensagem bit a bit, em um fluxo contínuo, sem esperar que se tenha um bloco completo de bits. É também chamado de criptografia em Stream de dados, onde a criptografia se dá através de uma operação XOR entre o bit de dados e o bit gerado pela chave. A tabela 1.1 mostra algumas recomendações para selecionar o tipo de algoritmo que deverá ser usado em uma determinada aplicação.
Tabela 1.1 - Escolhendo um algoritmo por aplicação (BURNETT, 2002) 19
Aplicação
Cifragem Recomendada
Banco de Dados
Bloco
E-mail
AES
SSL
RC4
Criptografia de Arquivos
Bloco
Comentários A interoperabilidade com um outro software não é uma questão, mas é necessário reutilizar as chaves. Ganha-se interoperabilidade em todos os pacotes de e-mail utilizando o AES padrão. A velocidade é extremamente importante, cada conexão pode ter uma nova chave. Assim, na prática, a maioria dos navegadores e servidores possuem o RC4. A interoperabilidade não é uma questão, porém cada arquivo pode ser cifrado com a mesma chave e então proteger essa chave.
1.1.5 Vírus ou Informação Cifrada Fernando de la Cuadra, editor técnico internacional da empresa Panda Software, empresa de software de segurança e antivírus, aponta em seu artigo vantagens e problemas da criptografia atual (CUADRA, 2003). Enviar uma mensagem cifrada por correio eletrônico traz vantagens tanto para o emissor como para o receptor. A confidencialidade está praticamente assegurada. Ninguém que não conheça a chave utilizada na cifragem poderá entender as informações da mensagem. Assim, pode-se enviar todo tipo de informação com um bom nível de segurança, e praticamente estará salvo de teóricas interceptações na comunicação. Mas quem intercepta uma comunicação? Em principio imagina-se que seja um hacker, um espião ou qualquer outro usuário que queira acessar as informações da comunicação, mas também pode ser um antivírus fazendo uma verificação. Um antivírus sempre tentará impedir o ataque de um vírus, para isso, este examinará a mensagem enviada pelo correio eletrônico. O que pode acontecer é que dentro do conteúdo de uma mensagem cifrada pode existir um vírus e o antivírus não o identificará. Ou ainda, o antivírus pode identificar uma mensagem cifrada como sendo um vírus e esta mensagem poderá ser excluída. Atualmente 90% dos vírus estão espalhados pela Internet. Sendo assim, o mais lógico é a instalação de antivírus nos firewalls, proxys, etc. Mas se o vírus estiver em uma mensagem de correio eletrônico cifrada, até o melhor antivírus poderá falhar em seu objetvo de proteger as informações. E os usuários que receberem a mensagem cifrada, inconscientemente, serão infectados (CUADRA, 2003). Em definitivo, ninguém dúvida que os sistemas de criptografia sejam uma ferramenta que fornece segurança às comunicações, mas podem ter uma deficiência: podem esconder vírus. Uma solução para evitar que o vírus cifrado entre em uma determinada companhia ou organização, deveria ser uma proteção efetiva que bloqueia as mensagens cifradas não autorizadas, antes de chegar aos usuários finais (CUADRA, 2003).
20
1.2 Importância da Chave ou “senha” O termo “chave” vem do fato de que o número secreto, a famosa senha usada nos nos sistemas computacionais, funciona da mesma maneira que uma chave convencional usada nas portas e entradas a lugares fechados de residências, empresas e etc. de modo a proteger o patrimônio de um determinado usuário. Assim, de forma similar acontece com a criptografia, onde para proteger a informação de um determinado usuário (armazenada em arquivos de computador), se deve instalar uma fechadura (algoritmo de criptografia). Para operar a fechadura precisa-se da famosa chave ou senha (número secreto), a qual permite cifrar ou decifrar a informação desejada. O algoritmo realiza seus passos utilizando a chave para alterar o texto simples (mensagem original) e convertê-lo em texto cifrado. Para recuperar a informação em forma legível, é necessário inserir a mesma chave ou alguma que esteja relacionada com aquela que foi usada no processo anterior, e executar a operação inversa. O algoritmo inverte os passos e converte o texto cifrado de volta no texto simples original. Assim como apenas a chave correta de um determinado prédio pode abrir sua entrada, apenas a chave correta usada em criptografia pode cifrar ou decifrar os dados. Na criptografia de chave simétrica, a chave que é utilizada para criptografar os dados é a mesma chave que é utilizada para decifrá-los. Na criptografia assimétrica, usa-se outra chave que possui um valor relacionado com essa primeira chave, na seção 1.3 apresenta-se mais detalhes sobre criptografia simétrica e assimétrica. Toda criptografia moderna e computadorizada opera com chaves. Por que uma chave é necessária? Por que não criar um algoritmo que não necessite de uma chave?. Se os invasores podem entender o algoritmo, eles podem recuperar os dados secretos simplesmente executando o algoritmo. Uma primeira solução seria manter o algoritmo em segredo, mas essa abordagem tem vários problemas. Um deles é, supondo que não seja possível manter o algoritmo em segredo, os invasores sempre quebram o algoritmo. Isso não seria possível se houvesse especialistas em criptografia que desenvolvem seus próprios algoritmos, mas neste caso também deve-se confiar que a empresa ou usuário que escreveu o algoritmo nunca o revele. Neste ponto aparece um aspecto relevante em criptografia: o que é mais importante, um algoritmo que deve ser mantido em segredo ou um algoritmo que pode fazer seu trabalho de cifrar informações mesmo que os usuários de sistemas computacionais saibam como ele funciona. Neste segundo aspecto, aparece a importância dos algoritmos com chave, e principalmente, a relevância da chave. As chaves aliviam a preocupação com o algoritmo utilizado no esquema de criptografia. Em termos computacionais para proteger os dados com uma chave, é necessário proteger apenas a chave, algo que é mais fácil de ser feito do que proteger 21
um algoritmo. Além disso, se utilizar chaves para proteger os segredos, é possível utilizar diferentes chaves para proteger diferentes segredos. Isso significa que se alguém descobrir (“quebrar”) uma das chaves, os outros segredos ainda poderão estar seguros. Se alguma informação depender somente de um algoritmo secreto, algum invasor que quebre esse segredo obterá acesso a todas as informações contidas em um determinado sistema computacional. Assim, as chaves são muito importantes em criptografia. Esse é o princípio de Kerckhoffs, que diz da relevância do espaço de chaves, é muito mais seguro um sistema onde se conhece o algoritmo de criptografia, do que o espaço de chaves. Manter em segredo as chaves, e supondo conhecer o algoritmo usado, gera-se um sistema incondicional e computacionalmente seguro. Esse princípio ainda é válido, por várias razões (KERCKHOFFS, 1983). Os invasores podem deduzir um algoritmo sem ajuda nenhuma. Na história da criptografia nunca alguém foi capaz de manter um algoritmo criptográfico em segredo. Eles sempre o descobrem. Um exemplo disso é que durantes as guerras, os espiões sempre encontraram maneiras de descobrir o algoritmo, seja ele originado de uma operação matemática ou de uma máquina. Eles o roubam ou fazem com que alguém o revele (por meio de chantagem, extorsão ou pelo uso de técnicas de análise criptográfica). Agentes sempre descobriam o algoritmo ou obtinham uma cópia da máquina. Por exemplo, na Segunda Guerra Mundial, os soldados poloneses capturaram a máquina alemã Enigma, logo no início da guerra. A Enigma era uma máquina de criptografia que o exército alemão utilizava. Os aliados (isto é, os britânicos) foram capazes de quebrar o código mais facilmente porque tinham a posse dessa máquina. Alternativamente, os analistas criptográficos descobrem o algoritmo. Na Segunda Guerra Mundial, decifradores de código dos Estados Unidos foram capazes de determinar o funcionamento interno das máquinas codificadas japonesas sem ter a posse de uma dessas máquinas. Um caso mais recente, refere-se ao exemplo do algoritmo RC4, um algoritmo inventado em 1987, mas nunca publicado. Os analistas de criptografia e outros especialistas o estudaram e determinaram que o RC4 era uma boa maneira de manter os dados em segredo. Atualmente o RC4 é utilizado como parte do Secure Sockets Layer (SSL), o protocolo de comunicação segura da WEB (World Wide Web). Mas a empresa que o criou, a RSA Data Security, nunca tornou público o funcionamento interno do algoritmo RC4. Esse segredo tinha interesses financeiros e não de segurança. A empresa esperava que mantendo-o em segredo ninguém mais o implementaria e o comercializaria. Em 1994, hackers anônimos divulgaram o algoritmo na Internet. Acredita-se que eles provavelmente o descobriram usando um depurador de linguagem assembly, após terem tido acesso a uma cópia do códigoobjeto. Se um sistema criptográfico estiver baseado no hardware, os engenheiros abrem-no e examinam as partes internas. Em 1998, David Wagner e Ian Goldherg, nessa época 22
alunos graduados da Universidade da Califórnia em Berkeley, abriram um telefone celular digital, supostamente seguro, e quebraram seu código. Às vezes é possível manter um algoritmo em segredo por um período suficientemente longo para que ele seja eficaz, mas após certo tempo alguém acaba descobrindo-o. A segunda razão de relevância da senha, mais do que o algoritmo usado refere-se à assuntos comerciais. Empresários e usuários sempre desejam saber como um determinado software de interesse foi realizado. Caso a empresa não revele os segredos de implementação e construção, através de técnicas de reengenharia reversa sobre um software pode-se conhecer detalhes da sua criação e respectiva implementação. Soma-se a isso o fato que somente pessoas que adquiriram o produto podem se comunicar entre si. Isso enviabiliza a comunicação com pessoas que não adquiriram ou compraram o algoritmo de um mesmo fornecedor. Dessa maneira, como resultado, os algoritmos devem ser padronizados e isso significa que eles devem ser públicos. Se alguém quiser utilizar a criptografia, é necessário empregar um dispositivo de hardware ou um programa de software. Portanto, se faz necessário adquirir o produto em algum lugar. Assim, como os usuários podem ter acesso a ele, os invasores também têm. Desse modo, possíveis invasores podem ir à mesma fonte e conseguir suas próprias cópias. Isso faz com que os algoritmos devem ser disponibilizados, e melhor então, deve-se cuidar da chave. Uma outra razão para cuidar da chave e não do algoritmo refere-se ao fato que é possível construir sistemas criptográficos no qual o algoritmo é completamente conhecido, mas é seguro pois os possíveis invasores precisam conhecer a chave para descobrir as informações. Estes sistemas são mais seguros do que aqueles que não tem chave, e somente confiam no segredo de não se conhecer o algoritmo. Quando os algoritmos se tornam públicos, os analistas criptográficos e os profissionais da área de computação têm uma chance de examinar suas fraquezas. Se um algoritmo for vulnerável, pode optar por não utilizá-lo. Caso contrário, pode ter certeza de que os dados estão seguros. Por outro lado, se um algoritmo for mantido em segredo, os analistas não serão capazes de encontrar nenhuma fraqueza que ele possa ter, assim não se sabe se ele é ou não é vulnerável.
1.2.1 Como Gerar a Chave Em um sistema criptográfico de chave simétrica, a chave é formada por um conjunto de caracteres. Ele pode ser um número qualquer, ou uma seqüência de caracteres
23
alfanuméricos (letras e símbolos especiais) contanto que tenha um tamanho correto e adequado àquele que o algoritmo criptográfico selecionado permitir. Geralmente, aconselha-se que a chave seja formada por números ou caracteres alfanuméricos sem coerência nenhuma entre si, pois assim fica mais díficil descobríla (ou em termos criptográficos, quebrá-la). A chave deve ser, dentro do possível, selecionada de forma aleatória. Para os criptógrafos, valores aleatórios são simplesmente conjuntos de números que passam em testes estatísticos de aleatoriedade e não são repetíveis. Com esse intuito, de gerar chaves, há várias técnicas usadas. Entre elas destaca-se a utilização de sistema geradores de número aleatórios (GNA) ou RNG (Random Number Generator). Esses dispositivos funcionam agrupando números de diferentes tipos de entradas imprevisíveis como a medição da desintegração espontânea de radioatividade, o exame das condições atmosféricas ou o cálculo de minúsculas variâncias na corrente elétrica. Esses números passam por testes de aleatoriedade. Se solicitar um segundo grupo de números, a nova seqüência será completamente diferente, isto é, nunca receberá a mesma seqüência novamente. Isso ocorre porque a saída é baseada em uma entrada que sempre está mudando. Esses números podem ser obtidos utilizando algoritmos chamados de GNPA geradores de números pseudo-aleatórios (pseudo-random number generators PRNGs). Se um desses algoritmos for utilizado para gerar alguns milhares de números e aplicar testes estatísticos, os números passariam no teste de aleatoriedade. O que torna esses números pseudo-aleatórios, e não aleatórios, é que eles são repetíveis. Se for instalado o mesmo GNPA em um outro computador, os mesmos resultados poderão vir a ser obtidos. Se o programa for executado um tempo depois, os mesmos resultados podem ser obtidos. Para evitar esse problema, costuma-se usar GNPA com uma entrada diferente em cada evento de utilização (chamada de semente). Assim, gerar-se-á dados diferentes, pois alterando a entrada, a saída será alterada. A geração aleatória dessa chave está associada a dois parâmetros importantes: velocidade de geração e entropia, as quais estão intimamente relacionadas com o tamanho da chave.
1.2.2 Importância do Tamanho da Chave Se os invasores puderem descobrir qual é a chave usada na cifragem dos dados, eles podem decifrar a mensagem enviada e obter os dados contidos nela. Um método, conhecido como ataque de força bruta, consiste em tentar todas as possíveis chaves até que a correta seja identificada. Ele funciona dessa maneira. Suponha que a chave seja um número entre 0 e 1.000.000 (um milhão). O invasor pega o texto cifrado e alimenta o algoritmo de criptografia junto com a “suposta chave” de valor “0”. O algoritmo realiza seu trabalho e produz um resultado. Se os dados resultantes parecerem razoáveis, “0” provavelmente é a chave correta. Se for um texto sem sentido, “0” não é a verdadeira chave. Nesse caso, ele tenta outro valor, por exemplo “1” e em seguida “2”, “3”, “4” e assim por diante. 24
Um algoritmo simplesmente realiza os passos, independentemente da entrada. Ele não tem nenhuma maneira de saber se o resultado que ele produz é o correto. Mesmo se o valor for um próximo da chave, talvez errado em apenas “1”, o resultado será um texto sem sentido. Assim, é necessário examinar o resultado e compará-lo para identificar algum sentido e assim informar se o valor usado como chave pode ser a chave realmente usada para cifrar as mensagens. Como isso depende de uma seqüência de entrada e saída, com valores supostos de chaves, um método consiste em criar programas que façam esses passos até descobrirem alguma informação. Normalmente, esse processo requer pouco tempo para testar uma chave. Assim, pode-se escrever um programa que verifique várias chaves por segundo. Computacionalmente isso torna possível descobrir qualquer chave, somente precisase de tempo. Interessante perceber que esse tempo de procura está fortemente associado ao tamanho da chave. Chaves criptográficas são medidas em bits. O intervalo de possíveis respostas para identificar uma chave está em correspondência ao número 2TC, onde “TC” é o Tamanho da Chave em bits. Assim, tendo-se uma chave de 2 bits significa que o intervalo de possíveis valores é de 0 até 22 = 4. Uma chave de 40 bits significa que o intervalo dos possíveis valores é de 0 até aproximadamente 1 trilhão (240). Uma chave de 56 bits é de 0 até aproximadamente 72 quatrilhões (256). O intervalo de uma chave de 128 bits é tão grande que é mais fácil apenas dizer que ela é uma chave de 128 bits (número de possibilidades igual a 2128). Cada bit adicionado ao tamanho da chave dobrará o tempo requerido para um ataque de força bruta. Se uma chave de 40 bits levasse três horas para ser quebrada, uma chave de 41 bits levaria seis horas, uma chave de 42 bits, 12 horas e assim por diante. Isso acontece pois cada bit adicional da chave dobra o número de chaves possíveis, (lembrar que esse número está em função de 2TC). Assim ao adicionar um bit o número de chaves possíveis é dobrado. Dobrando o número de chaves possíveis, o tempo médio que um ataque de força bruta leva para encontrar a chave correta também é dobrado. Portanto, para se ter maior segurança, isto é tornar o trabalho de um determinado invasor mais difícil, deve-se escolher uma chave maior. Chaves mais longas significam maior segurança. A tabela 1.2 mostra o impacto de se aumentar o tamanho da chave e o respectivo tempo de quebrar a chave usando ataque por força bruta, assim como a respectiva estimativa de custo (em doláres) da tecnologia necessária para encontrar a chave. Pode-se ver que tendo mais recursos disponíveis (em tecnologia e portanto maior custo em doláres) é possível diminuir o tempo de se encontrar uma determinada chave. Não obstante seja possível achar a chave, há tamanhos de chave que inviabilizam esse fato, pois demandaria muito tempo.
25
Nessa tabela, o termo 2s significa 2 segundos; 200ms siginifica que o tempo é dado em milisegundos (10-3 segundos); 200 us significa que o tempo é dado em microsegundos (isto é, 10-6 segundos). Tabela 1.2 – Tempo gasto para quebra de chaves por força bruta (SCHNEIER, 1996) Tamanho da Chave (bits) Custo U$ 40 56 64 80 112 100000 2s 35 horas 1 ano 70000 anos 10 e 14 10 e 19 1 Milhão 200 ms 3,5 h 37 dias 7000 anos 10 e 13 10 e 18 10M Milhões 20s 21 m 4 dias 700 anos 10 e 12 10 e 17 100 M 2 ms 2m 9h 70 anos 10 e 11 10 e 16 1G 200 us 13 s 1h 7 anos 10 e 10 10 e 15 10G 20 us 1 s 5,4 m 245 anos 10 e 9 10 e 14 100G 2 us 100 ms 32 s 24 anos 10 e 8 10 e 13 1T 0,2 us 10 ms 3 s 2,4 anos 10 e 7 10 e 12 10T 0,02 us 1 ms 300 ms 6 horas 10 e 6 10 e 11
128
Importante lembrar que o poder computacional dobra a cada 1.5 anos, e que o tempo de existência do universo, segundo os últimos estudos científicos, está em torno de 10 10e10 anos. Assim, chega-se à conclusão que sempre é possível decrifrar uma determinada mensagem, pois sempre será possível descobrir a chave: basta testar todas as chaves possíveis –é somente uma questão de tempo. Mas pode demorar mais que o tempo de duração do Universo (SCHNEIER, 1996). Então, qual o tamanho máximo que uma chave deve ter? Com o passar dos anos, o RSA Laboratories propôs alguns desafios. A primeira pessoa ou empresa a quebrar uma mensagem em particular ganharia um prêmio em dinheiro. Alguns desafios foram testes do tempo de um ataque de força bruta. Em 1997, uma chave de 40 bits foi quebrada em três horas e uma chave de 48 bits durou 280 horas. Em 1999, a Electronic Frontíer Foundation encontrou uma chave de 56 bits em 24 horas. Em cada um dos casos, pouco mais de 50% do espaço de chave foi pesquisado antes de a chave ser encontrada. Em todas essas situações, centenas ou até milhares de computadores operavam conjuntamente para quebrar as chaves. Na realidade, com o desafio de 56 bits de DES que a Electronic Frontier Foundation quebrou em 24 horas, um dos computadores era um cracker especializado em DES. Esse tipo de computador faz apenas uma coisa: verifica as chaves de DES. Um invasor que trabalhe secretamente, provavelmente não seria capaz de reunir a força de centenas de computadores e talvez não possua uma máquina especificamente construída para quebrar um algoritmo em particular. Para a maioria dos invasores, essa é a razão pela qual o tempo que leva para quebrar a chave quase certamente seria significativamente mais alto. Por outro lado, se o invasor fosse uma agência governamental de inteligência com grandes recursos, a situação seria diferente. 26
Pode-se pensar em situações ainda mais críticas. Suponha que examinar 1% do espaço de chave de uma chave de 56 bits leva 1 segundo e examinar 50% leva 1 minuto. Todas as vezes que se adicionar um bit ao tamanho de chave dobra-se então o tempo de pesquisa. Os resultados são mostrados na tabela 1.3, onde se percebe que o impacto e observações realizadas para os dados da tabela 1.2, são também aplicavéis. Tabela 1.3 – Tempo gasto para quebra de chaves (BURNETT, 2002)
Bits 1% do Espaço da Chave 50% do Espaço da Chave 56
1 segundo
1 minuto
57
2 segundos
2 minutos
58
4 segundos
4 minutos
64
4,2 minutos
4,2 horas
72
17,9 horas
44,8 dias
80
190,9 dias
31,4 anos
90
535 anos
321 séculos
108 140.000 milênios
8 milhões de milênios
128 146 bilhões de milênios
8 trilhões de milênios
Atualmente, 128 bits é o tamanho de chave simétrica mais comumente utilizado. Se a tecnologia avançar e os invasores de força bruta puderem melhorar esses números (talvez eles possam reduzir para alguns anos o tempo das chaves de 128 bits), então precisar-se-á de chaves de 256 bits ou ainda maiores. Assim, considerando que a tecnologia sempre está avançando, então teremos de aumentar repetidas vezes o tamanho das chaves. Então, com o passar do tempo sempre será necessário aumentar o tamanho das chaves. É bom lembrar que aumentar a chave significa também em aumentar o tempo cifragem e decifragem. Por isso é recomnedável ter cuidados com a escolha do tamanho da chave. Assim, é possível pensar que pode chegar um um momento quando precisaremos de uma chave tão grande que ela se tornará muito difícil de lidar. No momento atual, e considerando os conhecimnentos adquiridos na área de segurança, quase certamente nunca precisaremos de uma chave mais longa do que 512 bits (64 bytes). Supondo que cada átomo no universo conhecido (há aproximadamente 2300) fosse um computador e que cada um desses computadores pudesse verificar 2300 chaves por segundo, isso levaria cerca de 2162 milênios para pesquisar 1% do espaço de chave de uma chave de 512 bits. De acordo com a teoria do Big Bang, o tempo decorrido desde a criação do universo é menor de 224 milênios. Em outras palavras, é 27
altamente improvável que a tecnologia vá tão longe para forçar a utilizar chaves que sejam “muito grandes” (BURNETT, 2002). Apesar do ataque de força bruta precisar de muito tempo, principalmente quando a chave possui um tamanho razoável, há outros ataques que exploram as fraquezas nos algoritmos criptográficos, e tendem a diminuir o tempo do ataque. Por esse motivo, no momento recomenda-se usar chaves relativamente longas, superiores a 128 bits. Já aplicações comerciais e financeiras (por exemplo, transações bancárias), é necessário que a chave seja maior que 128 bits. Isso significa que usuário comum que tente fazer um ataque de força bruta, precisará de muito tempo para ter uma invasão considerada bem sucedida.
1.3 Criptografia de Chave Simétrica e Assimétrica Na criptografia de chave simétrica os processos de cifragem e decifragem são feitos com uma única chave, ou seja, tanto o remetente quanto o destinatário usam a mesma chave. Em algoritmos simétricos, como por exemplo o DES (Data Encription Standard), ocorre o chamado "problema de distribuição de chaves". A chave tem de ser enviada para todos os usuários autorizados antes que as mensagens possam ser trocadas. Isso resulta num atraso de tempo e possibilita que a chave chegue a pessoas não autorizadas. A criptografia assimétrica contorna o problema da distribuição de chaves através do uso de chaves públicas. A criptografia de chaves públicas foi inventada em 1976 por Whitfield Diffie e Martin Hellman a fim de resolver o problema da distribuição de chaves. Neste novo sistema, cada pessoa tem um par de chaves chamadas: chave pública e chave privada. A chave pública é divulgada enquanto que a chave privada é deixada em segredo. Para mandar uma mensagem privada, o transmissor cifra a mensagem usando a chave pública do destinatário pretendido, que deverá usar a sua respectiva chave privada para conseguir recuperar a mensagem original. Atualmente, um dos mecanismos de segurança mais usados é a assinatura digital, a qual precisa dos conceitos de criptografia assimétrica. A assinatura digital é uma mensagem que só uma pessoa poderia produzir, mas que todos possam verificar. Normalmente autenticação se refere ao uso de assinaturas digitais: a assinatura é um conjunto inforjável de dados assegurando o nome do autor que funciona como uma assinatura de documentos, ou seja, que determinada pessoa concordou com o que estava escrito. Isso também evita que a pessoa que assinou a mensagem depois possa se livrar de responsabilidades, alegando que a mensagem foi forjada. Um exemplo de criptossistema de chave pública é o RSA (Rivest-Shamir-Adelman). Sua maior desvantagem é a sua capacidade de canal limitada, ou seja, o número de bits de mensagem que ele pode transmitir por segundo (BURNETT, 2002). A figura 1.4 ilustra o funcionamento da criptografia simétrica e assimétrica. Observa-se que existem duas chaves na criptografia assimétrica.
28
Figura 1.4 – Modelo simétrico e assimétrico de criptografia.
Após analisar o exposto acima, pode-se ficar em dúvida de qual modelo utilizar: simétrico ou assimétrico. Pois bem, devido a isso foi desenvolvido um modelo híbrido, ou seja, que aproveitasse as vantagens de cada tipo de algoritmo. O algoritmo simétrico, por ser muito mais rápido, é utilizado no ciframento da mensagem em si, enquanto o assimétrico, embora lento, permite implementar a distribuição de chaves e alguns a assinatura digital. Então, os algoritmos criptográficos podem ser combinados para a implementação dos três mecanismos criptográficos básicos: o ciframento, a assinatura digital e o hashing, sendo que estes últimos dois conceitos ainda serão descritos e analisados em capítulos posteriores. Estes mecanismos são componentes de protocolos criptográficos, embutidos na arquitetura de segurança dos produtos destinados ao comércio eletrônico. Estes protocolos criptográficos, portanto, provêm os serviços associados à criptografia que viabilizam o comércio eletrônico. Descreve-se abaixo alguns exemplos de protocolos que empregam sistemas criptográficos híbridos. O IPSec é o padrão de protocolos criptográficos desenvolvidos para o IPv6. Realiza também o tunelamento de IP sobre IP. Prometido como futuro padrão para todas as formas de VPN – Virtual Private Network(MAIA, 1999). O SSL e TLS oferecem suporte de segurança criptográfica para os protocolos NTTP, HTTP, SMTP e Telnet. Permitem utilizar diferentes algoritmos simétricos, message digest e métodos de autenticação e gerência de chaves para algoritmos assimétricos (MAIA, 1999). O SSL, que significa Security Socket Layer, é o protocolo mais 29
conhecido em transações via WEB e hoje domina esse mercado, estando presente principalmente em vendas on-line envolvendo cartão de crédito. Foi criado pela Netscape, sendo o padrão livre para uso pessoal e empresarial. Ressalte-se novamente o nível de segurança deste protocolo, o qual assegura a inviolabilidade das vendas on-line com cartão de crédito (GEEK, 2002). Pode-se citar também como exemplo o PGP, já descrito anteriormente, lembrando-se de que se trata de um programa de criptografia famoso e bastante difundido na internet, destinado a criptografia de e-mail. Suporta os algoritmos hashing MD5 e SHA-1. O S/MIME (Secure Multipurpose Internet Mail Extensions) consiste em um esforço de um consórcio de empresas, tendo inclusive como um dos líderes a Microsoft, para adicionar segurança a mensagens eletrônicas no formato MIME. Acredita-se que o S/MIME deverá se estabelecer no mercado corporativo, enquanto que o PGP atuará no mundo do e-mail pessoal (MAIA, 1999). Já o SET é um conjunto de padrões e protocolos para realizar transações financeiras seguras, como as realizadas com cartões de crédito na internet. Oferece um canal seguro entre todos os envolvidos na transação, bem como autenticidade e privacidade entre as partes envolvidas. A especificação X.509 define o relacionamento entre as autoridades de certificação. Baseado em criptografia de chave pública e assinatura digital (MAIA,1999). Pode-se então traçar um comparativo entre os modelos vistos (criptografia simétrica e assimétrica), conforme se mostra na Tabela 1.4. Tabela 1.4 Comparação entre os Tipos de Algoritmos de Criptografia
Criptografia Simétrica
Criptografia Assimétrica
Rápida
Lenta
Gerência e distribuição das chaves é complexa
Gerência e distribuição é simples
Não oferece assinatura digital.
Oferece assinatura digital
A tabela 1.5, mostra detalhes dos algoritmos simétricos mais conhecidos pela comunidade da área de segurança da informação e criptografia.
Tabela 1.5 Características dos Algoritmos Simétricos mais Conhecidos
30
Algoritmo DES Triple Des (2 chaves) Triple DES (3 chaves) IDEA Blowfish RC5 CAST-128 RC2 RC4 Rijndael (AES) MARS RC6 Serpent Twofish
Tipo Bloco Bloco Bloco Bloco Bloco Bloco Bloco Bloco Stream (fluxo) Bloco Bloco Bloco Bloco Bloco
Tamanho Chave 56 112 168 128 32 a 448 0 a 2040 40 a 128 0 a 1024 0 a 256 128, 192, 256 Variável Variável Variável 128, 192, 256
Tamanho Bloco 64 64 64 64 64 32, 64, 128 64 64 -128, 192, 256 128 128 128 128
Nessa tabela é possível observar que a maioria dos algoritmos criptográficos modernos, os mais usados na atualidade, são baseados no sistema de cifrar as informações por bloco, cujo tamanho de bloco mais usado é de 64 bits e possuem chaves de tamanho relativamente grande, superior a 56 bits. Outro aspecto que merece destaque, é o fato de alguns algoritmos possuem tamanhos de chave e/ou de bloco variável (ver situação dos algoritmos blowfish, RC5, CAST, RC2, RC4, Rijndael - AES, MARS, RC6, Serpent e Twofish, que casualmente foram os algoritmos que fizeram parte do projeto AES) (BIHAM, 1999).
1.4 Assinatura Digital Alguns algoritmos criptográficos de chave-pública permitem a sua utilização para gerar o que se denomina de assinaturas digitais. O algoritmo RSA é um destes algoritmos, assim, além da operação normal de cifrar com a chave-pública e decifrar com a chave-privada, permitir que, cifrando-se com a chave-privada, o processo de decifrar com a chave-pública resulta na recuperação da mensagem (BUCHMANN, 2001). Obviamente esta forma de uso não assegura o sigilo da mensagem, uma vez que qualquer um pode decifrar a mensagem, dado que a chave-pública é de conhecimento público. Entretanto, se esta operação resulta na mensagem esperada pode-se ter a certeza de que somente o detentor da correspondente chave-privada poderia ter realizado a operação de cifragem. Assim, uma assinatura digital é o criptograma resultante da cifração de um determinado bloco de dados (documento) pela utilização da chave-privada de quem assina em um algoritmo assimétrico. A verificação da assinatura é feita decifrandose o criptograma (assinatura) com a suposta chave-pública correspondente. Se o resultado for válido, a assinatura é considerada válida, ou seja, autêntica, uma vez que apenas o detentor da chave privada, par da chave pública utilizada, poderia ter gerado aquele criptograma. Na figura 1.5 ilustra-se este procedimento.
31
Figura 1.5 – Geração de Assinatura Digital de um documento (BURNETT, 2002).
Nesta figura um usuário de nome Fábio assina um documento, cifrando-o com sua chave-privada e enviando tanto o documento original quanto a assinatura para um outro usuário chamado de Edward. Este usuário verifica a assinatura decifrando-a com a chave-pública de Fábio (de conhecimento público), e comparando o resultado com o documento recebido. Se estiverem de acordo, a assinatura confere, caso contrário a assinatura é considerada inválida, significando que ou não foi Fábio quem assinou, ou o documento foi adulterado após a assinatura. Interessante observar que este procedimento é capaz de garantir tanto a origem (autenticação do emissor), tendo em vista que supostamente somente Fábio conhece sua chave privada e portanto somente ele é capaz de gerar uma assinatura que possa ser verificada com sua chave-pública, como também a integridade do documento, já que, se o mesmo for alterado, a verificação da assinatura irá indicar isto, caso tenha vindo efetivamente do pretenso emissor. Usualmente, face à ineficiência computacional dos algoritmos assimétricos, os métodos para assinatura digital empregados na prática não assinam o documento que se deseja autenticar em si, mas uma súmula deste, obtida pelo seu processamento através do que se denomina uma função de Hashing. Uma função de hashing é uma função criptográfica que gera uma saída de tamanho fixo (geralmente 128 a 256 bits) independentemente do tamanho da entrada. A esta saída se denomina de hash da mensagem (ou documento ou o que quer que seja a entrada). Segundo Burnett (BURNETT, 2002), para ter utilidade criptográfica, a função de hashing deve ser: •
Simples (eficiente, rápido) se computar o hash de dada mensagem;
•
Impraticável se determinar a entrada a partir de seu hash;
•
Impraticável se determinar uma outra entrada que resulte no mesmo hash de uma dada entrada;
•
Valores de hash possíveis são estatisticamente equiprováveis.
32
A tabela 1.6 mostra as características dos algoritmos de hashing mais conhecidos pela comunidade da área de segurança de dados. Tabela 1.6 Características dos Algoritmos de hashing mais conhecidos (GUELFI,2002) Algoritmo de Hash Abreast Bavies-Meyer (c/IDEA) Davies-Meyer (c/DES) GOST-Hash NAVAL (3 passos) NAVAL (4 passos) NAVAL (5 passos) MD4 – Message Digest 4 MD5 – Message Digest 5 N-HASH (12 rounds) N-HASH (15 rounds) RIPE-MD RIPE-MD-160 SHA – Secure Hash Algorithm SNEFRU (4 passos) SNEFRU (8 passos)
Tamanho HASH 128 64 256 Variável Variável Variável 128 128 128 128 128 160 160 128 128
Kbytes/s 22 9 11 168 118 95 236 174 29 24 182 -75 48 23
Nessa tabela é possível observar que a maioria dos algoritmos de hashing usam um tamanho de hash fixo, com destaque para 128 e 160 bits, que são os tamanhos mais usados pela comunidade. Os algoritmos mais conhecidos pela comunidade acadêmica e com utilidade comercial são o algoritmo SHA, MD4 e MD5. Já os outros, como o nome indicado na tabela 1.6 sugere, pertencem a aplicações governamentais e de uso privado, como por exemplo aplicações militares e navais.
1.5 Considerações Finais do Capítulo Ainda no contexto da visão atual de criptografia, pode-se elencar outros fatores que impulsionam seu estudo e evolução: •
A tecnologia de protocolos de rede tornará a Internet uma rota vulnerável à invasões e furto de informações;
•
Crackers de todas as partes estão dispostos a destruir até mesmo os mais sólidos negócios on-line e possuem armas intelectuais para isso;
•
E-commerce começou a perder adeptos, por ser suscetível a fraudes em operações envolvendo transferência de dinheiro e cartões de crédito;
•
Correio eletrônico também não é seguro;
•
Diversos serviços on-line aproveitam a ingenuidade do internauta para invadir um microcomputador e obter dados pessoais;
•
Pelo computador é muito mais fácil e provável a aplicação de métodos de monitoramento; 33
•
Ainda existe um sentimento de insegurança quando se realiza alguma transação comercial via internet, fazendo com que não seja aproveitado todo o potencial neste tipo de comércio;
•
A invasão de máquinas/sistemas e roubo de informação é uma realidade, deixando de lado a imagem fictícia e cinematográficas;
•
Os algoritmos de criptografia ainda são um conceito distante da grande massa de usuários, se apresentado como algo abstrato e intangível.
Por esse motivo, este livro além de apresentar de forma clara os algoritmos criptográficos mais usados no momento, preocupa-se em apresentar dados de desempenho: tempos de execução do processo de cifragem e decifragem, tempo de processamento de alguns algoritmos simétricos (DES, AES, IDEA, RC5) e assimétricos como o RSA e funções de hashing (MD5 e SHA-1), quando implementados em software (usando-se da linguagem C e alguns deles em Java) e hardware (em circuitos programáveis – FPGAs através da linguagem especial para descrição de sistemas digitais, conhecida como VHDL). Um dos pontos de interesse ao leitor é destacar que ao aumentar o tamanho da chave aumenta o nível de segurança, mas aumenta-se também o tempo de processamento do processo de cifragem e decifragem. Neste livro mostra-se qual é o real impacto desse processo, tais como impacto do algoritmo no tempo de processamento, impacto do sistema operacional (Windows, Linux), impacto do processador e etc.
34
Capítulo 2 Conceitos de Circuitos Programáveis FPGAs e VHDL e VHDL
Neste capítulo, apresentam-se conceitos básicos de circuitos programáveis FPGAs e da linguagem de descrição de hardware VHDL. Inicialmente é apresentada a estrutura interna e roteamento dos circuitos FPGAs, discutindo conceitos de reconfiguração. Posteriormente tem-se a definição das formas de descrever um circuito utilizando VHDL, exemplificando cada metodologia de descrição de hardware, onde a sintaxe da linguagem é baseada no padrão VHDL’93. Além de descrever os principais elementos que compõem a estrutura da linguagem como: operadores, expressões, atributos, tipos da linguagem, declaração de entidades e arquiteturas, expressões concorrentes, expressões seqüenciais, processos, comando seqüenciais e outros.
2.1 Estrutura Interna de um FPGA Como ponto de partida para este capítulo, faz-se necessário apresentar a estrutura interna de circuitos programáveis FPGAs, mostrando algumas arquiteturas desta tecnologia, bem como discutir os conceitos de reconfiguração e roteamento desses circuitos. Não é objetivo deste livro explorar em profundidade detalhes da tecnologia FPGA, mas apenas alguns conceitos básicos quse serão importantes para entender o projeto e desempenho dos algoritmos criptográficos implementados através desta tecnologia. A figura 2.1 apresenta quatro principais arquiteturas internas utilizadas em circuitos programáveis: matriz simétrica, sea-of-gates, row-based e PLD hierárquico. Já a figura 2.2 mostra que um FPGA (Field Programmable Gate Arrays) são circuitos programáveis compostos de CLBs, switch boxes, IOBs e canais de roteamento.
35
Figura 2.1 – Arquiteturas interna de circuitos programáveis FPGA.
A arquitetura sea-of-gates é um circuito composto por transistores ou blocos lógicos de baixa complexidade. A vantagem dessa arquitetura é a grande disponibilidade de portas lógicas por área. Porém, como não há uma área dedicada para o roteamento, é necessário que o mesmo seja feito sobre as células, muitas vezes inutilizando áreas disponíveis para implementação de uma determinada lógica. Nos circuitos de arquitetura row-based os blocos lógicos estão dispostos horizontalmente. Existe uma área dedicada de roteamento localizada entre as linhas de blocos lógicos. As arquiteturas row-based e sea-of-gates originaram-se das metodologias de projeto de ASICs, standard-cells e gate-array. A arquitetura tipo PLD hierárquico é constituído por uma matriz de blocos lógicos, denominados logic arrays blocks, sendo interligados através do recurso de roteamento conhecido como matriz programável de interconexão (PIA). Esse tipo de dispositivo é dito hierárquico, porque os blocos lógicos podem ser agrupados entre si. A arquitetura tipo matriz simétrica é flexível no roteamento, pois possui canais verticais e horizontais.
36
Figura 2.2 – Dispositivos internos de um FPGA.
Já a figura 2.2 mostra que um FPGA (Field Programmable Gate Arrays) são circuitos programáveis compostos de CLBs, switch boxes, IOBs e canais de roteamento.
2.2 Roteamento e Configuração de um FPGA Nesta seção são discutidos conceitos básicos de roteamento e reconfiguração de circuitos programáveis e reconfiguráveis FPGAs. O roteamento é a interconexão entre blocos lógicos através de uma rede de camadas de metal. As conexões físicas entre os blocos lógicos são feitas com transistores controlados por bits de memória (PIP) ou por chaves de interconexão (switch matrix). Eis alguns elementos básicos utilizados na malha de roteamento da família XC4000 da Xilinx: Conexões globais: estas formam uma rede de interconexão em linhas e colunas ligadas através de chaves de interconexão. Esta rede circunda os blocos lógicos (CLBs) e os blocos de E/S (IOBs). Matriz de conexão (Switch Matrix): são chaves de interconexão que permitem o roteamento entre os blocos lógicos através das conexões globais. Conexões diretas: interligam CLBs vizinhos e permitem conectar blocos com menor atraso, pois não utilizam recursos globais de roteamento. Linhas longas: são conexões que atravessam todo o circuito sem passar pelas matrizes de conexão e são utilizadas para conectar sinais longos. A exigência de alto poder de processamento e o surgimento de novas aplicações, promovem uma constante busca por alternativas e arquiteturas que visem melhorar a performance dos computadores, especialmente em aplicações de tempo real. Uma destas alternativas é a reconfiguração.
37
Acoplando um dispositivo programável FPGA a um processador de propósito geral (GPP), torna-se possível a exploração eficiente do potencial das chamadas arquiteturas reconfiguráveis. Arquiteturas reconfiguráveis permitem ao projetista a criação de novas funções, e possibilita a execução de operações com um número consideravelmente menor de ciclos do que necessário em GPPs. Em uma arquitetura reconfigurável, são desnecessárias muitas das unidades funcionais complexas usualmente encontradas em processadores de propósito geral. Os métodos de reconfiguração de um dispositivo programável e reconfigurável podem ser classificados como: Reconfiguração total: é a forma de configuração, onde o dispositivo reconfigurável é inteiramente alterado. Também tratada apenas como configuração. Reconfiguração parcial: é a forma de configuração que permite que somente uma parte do dispositivo seja reconfigurada. A reconfiguração parcial pode ser: não-disruptiva, onde as partes do sistema que não estão sendo reconfiguradas permanecem completamente funcionais durante o ciclo de reconfiguração; ou disruptiva, onde a reconfiguração parcial afeta outras partes do sistema, necessitando de uma parada no funcionamento do mesmo. Reconfiguração dinâmica: também chamada de run-time reconfiguration (RTR), on-the-fly reconfiguration ou in-circuit reconfiguration. Todas essas expressões podem ser traduzidas também como reconfiguração em tempo de execução. Nesse tipo de reconfiguração não há necessidade de reiniciar o circuito ou remover elementos reconfiguráveis para programação. Reconfiguração extrínseca: reconfigura parcialmente o sistema, mas somente considerando cada FPGA que o compõe como unidade atômica de reconfiguração. Reconfiguração intrínseca: reconfigura parcialmente cada FPGA que compõe o sistema. A partir desta seção apresentam-se conceitos básicos da linguagem VHDL utilizados nas implementações dos circuitos digitais básicos descritos no capítulo 3, os quais serão úteis para entender o projeto em hardware dos algoritmos criptográficos focados neste livro.
2.3 VHDL - Descrição Estrutural e Comportamental Na linguagem VHDL (VHSIC Hardware Description Language) existem duas formas para a descrição de circuitos digitais: a estrutural e a comportamental. A forma estrutural indica os diferentes componentes que constituem o circuito e suas respectivas interconexões. Desta maneira pode-se especificar um circuito e saber como é seu funcionamento. 38
A forma comportamental consiste em descrever o circuito pensando no seu comportamento e funcionamento e não na sua estrutura. Essa metodologia facilita a descrição de circuitos onde a estrutura interna não está disponível, mas o seu funcionamento e comportamento podem ser interpretados. Assim, esse tipo de descrição vem se desenvolvendo a cada dia. A descrição comportamental pode-se dividir em duas metodologias, dependendo do nível de abstração: a descrição algorítmica e de fluxo de dados. Na descrição de um circuito utilizando a linguagem VHDL, é comum ter-se trechos implementados de maneira comportamental e estrutural, sendo de responsabilidade do projetista a utilização correta dos métodos de implementação de circuitos em VHDL.
2.4 Exemplo dos Estilos de Descrições em VHDL A figura 2.3 representa um comparador de 1 bit simplificado. Este será descrito nos dois estilos de descrição de circuitos digitais em VHDL, estrutural e comportamental. Onde U1, U2 são os componentes do circuito, L1 é uma linha de conexão entre os componentes, e E1, E2 e S são as portas de entrada e saída do circuito.
Figura 2.3 - Representação de um comparador de 1 bit
O funcionamento do comparador de 1 bit é simplificado, onde os valores lógicos da portas de entrada E1 e E2 serão comparados. Se E2 for menor que E1 a saída S recebe o valor lógico ‘1’, caso contrário, ‘0’. Este exemplo do comparador de 1 bit será utilizado para demostrar as formas de descrição de circuito digitais em VHDL nas seções 2.4.1, 2.4.2 e 2.4.3.
2.4.1 Descrição Algorítmica A descrição algorítmica é um conjunto de passos que descreve de forma comportamental o circuito digital projetado. Em primeiro lugar, deve-se descrever a entidade do circuito, onde são definidas as portas de entrada e saída. A entidade (entity) independente do método de descrição de circuitos digitais sempre se mantém a mesma. Já a arquitetura (architecture) é responsável pela descrição do circuito de maneira estrutural ou comportamental. Neste caso, o comparador de 1 bit (figura 2.3) é descrito na seqüência, de maneira comportamental, aplicando o princípio algorítmico. 39
Comparador de 1 Bit (Descrição Algorítmica) -- definição da entidade: portas de E/S entity comp is port (e1,e2: in bit; s: out bit); end comp;
-- definição da arquitetura: descrição da lógica interna do circuito architecture comp_alg of comp is begin process (e1,e2) begin if e2 < e1 then s := /= >= , s => s1); u2:inv PORT MAP (e=>, s => s1);
2.12 Pacotes em VHDL (Package) O pacote ou PACKAGE é uma coleção de tipos, constantes, subprogramas, etc. Esta é a maneira de agrupar elementos relacionados. Os pacotes estão divididos em duas partes, a declaração e corpo, onde o corpo contém definições de procedimentos e funções que podem ser omitidos, se não há nenhum desses elementos para declarar. A forma geral para a declaração de um pacote é: PACKAGE nome
IS
declarações END [PACKAGE PACKAGE] PACKAGE [nome];
PACKAGE BODY BODY nome IS declarações , subprogramas, etc. END [PACKAGE PACKAGE BODY] BODY [nome];
Uma vez declarado o pacote, os elementos podem ser referenciados através do nome do pacote. Pode-se referenciar apenas um elemento ou todos, bastando declarar no programa principal quais os elementos do pacote que estarão disponíveis. A seguir, um exemplo utilizando PACKAGE. PACKAGE cpu IS SUBTYPE byte IS bit_vector (7 DOWNTO 0); FUNCTION inc (valor: interger) RETURN interger; END cpu;
PACKAGE BODY cpu IS FUNCTION inc (valor: interger) RETURN interger IS VARIABLE result: integer; BEGIN Result
View more...
Comments