implementação da aplicabilidade de criptossistemas baseados em
Transcrição
implementação da aplicabilidade de criptossistemas baseados em
SOCIEDADE EDUCACIONAL DE SANTA CATARINA - SOCIESC INSTITUTO SUPERIOR TUPY - IST ROBSON THANAEL POFFO IMPLEMENTAÇÃO DA APLICABILIDADE DE CRIPTOSSISTEMAS BASEADOS EM IDENTIDADE Joinville 2006 ROBSON THANAEL POFFO IMPLEMENTAÇÃO DA APLICABILIDADE DE CRIPTOSSISTEMAS BASEADOS EM IDENTIDADE Esse trabalho será apresentado ao Instituto Superior Tupy como requisito parcial para a obtenção de grau de bacharel em Sistemas de Informação, sob orientação do Professor MSc. Mehran Misaghi. Joinville 2006 POFFO, ROBSON THANAEL. IMPLEMENTAÇÃO DA APLICABILIDADE DE CRIPTOSSISTEMAS BASEADOS EM IDENTIDADE. Joinville: SOCIESC, 2006. ROBSON THANAEL POFFO IMPLEMENTAÇÃO DA APLICABILIDADE DE CRIPTOSSISTEMAS BASEADOS EM IDENTIDADE Esse trabalho foi julgado e aprovado em sua forma final pela banca examinadora abaixo assinada. Joinville, 05 de dezembro de 2006 Prof. MSc. Mehran Misaghi Prof. MSc. Fernando Cézar de Oliveira Lopes MSc. Glauco Vinicius Scheffel (Datasul) Aos meus pais Hélio José Poffo e Evaldina Maria Poffo, meu irmão Hélio José Poffo Jr. e minha namorada Suzana Regina Vailatti. AGRADECIMENTOS A Deus que possibilitou que este trabalho fosse finalizado; A minha família que abriram mão de seu tempo comigo para a elaboração deste trabalho; A minha namorada Suzana que soube compreender minha ausência no período de elaboração deste trabalho e que me ajudou na revisão deste trabalho; Ao professor Mehran pela sua dedicação e apoio na elaboração deste trabalho; Ao professor Sandro pelas diversas revisões deste trabalho; A todos que não foram mencionados, mas que, direta ou indiretamente, ajudaram para a finalização deste trabalho. Eu fiz essa carta maior que o normal, somente porque não tive tempo de fazê-la mais curta. Blaise Pascal Computadores não resolvem problemas, eles executam soluções. Laurent Gasser RESUMO Com o avanço da tecnologia e a popularização da Internet, a privacidade está cada vez mais exposta ao mundo virtual. Juntamente com essa exposição, muitos sofrem diariamente agressões no que se diz respeito à sua privacidade, onde se tem constantemente conversas interceptadas e muitas vezes auditadas por instituições. Este trabalho tem como objetivo fazer um estudo de sistemas criptográficos baseados em identidade (IBE), mostrando suas principais cacraterísticas e aplicabilidades, apresentando ao final, o desenvolvimento de duas aplicações IBE com finalidade acadêmica, mas que podem ser utilizadas como exemplo de aplicabilidades de ferramentas IBE. A primeira aplicação desenvolvida utiliza conceitos de IBE para demonstrar uma conversa on-line onde alguns usuários comunicam-se utilizando os conceito de disponibilidade temporal, isso quer dizer, as mensagens somente poderão ser visualizadas de forma correta dependendo da disponibilidade aplicada pelo emissor da mensagem. A segunda aplicação desenvolvida utiliza conceitos de IBE para elaboração de uma aplicação que efetua buscas em um banco de dados cifrados, resolvendo o problema de fragilidade existente nos banco de dados cifrados atualmente. Palavras-chave: Busca Cifrada. Disponibilidade Temporal. Criptossistemas Baseados em Identidade. ABSTRACT With the advance of technology and the popularization of Internet the privacy is more displayed to the virtual world. Together with this display many suffer daily aggressions referring about privacy, where we have constantly speaking intercepted and many times checked for institutions. This work has as objective to make a study of cryptographic systems based in identity (IBE), showing to its main characteristics and applicabilities, presenting to the end the development of two applications IBE with academic purpose but that they can be used as example of applicabilities of tools IBE. The first developed application uses IBE concepts to demonstrate to an on-line conversation where some users communicate using the concept of secular availability, this wants to say, the messages could only be visualized with correct form depending on the availability applied for the sender of the message. The second developed application uses concepts of IBE for elaboration of an application that effects searches in a ciphered data base, solving the problem of existing fragility in the ciphered data base currently. Keywords: Searchable Encrypted. Temporary Availability. Identity Based Encryption. LISTA DE ILUSTRAÇÕES Figura 1 - Estrutura da Criptografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Figura 2 - Exemplo de criptografia simétrica Figura 3 - Exemplo de criptografia assimétrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Figura 4 - Taxa de criptografia do servidor sem autenticação RSA1024 e ECC163 . . . . 34 Figura 5 - Latência criptográfica do Handshake sem autenticação RSA1024 e ECC163 35 Figura 6 - Latência criptográfica do Handshake com autenticação RSA1024 e ECC163 36 Figura 7 - Taxa de criptografia do servidor com autenticação RSA1024 e ECC163 . . . . 36 Figura 8 - Latência criptográfica do Handshake sem autenticação RSA2048 e ECC193 Figura 9 - Taxa de criptografia do servidor sem autenticação RSA2048 e ECC193 36 . . . . 37 Figura 10 - Latência criptográfica do Handshake com autenticação RSA2048 e ECC193 Figura 11 - Taxa de criptografia do servidor com autenticação RSA2048 e ECC193 37 . . . . 38 Figura 12 - Criptografia baseada em identidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Figura 13 - Assinatura baseada em identidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Figura 14 - Funcionamento do Secure-mail do Voltage, primeira utilização . . . . . . . . . . . . . 52 Figura 15 - Funcionamento do Secure-mail do Voltage, segunda utilização . . . . . . . . . . . . 53 Figura 16 - Implementação Boneh Franklin - Variáveis disponíveis . . . . . . . . . . . . . . . . . . . . . 54 Figura 17 - Implementação Boneh Franklin - Servidor PKG . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Figura 18 - Implementação Boneh Franklin - Tela Principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Figura 19 - Implementação Boneh Franklin - Configuração servidor PKG e configuração da Identidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Figura 20 - Implementação Boneh Franklin - Mensagem recebida . . . . . . . . . . . . . . . . . . . . . 56 Figura 21 - Implementação Boneh Franklin - Mensagem recebida cifrada e decifrada Figura 22 - Implementação Boneh Franklin - Tela de Log . . 57 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Figura 23- Implementação Boneh Franklin - Mensagem com disponibilidade temporal vencida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Figura 24 - Esquema de busca de palavra em banco de dados cifrados . . . . . . . . . . . . . . . . 65 Figura 25 - Eclipse 3.2.0 M20060629-1905 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Figura 26 - Diagrama do esquema Boneh Franklin com disponibilidade . . . . . . . . . . . . . . . . 72 Figura 27 - Implementação de busca de palavra em banco de dados cifrados - Modelo de entidades e relacionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Figura 28 - Implementação de busca de palavra em banco de dados cifrados - Tela principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Figura 29 - Implementação de busca de palavra em banco de dados cifrados - Tela de inserção de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Figura 30 - Implementação de busca de palavra em banco de dados cifrados - Diagrama de seqüência - Operação inserir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Figura 31 - Implementação de busca de palavra em banco de dados cifrados - Diagrama de seqüência - Operação buscar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Figura 32- Implementação de busca de palavra em banco de dados cifrados - Busca diretamente na base de dados - Tabela de Keyword . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Figura 33- Implementação de busca de palavra em banco de dados cifrados - Busca diretamente na base de dados - Tabela de Record . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Figura 34 - Implementação de busca de palavra em banco de dados cifrados - Lista de tarefas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Figura 35 - Implementação de busca de palavra em banco de dados cifrados - Resultado busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 LISTA DE TABELAS Tabela 1 - Comparação de esquemas criptográficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Tabela 2 - Tamanho das chaves computacionalmente equivalentes Tabela 3 - Teste de Desempenho RSA x ECC . . . . . . . . . . . . . . . . . . . . 32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Tabela 4 - Teste de Desempenho entre RSA x ECDSA x ECDH . . . . . . . . . . . . . . . . . . . . . . . 34 Tabela 5 - Comparação entre esquemas IBE utilizando tecnologias aplicadas Tabela 6 - Operações IBE por ordem de custo computacional . . . . . . . . . 49 . . . . . . . . . . . . . . . . . . . . . . . . . 49 Tabela 7 - Operações utilizadas no processo de cifragem dos esquemas IBE Tabela 8 - Operações utilizadas no processo de decifragem dos esquemas IBE . . . . . . . . . . 49 . . . . . . . 50 Sumário 1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2 FUNDAMENTOS DE CRIPTOGRAFIA . . . . . . . . . . . . . . . . . . . . . . . . . 19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.2 CRIPTOGRAFIA SIMÉTRICA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2.1 Algoritmos simétricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2.1.1 Data Encryption Standard (DES) . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2.1.2 Triple DES 22 2.1 DEFINIÇÕES PRELIMINARES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1.3 International Data Encryption Algorithm (IDEA) . . . . . . . . . . . . . . . . 22 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2.1.5 Rivest Cipher (RC6) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.2.1.6 AES - Advanced Encryption Standard . . . . . . . . . . . . . . . . . . . . . . 23 2.2.2 Utilização de algoritmos simétricos na atualidade . . . . . . . . . . . . . . . . . . 23 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.2.1.4 Blowfish 2.3 CRIPTOGRAFIA ASSIMÉTRIA 2.3.1 Algoritmos assimétricos 2.3.1.1 Rivest, Shamir and Adleman (RSA) 2.3.1.2 ElGamal . . . . . . . . . . . . . . . . . . . . . . . 25 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.3.1.3 Diffie-Hellman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.3.2 Utilização de algoritmos assimétricos na atualidade . . . . . . . . . . . . . . . . . 26 3 FUNDAMENTOS DE CURVAS ELÍPTICAS . . . . . . . . . . . . . . . . . . . . . . . 27 3.1 DEFINIÇÕES PRELIMINARES . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.1.2 Anel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.1.3 Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.1.5 Grupo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.1.1 Inteiros 3.1.4 Corpos Finitos 3.2 UTILIZAÇÃO DE CURVAS ELÍPTICAS NA ATUALIDADE . . . . . . . . . . . . . . . 29 4 DIFERENÇAS ENTRE RSA E ECC . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 5 CRIPTOSSISTEMAS BASEADO EM IDENTIDADES - IBE . . . . . . . . . . . . . . . 39 5.1 CRIPTOGRAFIA BASEADA EM IDENTIDADE - IBC . . . . . . . . . . . . . . . . . 39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 5.2 ASSINATURA BASEADA EM IDENTIDADE - IBS . . . . . . . . . . . . . . . . . . . 40 5.2.1 Um modelo genérico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 6 ESQUEMAS IBE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 6.1 MODELOS CRIPTOGRÁFICOS IBE . . . . . . . . . . . . . . . . . . . . . . . . . 43 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 6.1.2 Modelo de Cocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 6.1.3 Modelo de Waters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 6.1.4 Modelo de Naccache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 6.2 TABELA COMPARATIVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.3 CARACTERÍSTICAS POSITIVAS E NEGATIVAS . . . . . . . . . . . . . . . . . . . 50 6.4 PLATAFORMA VOLTAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 6.5 IMPLEMENTAÇÃO BONEH FRANKLIN COM DISPONIBILIDADE TEMPORAL . . . 53 7 BUSCA EM BANCO DE DADOS CIFRADOS . . . . . . . . . . . . . . . . . . . . . . 60 7.1 CARACTERÍSTICAS DO LOG DE AUDITORIA SEGURO . . . . . . . . . . . . . . 63 7.2 RESISTENTE A ENGANOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 7.3 VERIFICABILIDADE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 7.4 CONTROLE DE ACESSO AOS DADOS E BUSCA . . . . . . . . . . . . . . . . . . 64 7.5 NOTAÇÕES E COMPONENTES DO LOG AUDITOR . . . . . . . . . . . . . . . . . 64 7.5.1 Extração de palavras-chave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 7.6 ESQUEMA POR CHAVE ASSIMÉTRICA . . . . . . . . . . . . . . . . . . . . . . . 65 8 IMPLEMENTAÇÃO BUSCA EM BANCO CIFRADO 67 5.1.1 Um modelo genérico 6.1.1 Modelo de Boneh e Franklin . . . . . . . . . . . . . . . . . . 8.1 LINGUAGEM, AMBIENTE E FERRAMENTAS DISPONÍVEIS PARA CURVAS ELÍPTICAS E IBE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 8.1.1 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 8.1.2 Arquitetura de Criptografia Java (Java Cryptography Architecture - JCA) . . . . . . 69 8.1.3 API de persistência em Java (Java Persistence API - JPA) . . . . . . . . . . . . . . 69 8.1.4 Invocação de métodos remotos (Remote Method Invocation - RMI) . . . . . . . . . 69 8.1.5 Prevayler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 8.2 PRÉ-REQUISITOS PARA O DESENVOLVIMENTO . . . . . . . . . . . . . . . . . . 71 8.1.6 Eclipse 8.3 IMPLEMENTAÇÃO DE DISPONIBILIDADE TEMPORAL NO ESQUEMA DE BONEH FRAKLIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 8.3.1 Dificuldades Encontradas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 8.4 IMPLEMENTAÇÃO DA BUSCA DE PALAVRA EM BANCO DE DADOS CIFRADOS . 73 8.4.1 Dificuldades Encontradas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 9 CONCLUSÕES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 ANEXOS 87 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1 INTRODUÇÃO Mais do que nunca, hoje em dia, tem-se a necessidade de privacidade, em que se espera estar conversando com colegas em um bate-papo e que somente eles estejam participando da conversa. Quanto mais próximo do mundo digital mais frágil fica a privacidade, onde vive-se em um mundo sem fronteiras e quem mais sabe pode invadir a privacidade alheia. Tendo em vista essas situações, os estudos da criptografia avançam. Cada vez mais sente-se a necessidade de esconder informações, seja para a segurança das informações, ou seja para se ter privacidade em bate-papos intimos com colegas ou parceiros. Em 1984, Shamir introduziu o conceito de criptossistemas baseados em identidade. A idéia deste novo conceito era a utilização de uma informação conhecida por todos como sendo a chave pública da criptografia. Até este momento, a chave pública era sempre armazenada num servidor e para a utilização destas chaves era necessário uma prévia geração das mesmas. Com o novo conceito adotado por Shamir, pode-se estar em um bate-papo com diversas pessoas, desde que tenha uma identidade utilizada pelo destinatário, em que esta identidade normalmente é o endereço de IP, e-mail ou alguma outra informação única que o identifique. Com este novo conceito de Shamir novos estudos foram feitos, em que puderam evoluir as implementações de banco de dados criptografados, e aplicar propostas de correções de problemas já conhecidos, como a fragilidade no processo de busca em banco de dados cifrados até então conhecidos. Este trabalho tem como delimitação implementar aplicabilidade de disponibilidade temporal, utilizando o esquema criptográfico baseado em identidade proposto por Boneh Franklin e implementar aplicabilidade de busca de palavra em banco de dados cifrados, conforme proposto por Waters. Apresentando o seguinte problema que após Boneh Franklin ter proposto o modelo de criptografia por identidade e Waters ter proposto a busca de palavra em banco de dados cifrados não teve nenhuma implementação de aplicabilidade, sendo assim difícil o entendimento do funcionamento de ambas propostas. A hipotese é que se não tiver uma implementação dos modelos propostos, fica difícil medir a eficiência e visualizar de fato as aplicabilidades. Estudar os sistemas criptográficos baseado em identidade através teoria é uma forma de alcançar o objetivo de implementação do esquema de Boneh Franklin, utilizando disponibilidade temporal e a 17 implementação da busca de palavra em banco de dados cifrados, proposto por Waters. Como objetivos específicos, têm-se: I. Compreender os conceitos referente criptografia simétrica e assimétrica; II. Compreender os modelos propostos por Boneh Franklin referente o esquema criptográfico baseado em identidade; III. Compreender o modelo proposto por Waters referente a busca de palavra em banco de dados cifrados; IV. Compreender propostas existentes referente à pesquisa de palavra-chave em banco de dados cifrados; V. Implementar a disponibilidade temporal; VI. Implementar busca de palavra em banco de dados cifrados. Após o artigo do Boneh Franklin referente à disponibilidade temporal e do artigo do Waters referente à busca de palavra em banco de dados cifrados não teve-se nenhuma mostra de aplicabilidade, sendo assim difícil o entendimento do funcionamento de ambas propostas. Este trabalho está dividido em capítulos. O capítulo 2 detalha os conceitos de criptografia, sua história e seus principais componentes. Também detalha a infra-estrutura de chaves públicas e privadas. O capítulo 3 detalha os principais conceitos relacionados com curvas elípticas e aponta a utilização de curvas elípticas na atualidade. O capítulo 4 apresenta as principais diferenças entre RSA e ECC. Detalhando por testes pesquisados por referências quais os principais pontos de cada esquema criptográfico. O capítulo 5 apresenta o conceito completo de sistemas criptográficos baseados em identidade, suas vantagens, e as definições padrões dos modelos conceituais. O capítulo 6 apresenta todos os esquemas criptográficos baseados em identidade, uma comparação performática entre eles e algumas aplicações, é demonstrado a utilização de uma das aplicações desenvolvidas neste trabalho. O capítulo 7 apresenta os conceitos relacionados a busca em banco de dados cifrados, mostrando a teoria de todo o mecanismo para a implementação de um programa baseado em busca de palavras em banco de dados cifrados. 18 O capítulo 8 apresenta, por completo, a implementação proposta neste trabalho, levantando detalhadamente o processo de execução das ferramentas e aponta as principais dificuldades na implementação dos programas. 19 2 FUNDAMENTOS DE CRIPTOGRAFIA Neste capítulo, serão vistos todos os conceitos básicos relacionados à criptografia, suas divisões e seus principais esquemas. 2.1 DEFINIÇÕES PRELIMINARES Criptografia vem do grego, kryptos, que significa oculto, envolto, escondido, secreto e graphos, significa escrever, grifar. Portanto, criptografia significa escrita secreta ou escrita oculta, em que o processo para se chegar nesse resultado são diversos e até hoje em dia desenvolve-se estudos e pesquisas para aprimorar e garantir esse resultado (TKOTZ, 2003). Numa vila egípcia perto do rio Nilo chamada de Menet Khufu, tinha um arquiteto do faraó chamado Khnumhotep II. Ele construiu alguns monumentos para o faraó, os quais foram documentados. Essa documentação foi feita em tabletes de argila. Para evitar o entendimento, caso caíssem em domínio público, Khnumhotep II teve a idéia de substituir algumas palavras em trechos de texto destes tabletes (TKOTZ, 2004). Caso alguém roubasse, não chegaria até o tesouro e acabaria morrendo, Kahn considera isso como o primeiro exemplo documentado da escrita criptográfica (KAHN, 1967). Desde a época dos egípcios já existiam traços da presença da criptografia, isto é perceptível visualizando a escrita hieroglífica dos egípcios e os códigos secretos que os romanos utilizavam para comunicar os planos de guerra. Desde aquela época até o final da Segunda Guerra Mundial não houve muita evolução na criptografia, onde a mesma teve uma grande evolução com a chegada dos computadores, o que possibilitou a utilização de problemas matemáticos mais complexos a fim de dificultar a descoberta de códigos cifrados. Os esforços dos ingleses, durante a Segunda Guerra Mundial, para decifração de códigos criptográficos formou a base para a computação moderna (ABSOLUTA, 1999). A criptografia tem quatro objetivos principais, são eles (HANKERSON; MENEZES; VANSTONE, 2003): I. Confidencialidade: somente o destinatário autorizado da mensagem pode ser capaz de decifrar a mensagem cifrada; II. Integridade: o destinatário será capaz de determinar se a mensagem foi alterada durante a transmissão da mesma; 20 III. Autenticidade do remetente: O destinatário deverá ser capaz de identificar o remetente e verificar que foi realmente ele quem enviou a mensagem; IV. Autenticidade de entidades: Verificar a autenticidade da identidade de uma entidade; V. Não repúdio do remetente: não poderá ser possível ao remetente negar o envio da mensagem. A Figura 1 mostra como a criptologia está dividida até chegarmos a área de criptografia. Figura 1: Estrutura da criptografia. Fonte: O Autor. (adaptado de Kahn (KAHN, 1967)) A criptografia se divide em duas, podendo ser criptografia de chave simétrica (chave secreta) e criptografia de chave assimétrica (chave pública), segue um breve conceito de criptografia simétrica e criptografia assimétrica. 2.2 CRIPTOGRAFIA SIMÉTRICA Este método é conhecido como criptografia de chave secreta, pois possui somente uma chave compartilhada entre os dois lados, que é utilizada tanto para cifrar quanto para decifrar um texto. 21 Antigamente a segurança do processo de cifração estava baseada somente no sigilo do algoritmo criptográfico. Caso uma terceira pessoa tivesse acesso ao código criptográfico sem possuir a chave, o mesmo poderia decifrar a mensagem da mesma forma se estivesse em poder da chave utilizada. Para contornar esse problema utiliza-se uma chave para a criptografia, sendo esta chave uma cadeia aleatória de bits utilizada em conjunto com um algoritmo criptográfico. Cada chave distinta faz com que o algoritmo criptográfico trabalhe de forma diferente, gerando um resultado diferente da mensagem criptografada (STALLINGS, 2005, p.22). A principal característica da criptografia simétrica é a necessidade de um canal seguro para a transmissão da chave que será utilizada durante a comunicação. Esse tipo de criptografia é utilizado quando é necessário velocidade (BENITS, 2003, p. 13). Inicialmente, é utilizado a criptografia assimétrica para estabelecer a comunicação e garantir assim a autenticidade, após, é usado a criptografia simétrica para a troca de dados. As chaves são armazenadas em um local que se entende por local seguro para ambos os lados da comunicação. Uma característica negativa da utilização da criptografia simétrica é que o número de chaves cresce proporcionalmente ao quadrado do número de usuários, tendo em vista que para cada par de usuários será necessária uma chave para ambos se comunicarem (BENITS, 2003, p. 14). Figura 2: Exemplo de criptografia simétrica. Fonte: O Autor. (adaptado de Stallings (STALLINGS, 2005, p.22)) Conforme demonstra na Figura 2, para Alice conversar normalmente com Bob, ela deverá solicitar a chave privada de Bob. Isso deverá acontecer através de um canal seguro . Após Alice obter a chave privada de Bob, ela deverá utilizá-la para enviar todas as próximas mensagens, podendo, agora, a comunicação acontecer em um ambiente hostil, pois a mensagem somente poderá ser entendida por quem possuir a chave privada de Bob. Da mesma forma, 22 Bob deverá receber a chave pública de Alice para poder manter comunicação e entender as mensagens recebidas de Alice. 2.2.1 Algoritmos simétricos A seguir, lista-se os principais algoritmos criptográficos simétricos. 2.2.1.1 Data Encryption Standard (DES) Data Encryption Standard (DES) foi criado pela IBM em 1977. O tamanho de sua chave de 56 bits é considerado fraco e já foi quebrado por força bruta em 1997 (MAIA; PAGLIUSI, 1999). 2.2.1.2 Triple DES O 3DES é uma simples variação do DES, onde utiliza-se três ciframentos consecutivos, podendo empregar uma versão com duas ou três chaves diferentes. É seguro, porém muito lento. O tamanho da chave criptográfica pode variar de 112 bits ou de 168 bits (MAIA; PAGLIUSI, 1999). 2.2.1.3 International Data Encryption Algorithm (IDEA) O International Data Encryption Algorithm (IDEA) foi criado em 1991 por James Massey e Xuejia Lai. O algoritmo é patenteado na Suíça. É baseado nas mesmas linhas gerais do DES, porém, sua implementação pode ser mais rápida. O IDEA é utilizado principalmente no Pretty Good Privacy (PGP), ou Muito Boa Privacidade, o programa para criptografia de e-mail pessoal mais difundido no mundo. O tamanho da chave criptográfica é de 128 bits (MAIA; PAGLIUSI, 1999). 2.2.1.4 Blowfish Algoritmo desenvolvido por Bruce Schneier, que oferece escolha entre maior segurança ou maior desempenho, estes podendo variar de acordo com o tamanho da chave utilizada que pode ser de 23 bits ou 448 bits. O autor melhorou o Twofish gerando o Blowfish (MAIA; PAGLIUSI, 1999). 23 2.2.1.5 Rivest Cipher (RC6) Rivest Cipher 6 (RC6) é um cifrador derivado do RC5. Ele foi desenvolvido por Ron Rivest, Matt Robshaw, Ray Sidney e Yiqun Lisa Yin para se adequar aos requerimentos da competição Advanced Encryption Satndard (AES). O algoritmo é proprietário da RSA Security. Pode trabalhar com chaves de 128, 192 e 256 bits, como o RC5, pode ser parametrizável o tamanho da chave. (RIVEST et al., 2004) 2.2.1.6 AES - Advanced Encryption Standard Advanced Encryption Standard ou Padrão de Criptografia avançado, é o mais novo pro- tocolo de criptografia e será em breve o protocolo padrão de criptografia dos Estados Unidos. O tamanho das chaves criptográficas pode variar entre 128, 192 e 256 (FORD, 2000). Assumindo que um computador possa realizar o teste de 255 chaves por segundo, atualmente levaria 149 trilhões de anos para conseguir quebrar sua chave de 128 bits. Levando para outra perspectiva, o universo tem pouco menos de 20 bilhões de anos (FORD, 2000). 2.2.2 Utilização de algoritmos simétricos na atualidade I. Soekris Engineering: Hardware acelerador de criptografia, utiliza criptografia simétrica (como por exemplo: DES, 3DES e RC4) e criptografia assimétrica (como por exemplo: RSA e Diffie-Hellman) (SOEKRIS, 2006). II. OpenBSD: Sistema operacional livre, multi-plataforma do tipo UNIX. Utiliza criptografia simétrica como por exemplo: DES, 3DES, Blowfish e Cast (OPENBSD, 2006). 2.3 CRIPTOGRAFIA ASSIMÉTRIA A criptografia assimétrica foi inicialmente proposta no artigo de Diffie e Hellman (DIFFIE; HELLMAN, 1976). Neste artigo os autores propuseram uma prática de criptografia assimétrica onde cada participante deverá possuir um par de chaves, sendo uma delas conhecida como chave pública e a outra como chave privada (BENITS, 2003). A criptografia assimétrica é conhecida por criptografia de chave pública, pois cada participante possui duas chaves, uma delas sendo a chave pública e a outra a chave privada. A chave pública é distribuída livremente para todos os participantes e é utilizada para cifrar os dados. A chave privada é utilizada pelo receptor para decifrar a mensagem anteriormente cifrada. 24 As chaves públicas são armazenadas num repositório de chaves públicas, que tem de ser um local seguro para todos os envolvidos na comunicação. As mensagens cifradas com a chave pública podem ser decifradas somente pela chave privada. Figura 3: Exemplo de criptografia assimétrica. Fonte: O Autor. (adaptado de Stallings (STALLINGS, 2005, p.23)) Na Figura 3, para Alice enviar uma mensagem para Bob, Alice primeiramente deverá solicitar a chave pública de Bob e salvar a chave pública dela em seu anel de chaves públicas para posterior utilização. Após estar em posse da chave pública de Bob, Alice deverá cifrar a mensagem com esta chave pública e após isto, enviar a mensagem criptografada para Bob. Para Bob entender a mensagem que está recebendo, ele deverá pegar a mensagem e decifrála utilizando sua chave privada. Para Bob responder a mensagem de Alice, primeiramente ele deverá solicitar a chave pública de Alice e salvar no seu anel de chaves públicas, após isso deverá utilizar a chave pública de Alice para cifrar as mensagens que serão enviadas. 2.3.1 Algoritmos assimétricos A seguir, lista-se os principais algoritmos criptográficos assimétricos. 25 2.3.1.1 Rivest, Shamir and Adleman (RSA) RSA possui esse nome por causa dos seus inventores Rivest, Shamir and Adleman, que o criaram em 1978, em Massachussets Institute of Technology (M.I.T), logo após a descoberta da criptografia assimétrica (chave pública) em 1977 (HANKERSON; MENEZES; VANSTONE, 2003). Segundo Coutinho (COUTINHO, 2000), "para poder implementar o RSA precisamos de dois parâmetros básicos: dois números primos que vamos chamar de p e q. Para codificar uma mensagem usando o RSA é suficiente conhecer o produto dos dois números primos, que vamos chamar de n. Para decodificar uma mensagem precisamos conhecer os números primos p e q. A chave de codificação do RSA é portando, constituída essencialmente pelo número n = p.q. Cada usuário do método tem sua própria chave de codificação. Esta chave é tornada pública: todos ficam sabendo que, para mandar uma mensagem para o banco Acme, deve ser usada a chave n. Por isso n também é conhecido como a chave pública. Já a chave de decodificação é constituída pelos números primos p e q. Cada usuário tem que manter sua chave de decodificação secreta ou a segurança do método estará comprometida". Conforme Coutinho mencionou, a criptografia RSA utiliza números primos e fatoração para funcionar, por isso caso sejam escolhidos números primos muito pequenos ou a diferença entre eles seja pequena, ficará fácil fatorar n e a segurança do método estará comprometida. A seguir, encontra-se um resumo dos itens necessários para a criptografia RSA (COUTINHO, 2000, p. 181): I. para implementar o RSA deverá ser escolhido dois números primos muitos grandes p e q; II. para codificar uma mensagem usa-se n = p.q; III. para decodificar precisa-se conhecer p e q; IV. a segurança do método vem do fato de que é difícil fatorar n para descobrir p e q, já que são números muito grandes. 2.3.1.2 ElGamal O algoritmo de ElGamal pode ser usado tanto na assinatura digital como na criptografia de mensagens. Sua segurança está associada a dificuldade em calcular o logaritmo discreto. Para a geração da chave, escolhe-se um número primo qualquer e dois números randômicos, menos que o número primo (LOPES, 2003). 26 2.3.1.3 Diffie-Hellman Também utiliza o problema do logaritmo discreto. É o criptossistema mais antigo ainda em uso (MAIA; PAGLIUSI, 1999). 2.3.2 Utilização de algoritmos assimétricos na atualidade I. Soekris Engineering: Hardware acelerador de criptografia, utiliza criptografia simétrica (como por exemplo: DES, 3DES e RC4) e criptografia assimétrica (como por exemplo: RSA e Diffie-Hellman) (SOEKRIS, 2006). II. SSL: Conhecido como Secure Sockets Layer (SSL) foi desenvolvido pela Netscape Communications, utiliza a autenticação RSA e a autenticação e criptografia DES, além de fazer uma verificação de integridade utilizando o Message Digest algorithm 5 (MD5) (INFORMÁTICA, 2006). III. Secure Shell (SSH): Utiliza chaves assimétricas RSA, quando um computador cliente solicita ao servidor uma conexão, ambos os computadores (cliente e servidor) trocam suas chaves públicas para poderem se comunicar (MORIMOTO, 2006). IV. A Perkons CryptoLib é um software baseado na biblioteca de algoritmos criptográficos como Advanced Encryption Standard (AES) ou Padrão de criptografia avançada, Secure Hash Algorithm (SHA-1) ou Algoritmo de Hash Seguro) e RSA, para todos os produtos da Perkons S/A. Perkons S/A é uma empresa que produz aparelhos que medem e classificam a velocidade de veículos em sinaleiros com câmeras, aparelhos para monitoração pública e equipamentos para reconhecimento de caracteres ópticos, o qual fornece essas imagens e dados num ambiente seguro para ser usado pela agência do governo para aplicação no trânsito, conforme Nist (NIST, 2006). 27 3 FUNDAMENTOS DE CURVAS ELÍPTICAS O método de criptografia por curvas elípticas foi proposto em 1985 por Neal Koblitz e Victor Miller, que defendem que a criptografia por curvas elípticas pode ser mais rápida que a criptografia RSA e utilizar chaves menores, além de ser mais seguro (HANKERSON; MENEZES; VANSTONE, 2003, 2, 15). Existem várias formas de utilizar curvas elípticas em criptografia, todos os esquemas baseiam-se na complexibilidade na resolução de equações matemáticas, utilizando o logaritmo discreto numa curva elíptica sobre alguns grupos finitos. Curvas elípticas estão sendo estudadas e pesquisadas por matemáticos a mais de cem anos (KOBLITZ; MENEZES, 2005). Em 1985, Neal Koblitz e Victor Miller independentemente propuseran a utilização de curvas elípticas para a obtenção da chave pública em sistemas criptográficos. Desde então, vários artigos a respeito das curvas elípticas foram publicados, sendo que mais tarde, em 1990, as curvas elípticas receberam o aceite comercial, onde organizações de padrões estabeleceram protocolos de curvas elípticas e empresas privadas colocaram estes protocolos em seus produtos de segurança. Curvas elípticas não são elipses, elas têm esse nome por que as equações utilizadas são semelhantes as de circunferência de uma elipse (STALLINGS, 2005). A seguir, são apresentados os principais conceitos utilizados na criptografia por curvas elípticas: 3.1 DEFINIÇÕES PRELIMINARES Para fazer um sistema criptográfico usando curvas elípticas, é preciso um problema matematicamente difícil correspondente para fatorar o produto de dois números primos ou utilizar logaritmo discreto. Considerando a equação Q = kp , onde Q, p ∈ E p (a, b) e k < p , é relativamente fácil de calcular Q , dado k e p , mas é relativamente difícil calcular k dado Q e P (STALLINGS, 2005, p.197). Criptografia de curvas elípticas, como todos os outros esquemas criptográficos, baseiase no fato da dificuldade de resolver um problema matemático. Porém, a criptografia de curvas elípticas parte de problemas envolvendo os logaritmos discretos. 28 Dada uma curva elíptica E definida por um conjunto finito de natureza Fq (q , é o número de elementos do conjunto), −E(Fq ) - e os pontos P, Q ∈ E(Fq ) , determinar o inteiro l(0 <= l <= q − 1) tal que Q = lP . Ao passo que é relativamente fácil determinar o ponto Q = lP , determinar l , dado Q, P ∈ E(Fq ) é mais difícil (BARBOSA, 2003). 3.1.1 Inteiros Um grupo de todos os inteiros é denominado por Z . N é denominado um grupo de todos os inteiros positivos. Para um grupo finito A , o número de elementos de A é denominado por #A (SAEKI, 1997). 3.1.2 Anel Se puder definir uma ou mais operações num grupo abeliano, tem-se um anel. Fornecendo os elementos de um grupo que satisfaça algumas propriedades considerando também a nova operação(KAK, 2006). Este grupo, justamente parte da operação definida para o grupo abeliano, referencia uma nova operação, como por exemplo, multiplicação (KAK, 2006). Um anel é tipicamente denotado por R, +, X , onde R denota o grupo de objetos, + denota o operador relacionado com R o qual é um grupo abeliano, o X é o operador adicional preciso para R formar um anel (KAK, 2006). 3.1.3 Mapeamento Dado as operações binárias X e Y nos grupos A e B respectivamente, o mapeamento f : A −→ B preserva a operação de A se todos a, b ∈ A nós temos (SAEKI, 1997): f (aXb) = f (a)Y f (b) 3.1.4 Corpos Finitos Corpos são uma abstração de números computacionais (como os números racionais Q , os números reais R e os números complexos C ), eles possuem propriedades essenciais (HANKERSON; MENEZES; VANSTONE, 2003). 29 Eles são um grupo F juntamente com duas operações, adição (denominada por + ) e multiplicação (denominada por . ), que satisfazem as propriedades aritméticas comuns: I. (F, +) é um grupo abeliano com (adição) identificada por 0; II. (F\{0}, .) é um grupo abeliano com (multiplicação) identificada por 1; III. A regra da distribuição: (a + b).c = a.c + b.c para todos a, b, c ∈ F 3.1.5 Grupo Grupo abeliano consiste em atribuir a G o valor da operação binária *: G ∗ G− > G sa- tisfazendo as seguintes propriedades (STALLINGS, 2005, p. 11): I. Associatividade: a ∗ (b ∗ c) = (a ∗ b) ∗ c para a, b, c ∈ G II. Existência de uma identidade: existe um elemento e ∈ G que a ∗ e = e ∗ a = a para a ∈ G III. Existência de inverso: para a ∈ G , existe um elemento b ∈ G , chamado de inverso de a , onde a ∗ b = b ∗ a = e IV. Comutatividade: a ∗ b = b ∗ a para a, b ∈ G Para implementar curvas elípticas tem de se determinar alguns termos, segundo Stallings (STALLINGS, 2005). I. Um campo finito (delimitado): a representação da área dos elementos e do algoritmo para executar os elementos delimitados II. Uma curva elíptica: a representação dos pontos da curva e o algoritmo para executar as curvas elípticas III. Um protocolo e um algoritmo para executar o protocolo 3.2 UTILIZAÇÃO DE CURVAS ELÍPTICAS NA ATUALIDADE Atualmente, a criptografia de curvas elípticas é utilizada nas seguintes aplicações: 30 I. Wireless Fidelity (WiFi): Curvas elípticas esta em um emergente e atrativo sistema de criptográfica 1 de chave pública para dispositivos móveis e para redes sem fio. A causa básica disso é que tanto RSA quanto ECC tem o mesmo nível de segurança, porém ECC tem o tamanho da chave bem menor, o que resulta numa comunicação mais rápida, com menor consumo de bateria como também menos memória utilizada e menor ocupação da banda. Isto é importante para dispositivos móveis em que estes são limitados quanto o CPU, bateria e conectividade pela rede (GUPTA et al., 2002). II. Transport Layer Security (TLS) (OpenSSL): Sucessor de Secure Sockets Layer (SSL), o TSL que significa ’Segurança na camada de transporte’, é um protocolo (RFC, 2006) para estabelecer conexão segura, vários protocolos usam o TLS, tais como HTTP, IMAP, POP3 e o SMTP. O OpenSSL utiliza o TLS. A RFC 4492 (RFC, 2006) agrega ao TLS à criptografia ECC, onde utiliza o esquema do Diffie-Hellman para curvas elípticas, conhecido como ECDH. III. Implementação Emparelhamento de Tate para celular usando Java (KAWAHARA; TAKAGI; OKAMOTO, 2006). Kawahara, Takagi e Okamoto apresentaram uma implementação para celular mais eficiente para o algoritmo de emparelhamento de Tate desenvolvido em Java. Kawahara, Takagi e Okamoto tiveram esta iniciativa sendo que todos os emparelhamentos existentes são relativamente lentos, conforme é visualizado na Tabela 1. Tabela 1: Comparação do tempo com outros sistemas criptográficos (ms) Operação FOMA SH901iS Pentium Emparelhamento nt com F397 509,22 10,15 Exponenciação modular RSA 1024 bits 4238,40 75,07 Multiplicação escalar ECC sobre F3163 13777,50 116,83 Fonte: Kawahara, Takagi e Okamoto (KAWAHARA; TAKAGI; OKAMOTO, 2006) O emparelhamento de Tate tem como algoritmo padrão o algoritmo de Miller. Duursma e Lee desenvolveram uma implementação mais eficiente para o algoritmo de Miller, mais especificamente para curvas elípticas super singulares sobre corpos finitos F3m . Barreto propós o algoritmo de emparelhamento nt que é aproximadamente duas vezes mais rápido que o algoritmo Duursma-Lee. A implementação de Kawahara, Takagi e Okamoto alcançou aproximadamente 0,5 segundos para a execução do emparelhamento de Tate num celular FOMA SH901iS, NTT Do1 ECC - Elliptic curve cryptography ou Criptografia por curvas elípticas 31 CoMo. Este resultado é comparável com outras aplicações de criptografia em Java como, por exemplo, RSA e ECC. Na Tabela 1 tem-se o resultado de testes realizados com um Pentium M 1.73GHz com 1 GB Ram usando J2SE2 e um aparelho celular FOMA SH901iS utilizando J2ME3 (KAWAHARA; TAKAGI; OKAMOTO, 2 3 2006). J2SE - Java 2 Standard Edition J2ME - Java 2 Micro Edition 32 4 DIFERENÇAS ENTRE RSA E ECC Neste capítulo, serão apresentadas as principais diferenças entre os algoritmos criptográficos RSA e ECC, mostrando suas principais vantagens e desvantagens. A diferença básica entre RSA e ECC está no tamanho da chave, ambos esquemas criptográficos podem ter o mesmo nível de segurança, porém com tempo de processamento diferenciados e tamanho da chave diferenciado (GUPTA et al., 2002). Dependendo da aplicação que se necessita a utilização de criptografia RSA ou ECC, deve-se considerar estes fatores, pois estes poderão ser determinantes para o sucesso do projeto. Na tabela 2, tem-se um diferencial do tamanho das chaves na criptografia RSA e na criptografia ECC, mostrando a equivalência entre as chaves para diferentes tamanhos de chaves criptográficas, onde ambas possuam o mesmo nível de segurança: Tabela 2: Tamanhos das chaves computacionalmente equivalentes. ECC RSA/DH/DSA 163 1024 283 3072 409 7680 571 15360 Fonte: O Autor (adaptado de Gupta et al. (GUPTA et al., 2002) Na Tabela 2, nota-se que para o esquema criptográfico ECC e RSA (utiliza-se os esquemas de Diffie-Hellman (DH) e Digital Signature Algorithm (DSA) terem o mesmo nível de segurança é preciso terem tamanhos de chaves diferenciados, isso dá a forma do cálculo das chaves serem diferenciados. Com essa vantagem, a criptografia ECC é a mais recomendada para dispositivos móveis e para as redes sem fio, pois com um tamanho de chave reduzido, consegue prover o mesmo nível de segurança que a criptografia RSA, como por exemplo economizando espaço na comunicação, que normalmente nesses ambientes é um recurso limitado. Na Tabela 3, têm-se um comparativo entre os esquemas criptográficos RSA e ECC, ambos foram medidos num computador de 1.5 GHz (EBERLE et al., 2004). Na Tabela 3, mediu-se o número de instruções executadas pelo RSA e pelo ECC com diferentes tamanhos de chaves. Para os testes foram comparados o RSA com um tamanho 33 Tabela 3: Desempenho RSA e ECC medida em computador 1.5GHz. Algoritmo Número Instruções Operações por Segundo Diferença Velocidade RSA-1024 284.900 5.265 1.0x ECC-160p 117.032 12.817 2.4x ECC-163b 58.236 24.756 4.9x ECC-163b-opt 38.009 39.464 7.5x RSA-2048 1.906.884 787 1.0x ECC-224p 245.330 6.114 7.8x ECC-233b 127.365 11.772 15.0x Fonte: O Autor (adaptado de Eberle et al. (EBERLE et al., 2004) de 1024 bits com o esquema ECC de tamanho 160 bits, utilizando corpos primos inteiros e de tamanho 163 bits utilizando corpos binários polimoniais e o RSA com um tamanho de 2047 bits com o esquema ECC de tamanho 224 bits utilizando corpos primos inteiros e 233 bits utilizando corpos binários polimoniais, onde p é GP(p) e b é GP(2m ) . Observando o número de instruções executadas, percebe-se que o RSA tem uma deficiência, onde efetua menos cálculos por segundo e consecutivamente demora mais tempo para finalizar a operação, como nota-se na coluna referente às operações por segundo. Comparando o número de operações por segundo, nota-se que o RSA é mais demorado que o ECC, pois ele efetua menos operações por segundo, essa diferença de tempo é bem considerável. Na coluna ’Diferença Velocidade’ é feito um comparativo de velocidade, onde percebese o quanto mais rápido a criptografia ECC é comparando-a com a criptografia RSA, como por exemplo, a criptografia ECC de 233b bits é 15 vezes mais rápido que a criptografia RSA de 2048 bits. Na Tabela 4, demonstra-se o cálculo de desempenho das operações primitivas do RSA, ECDH1 e ECDSA2 , usando o OpenSSL0.9.6b. (melhorado para incluir ECC). Os cálculos foram feitos em duas plataformas: I. Yopy: um PDA com sistema operacional Linux equipado com um processador de 200MHz StrongARM; II. Ultra 80: Um servidor Sun equipado com um processador de 450MHz UltraSPARC II. 1 2 ECDH - Elliptic Curve Diffie-Hellman. ECDSA - Elliptic Curve Digital Signature Algorithm. 34 Tabela 4: Cálculo de desempenho de algoritmos de chave pública (milisegundos). Ultra 80 Yopy RSAci f ra,veri f ica RSAdeci f ra,assina ECDSAveri f ica 1,7 13,0 6,8 6,1 18,1 9,2 10,8 46,5 24,5 39,1 76,6 39,0 Fonte: Gupta et al. (GUPTA et al., 2002) ECDHoperao 6,1 8,7 22,9 37,7 A Tabela 4 possui duas linhas para cada plataforma, onde a linha superior é para RSA utilizando 1024 bits na chave e ECC utilizando 163 bits na chave, a linha inferior é para RSA utilizando 2048 bits na chave e ECC utilizando 193 bits na chave. Para simular a variedade do mundo real, considerando todos os cenários, Gupta fez um teste comparando RSA e ECDH-ECDSA em cada um dos casos a seguir: I. Caso 1: Um Yopy com outro Yopy (no cenário ponto a ponto na rede sem fio (wireless) dos dispositivos. II. Caso 2: Um cliente Yopy conversando com um servidor Ultra 80 (para simular um cenário da web em rede sem fio, onde um dispositivo móvel (Yopy) solicita uma página para um servidor (Ultra 80). III. Caso 3: Um Ultra 80 conversando com outro Ultra 80 (para o modo normal de iteração entre um desktop e um servidor web) Figura 4: Taxa de criptografia do servidor sem autenticação RSA1024 e ECC163. Fonte: O Autor. (adaptado de Gupta (GUPTA et al., 2002)) 35 A comparação na Figura 4 utiliza chaves de 1024 bits para RSA e 163 bits para ECC e não utiliza autenticação do cliente, em termos de rendimento máximo, ECC é mais que cinco vezes melhor do que RSA nas duas plataformas consideradas. Em termos de latência do servidor, a comparação é mais interessante, quando o cliente SSL e o servidor são da mesma plataforma (Caso 1 e Caso 3), ECC é aproximadamente duas vezes mais rápido que RSA. De qualquer forma, no caso em que o cliente é um Yopy e o servidor um Ultra 80 (Caso 2), o RSA é melhor que o ECC conforme demonstra a Figura 5 Figura 5: Latência criptografia do Handshake sem autenticação RSA1024 e ECC163. Fonte: O Autor. (adaptado de Gupta (GUPTA et al., 2002)) A diferença de desempenho visualizado no ’Caso 1’ e no ’Caso 2’ justifica-se analisando a tabela 4, onde percebe-se nas operações que na plataforma Yopy as operações de curva elípticas tem um desempenho melhor. A Figura 6 e a Figura 7 utilizam o mesmo cenário que a Figura 5, e a Figura 4 porém utilizando a autenticação do cliente. Na Figura 6, a utilização do certificado ECDH no cliente teve um desempenho melhor que a ECDSA. Mais importante que isso é que ECC teve melhores desempenhos que RSA. No entanto, quando analisado a média de conexões por segundo na Figura 7, a criptografia RSA teve melhor desempenho que ECC, principalmente quando o certificado ECDH é utilizado. 36 Figura 6: Latência criptografia do Handshake com autenticação RSA1024 e ECC163. Fonte: O Autor. (adaptado de Gupta (GUPTA et al., 2002)) Figura 7: Taxa de criptografia do servidor com autenticação RSA1024 e ECC163. Fonte: O Autor. (adaptado de Gupta (GUPTA et al., 2002)) Figura 8: Latência criptografia do Handshake sem autenticação RSA2048 e ECC193. Fonte: O Autor. (adaptado de Gupta (GUPTA et al., 2002)) 37 Figura 9: Taxa de criptografia do servidor sem autenticação RSA2048 e ECC193. Fonte: O Autor (adaptado de Gupta (GUPTA et al., 2002)) Os mesmos testes relacionados acima foram realizados utilizando chave de 2048 bits em RSA e chave de 193 bits em ECC. Nos testes verificamos resultados melhores para ECC que RSA, sem nenhuma exceção, menos para o ’Caso 2’ sem autenticação do cliente. A Figura 8 mostra o impacto em utilizar tamanhos de chaves maiores no Yopy comunicando-se com um Ultra 80 (Caso 2) e sem autenticação do cliente. Fica claro na Figura 10 a vantagem de desempenho entre ECC e RSA quando trabalhando com chaves criptográficas grandes. Figura 10: Latência criptografia do Handshake com autenticação RSA2048 e ECC193. Fonte: O Autor (adaptado de Gupta (GUPTA et al., 2002)) 38 Figura 11: Taxa de criptografia do servidor com autenticação RSA2048 e ECC193. Fonte: O Autor (adaptado de Gupta (GUPTA et al., 2002)) 39 5 CRIPTOSSISTEMAS BASEADO EM IDENTIDADES - IBE Em 1984, Shamir propôs o conceito de criptossistemas baseados em identidade. Neste novo paradigma da criptografia, os usuários são identificados a partir de informações como o endereçoIP ou o endereço de e-mail no lugar de certificados digitais, usados como chave pública para a criptografia ou a verificação da assinatura (BAEK et al., 2004). Um dos resultados da utilização da criptografia baseada em identidade é a redução da complexibilidade do sistema, a redução do custo para a estabilização e armazenamento das chave públicas, isto se deve ao fato da chave pública ser uma informação que identifica o usuário, e a chave privada uma informação gerada baseada na chave pública. 5.1 CRIPTOGRAFIA BASEADA EM IDENTIDADE - IBC Criptografia baseada em identidade (Identity Based Encryption ou simplesmente IBE) é um sistema de chave pública em que esta pode ser qualquer texto, como por exemplo o endereço de e-mail. A central de autorização usa esta chave para identificar e distribuir a chave privada a quem solicita (BONEH; BOYEN; GOH, 2005). Desde que Shamir propôs esquemas criptográficos baseados em identidade, muitos esquemas foram lançados baseando-se na fatoração de números inteiros. Boneh e Franklin propuseram uma nova forma de desenvolver a criptografia baseada em identidade, baseada nos mapas bilineares da curva elíptica (CHA; CHEON, 2003). 5.1.1 Um modelo genérico Na Figura 12, Alice irá enviar uma mensagem para Bob, para isso ela pega o identificador de Bob, que é sua identidade, como por exemplo e-mail, endereço deIP ou outra informação que o identifique. Após isso, Alice irá criptografar a mensagem e enviar para o Bob. O recebedor da mensagem, Bob, irá receber sua chave privada de uma entidade terceira, esta entidade é considerada segura para ambas as partes, ela é conhecida como Private Key Generator (PKG). Após receber sua chave privada ele poderá decifrar a mensagem recebida de Alice. Seguem os passos que descreve a criptografia baseada em identidade segundo Baek et al. (BAEK et al., 2004). 40 Figura 12: Criptografia baseada em identidade. Fonte: O Autor (adaptado de Baek (BAEK et al., 2004)) I. Inicializa: O PKG cria a chave privada e a chave pública, que chamaremos de skPKG e pkPKG respectivamente. II. Extrai: O recebedor Bob se autêntica no servidor PKG e recebe sua chave privada skidBob associada com sua identidade IDBob III. Cifra: Usando a identidade de Bob IDBob e a chave pública do PKG ( pkPKG ), o enviador Alice cifrará a mensagem e obterá a mensagem cifrada. IV. Decifra: Quando receber a mensagem de Alice, Bob decifrará a mensagem usando a sua chave privada skidBob para recuperar a mensagem. 5.2 ASSINATURA BASEADA EM IDENTIDADE - IBS Assinatura baseada em identidade (Signature Based Identity ou simplesmente IBS), é um modelo de assinatura baseada em IBE, onde consegue-se garantir a autenticidade da mensagem. Se associado a criptografia IBE com a assinatura IBS consegue-se garantir além da autenticidade também o sigilo dos dados. 41 Figura 13: Assinatura baseada em identidade. Fonte: O Autor (adaptado de Baek (BAEK et al., 2004)) 5.2.1 Um modelo genérico Na Figura 13, Alice primeiramente obtém a chave privada relacionada com sua identidade do PKG. Então, ela assina a mensagem, usando a chave privada. O verificador Bob agora usa a identidade de Alice para verificar sua assinatura. Não é preciso para o Bob pegar um certificado de Alice. Seguem os passos que descreve a assinatura baseada em identidades segundo Baek et al. (BAEK et al., 2004). I. Inicializa: O gerador de chave privadas (PKG) um órgão terceiro considerado seguro para as ambas partes cria a chave privada e a chave pública que chamaremos de skPKG e pkPKG respectivamente. II. Extrai: Alice, quem irá assinar a mensagem se autêntica no servidor PKG e obtém a chave privada skIDAlice associada com a sua identidade III. Assina: Usando sua chave privada skidAlice , Alice cria a assinatura na sua mensagem. IV. Valida: Recebendo a assinatura e a mensagem de Alice, Bob verifica se a assinatura é verdadeira para a mensagem usando a identidade de Alice (IDAlice ) e a chave pública do 42 PKG ( pkPKG ). Se a assinatura é de Alice, é retornado ’Aceita’, caso contrário é retornado ’Rejeitada’. 43 6 ESQUEMAS IBE Neste capítulo serão apresentados os principais modelos criptográficos baseados em identidade. Será visto detalhadamente o funcionamento dos esquemas baseado nos quatro principais processos da criptografia, a inicialização, a extração, a cifragem e a decifragem dos dados criptografados. No final do capítulo será abordado exemplos onde a criptografia baseada em identidade é utilizada, bem como uma tabela comparativa entre os modelos, a fim de mostrar as principais características de cada modelo e também será categorizado os ambientes onde cada esquema criptográfico deverá ser aplicado, levando em consideração o ambiente de processamento. 6.1 MODELOS CRIPTOGRÁFICOS IBE Desde que Shamir propôs o novo modelo criptográfico baseado em identidades conhecido como IBE vários autores propuseram variações do modelo originalmente lançado. Esses modelos têm algumas melhorias nos problemas encontrados nos primeiros modelos. A seguir é listado os modelos de criptografia baseado em identidade mais conhecidos, é detalhado seu funcionamento, seus prós e contras na utilização de cada modelo, além de exemplificar a utilização deles em exemplos reais. 6.1.1 Modelo de Boneh e Franklin O desempenho do esquema IBE proposto por Boneh e Franklin é comparável com o esquema criptográfico ElGamal em F∗ p e a segurança do esquema IBE proposto por eles é baseado no problema de Diffie-Hellman em curvas elípticas (BONEH; FRANKLIN, 2001). Boneh e Franklin desenvolveram vários esquemas criptográficos baseado neste primerio modelo IBE que é conhecido por BasicIdent, este primeiro esquema IBE recebe este nome pois não é muito seguro e pode sofrer alguns tipos de ataques por código cifrado. Os modelos criptográficos desenvolvidos por Waters e por Naccache derivam deste esquema pela sua simplicidade, por este motivo é conhecido como BasicIdent. Este primeiro esquema IBE proposto por Boneh e Franklin é baseado nos oráculos randômicos. Oráculos randômicos são funções matemáticas que retornam números aleatoriamente. O problema na utilização deste artifício é que a forma que os números são escolhidos 44 aleatoriamente é considerado pseudo-randômico, pois eles têm uma certa lógica a ponto de um adversário poder calcular o próximo número a ser randomizado, podendo ser, de certa forma, considerado pouco seguro. Os principais componentes do modelo Boneh e Franklin , segundo Misaghi: I. INICIALIZA : O PKG seleciona a chave privada mestre s ∈ Zq∗ e calcula a chave pública Ppub = sP. Além disso específica duas funções hash da seguinte forma: H1 : {0, 1}∗ −→ G∗1 e outra função hash da seguinte forma: H2 : G2 −→ {0, 1}n , com os seguintes parâmetros: hG1 , G2 , e, P, Ppub , H1 , H2 i e a chave mestre hsi. II. EXTRAI : Dada uma string ID ∈ {0, 1}∗ , o PKG verifica a identidade e faz: (a) Computa QID = H1 (ID) ∈ G∗1 (b) Atauliza a chave privada SID = sQID O componente QID atua como uma chave pública correspondente a identidade ID. III. CIFRA : Para cifrar uma mensagem m ∈ {0, 1}n a ser enviada à um usuário com identidade ID deve ser feito: (a) Processar QID = H1 (ID) ∈ G∗1 (b) Escolhe um randômico r ∈ Zq∗ (c) Atualize o texto cifrado para que seja: C = hrP, M ⊕ H2 (grID )i onde gID = e(QID , Ppub ) Texto cifrado: C = hU = rP, V = M ⊕ H2 (grID )i ∈ G∗1 × {0, 1}n IV. DECIFRA : Para decifrar o texto cifrado C = hU, V i através de ID processada V ⊕ H2 (e(dID , U)) = M 6.1.2 Modelo de Cocks O esquema IBE de Cocks é atualmente o único esquema criptográfico que não uti- liza emparelhamento bilenear e na prática não é utilizado pela grande expansão do texto criptografado. 45 Basicamente, quando a autoridade certificadora (PKG, TA) recebe uma identidade (chave pública) é executado uma função hash no texto gerando um valor a módulo M , onde a reprea sentação é igual a representação de Jacobi ( M ) = +1 . Normalmente a função hash é aplicada diversas vezes de forma estruturada para produzir uma série de possíveis valores para a, a parando quando e somente quando ( M ) = +1 . A fórmula de Jacobi pode ser aplicada sem conhecimento na fatoração de M (COCKS, 2001). Os principais componentes do modelo Cocks , segundo Misaghi: I. INICIALIZA : O PKG gera um módulo M disponível universalmente, que é o produto de dois números primos P e Q. Os números primos P e Q são congruentes a 3 mod 4 e eles, são particularmente prendidos por PKG. O PKG também seleciona funções hash seguras disponíveis universalmente. Os parâmetros utilizados são: hM , funções hash i e chave mestre é a fatoração de M . II. EXTRAI : Quando alguém envia a string da sua identidade para PKG, o PKG verifica a identidade e faz o seguinte: (a) Aplica uma função hash e produz um valor a mod M tal que o símbolo de Jacobi ( Ma ) é +1. Isto envolve aplicações múltiplas de uma função hash de uma forma estruturada para produzir um conjunto de valores candidatos para a, parando quando ( Ma ) for +1. Desde que ( Ma ) seja +1, ( Pa ) = ( Qa ) e também a seja o módulo quadrático de P e Q e ainda o módulo quadrático de M . (b) O PKG apresenta uma raiz para pessoa como a sua chave privada correspondente a sua identidade, na qual so a PKG poderá calcular. III. CIFRA : A cifragem de uma mensagem consiste em gerar uma chave de transporte e cifrar a mensagem com um algoritmo de cifragem simétrica. Cada bit da chave de transporte será enviado da seguinte forma: (a) Sendo x um bit singular de uma chave de transporte codificado como +1 ou -1. (b) Escolher um valor t randômico de tal forma que ( Mt ) seja igual a x. (c) Enviar s = (t + a/t) Mod M . Se Beto não souber qual das raízes (a ou -a) Alice está guardando consigo, ele terá de replicar o processo acima, utilizando diferentes t escolhidos randomicamente para enviar os mesmos x bits como antes, e transmitindo s = (t − a/t) mod M cada vez. IV. DECIFRA : Alice recupera o bit x da seguinte maneira: 46 (a) Alice calcula o símbolo de Jacobi, utilizando a sua chave privada r, como ( s+2r M ). t (b) Alice recupera o bit x, calculando ( s+2r M ) = ( M ) = x como s + 2r = t(1 + r/t) ∗ (1 + r/t) mod M. (c) Alice decifra a mensagem, uma vez que ela recupera todos os bits da chave de transporte. 6.1.3 Modelo de Waters Waters propôs a implementação do esquema IBE proposto por Boneh e Franklin baseado no problema de Diffe-Hellman e sem a utilização de oráculos randômicos. Os dois principais objetivos de Waters era fazer um esquema criptográfico que trabalhasse com hierarquia e sem a utilização de oráculos randômicos. Para o desenvolvimento deste esquema foi utilizado como base o esquema BasicIdent (esquema proposto por Boneh e Franklin em 2001) (WATERS, 2005). Com essas alterações, o esquema proposto por Waters teria um aumento de segurança pela utilização de níveis hierárquicos e da retirada dos oráculos randômicos (WATERS, 2005). Os principais componentes do modelo Waters , segundo Misaghi: I. INICIALIZA : Nesta fase são criados os parâmetros do sistema. Um segredo α ∈ Z p e um gerador, g ∈ G são escolhidos de forma randômica. Logo, os seguintes valores são atribuídos: (a) g1 = gα . (b) Escolher g2 ∈ G de forma randômica. (c) Escolher u0 ∈ G de forma randômica. (d) Escolher um vetor de comprimento n , sendo U = (ui ) de forma randômica com elementos randômicos em G. Desta forma, os parâmetros a serem publicados são g, g1 , g2 , u0 e U . O segredo mestre é gα 2. II. GERA CHAVE : Seja v uma string de n bits que representa uma identidade, vi ilustrando o i-ésimo bit de v , e V ⊆ {1, . . . , n} seja o conjunto de todos os i que vi = 1. Uma chave privada para identidade v é gerada como segue: (a) Escolher r ∈ Z p de forma randômica; 47 (b) A chave privada é construída como: !r gα2 dv = u0 ∏ ui ! , gr . i∈V III. CIFRA : Uma mensagem M ∈ G1 é cifrada para uma identidade v como segue, um valor t ∈ Z p é escolhido de forma randômica. Logo então o texto cifrado será: !t ! C= e(g1 , g2 )t M, gt , u0 ∏ ui . i∈V IV. DECIFRA : Sendo C = (C1 , C2 , C3 ) uma cifragem válida de M sob identidade v, C poderá ser decifrado por dv = (d1 , d2 ) como: C1 6.1.4 e(d2 ,C3 ) e(d1 , C2 ) Modelo de Naccache O primeiro esquema criptográfico baseado em identidade proposto foi de Boneh e Franklin. Além dele utilizar oráculos randômicos era considerado seguro. Em 2004 Boneh e Boyen propuseram um esquema IBE totalmente seguro dentro dos padrões, isso quer dizer, sem a utilização de oráculos randômicos, na prática, ele não é utilizado pois é considerado ineficiente. O primeiro esquema criptográfico baseado em identidade sem a utilização de oráculos randômicos foi proposto por Waters, em 2005, no evento EUROCRYPTO, tanto a criptografia quanto a descriptografia são totalmente eficientes pela utilização de algumas exponenciações e alguns mapas bilineares que são necessários (BONEH; BOYEN, 2004). Entretanto o problema do esquema IBE proposto por Waters é o tamanho dos parâmetros públicos, que são muito grande. No EUROCRYPT de 2005, Waters tornou como problema público um esquema IBE sem a utilização de oráculos randômicos e com parâmetros públicos pequenos (BONEH; BOYEN, 2004). O esquema IBE, proposto por Naccache, trabalha em torno desde problema levantado por Waters. Naccache propôs um esquema em que os parâmetros públicos são menores, entretanto utilizando mapas bilineares. 48 Seja G um grupo de números primos de ordem p , seja g gerado a partir de G e seja e um mapa bilinear aceitável em G1 . A identidade é representada por n e l que são parâmetros sem ligação com p , e n0 = n.l é o tamanho de saída da função hash resistente a 0 colisão: H : {0, 1}∗ − > {0, 1}n (BONEH; BOYEN, 2004). Comparando o desempenho com o esquema IBE de Waters e Naccache, para a geração dos parâmetros públicos o esquema do Naccache é mais eficiente, enquanto para a criptografia e descriptografia o esquema proposto por Waters é mais eficiente (BONEH; BOYEN, 2004). Os principais componentes do modelo Naccache , segundo Misaghi: I. INICIALIZA : Nesta fase são criados os parâmetros do sistema. Um segredo α ∈ Z p e um gerador, g ∈ G são escolhidos de forma randômica. Logo, os seguintes valores são atribuídos: (a) g1 = gα . (b) Escolher g2 ∈ G de forma randômica. (c) Escolher u0 ∈ G de forma randômica. (d) Escolher um vetor de comprimento n , sendo U = (ui ) de forma randômica com elementos randômicos em G. Desta forma, os parâmetros públicos são g, g1 , g2 , u0 e U . O segredo mestre é gα 2. II. EXTRAI : Seja v = (v1 , . . . , vn ) ∈ ({0, 1}a )n uma identidade, escolher r randômico em Z p . A chave privada dv para a identidade v é construída como: n dv = !r u0 ∏ uvi i gα2 ! , gr . i=1 III. CIFRA : Uma mensagem m é cifrada para uma identidade v como segue, um valor t ∈ Z p é escolhido de forma randômica. Logo, o texto cifrado será: C= t t 0 n e(g1 , g2 ) M, g , u ∏ !t ! uvi i . i=1 IV. DECIFRA : Sendo C = (C1 , C2 , C3 ) uma cifragem válida de m sob identidade v, C poderá ser decifrado por dv = (d1 , d2 ) como: C1 e(d2 ,C3 ) e(d1 , C2 ) 49 6.2 TABELA COMPARATIVA A Tabela 5, mostra um comparativo entre empregabilidade de tecnologias nos diversos esquemas IBE. Tabela 5: Comparativo entre tecnologias nos esquemas IBE Curvas elípticas Oráculos randômicos Rapidez Resíduos Quadráticos Boneh-Franklin Cocks Sim Não Sim Não Não Não Não Sim Fonte: O Autor. Waters Sim Não Não Não Naccache Sim Não Sim Não A Tabela 5 foi elaborada com base nas informações de cada modelo, sendo que não necessariamente o item rapidez está diretamente ligado a alguma tecnologia utilizada. Segundo Misaghi mostra-se na Tabela 6 as operações utilizadas pelos esquemas IBE, por ordem de custo computacional, lembrando que quanto maior o custo computacional, mais complexa é a operação. Tabela 6: Operações IBE por ordem de custo computacional. Operação emp exp Ms h Descrição Custo Operacional Emparelhamento bilinear Custo mais alto Exponenciação Custo alto Multiplicação Escalar Custo moderado Função hash Custo mais baixo Fonte: Misaghi (MISAGHI, 2006) Segundo Misaghi mostra-se na Tabela 7 as operações relacionadas durante o processo de cifragem, baseando-se na Tabela 6 que apresenta as operações ordenadas por custo computacional justifica por que o esquema de Boneh Franklin é demorado, sendo que uma operação de emparelhamento demora cerca de 2/3 do tempo de cifragem. Tabela 7: Operações utilizadas no processo de cifragem. Esquema M s exp h p a emp h m2p XOR Boneh-Franklin 1 1 1 1 1 Waters* 3 1 Naccache* 4 1 Fonte: O Autor (adaptado de Misaghi (MISAGHI, 2006)) Legenda: 50 M s = multiplicação escalar p a = adição de ponto h m2p = MapToPoint. No caso de * operação é em grupo exp = exponenciação emp = operação de emparelhamento XOR = operação de XOR h = função hash Segundo Misaghi mostra-se na Tabela 8 as operações relacionadas durante o processo de decifragem, baseando-se na Tabela 6 que apresenta as operações ordenadas por custo computacional percebe-se que o esquema do Waters e Naccache serão mais lentos, pois efetuam mais operações de exponenciação que o esquema do Boneh Franklin: Tabela 8: Operações utilizadas no processo de decifragem. Esquema M s exp h p a emp h m2p XOR Boneh-Franklin 1 1 1 Waters 2 1 Naccache 2 1 Fonte: O Autor (adaptado de Misaghi (MISAGHI, 2006)) 6.3 CARACTERÍSTICAS POSITIVAS E NEGATIVAS Tem-se as seguintes vantagens na utilização de esquemas criptográficos baseado em identidade (BENITS, 2003, 60): I. Não é necessário um diretório contendo as chaves públicas: como nos sistemas criptográficos baseados em identidade a chave pública é uma características que identifica o usuário, como por exemplo o e-mail, essa informação é pública, e por esse motivo não se tem a necessidade de publicar tais informações, tendo em vista que essas informações normalmente são de conhecimento público; II. Qualquer entidade que possua um par de chaves padrão pode fazer o papel de gerador de chaves privadas; III. PKG tem custódia das chaves: Pode ser visto como uma vantagem e como uma desvantagem, pois o PKG tendo a custódia das chaves possibilita com que ele possa ler todas as 51 mensagens que ele recebe, esse ponto levanta uma característica negativa que também é levantado como uma desvantagem, outro ponto de vista é que caso algum envolvido na conversa sofra algum acidente as mensagens e arquivos pertencentes a essa pessoa que sejam de interesse da empresa poderiam ser recuperados a partir da chave que fica no PKG; IV. Possibilidade de envio de mensagem sem que o receptor possua sua chave privada: em sistemas tradicionais de chave pública, como por exemplo o RSA, é necessário um processamento prévio para a geração das chaves públicas e das chaves privadas, pela depêndencia entre as chaves públicas e privadas durante a sua geração, ambos precisam ser gerados, não sendo possível o envio de mensagens sem esse pré-processamento; V. Envio de mensagens sem a necessidade do certificado do receptor: diferentemente dos sistemas de chave públicas convencionais como o RSA, a chave pública em esquemas IBE é uma característica que identifica o usuário de forma única, fazendo com que ele não possa negar que tal característica pertence a ele, dessa forma não se faz necessário a utilização de certificados e nem de uma infra-estrutura de chaves públicas; VI. Tamanho das chaves em relação a criptografia assimétrica tradicional (RSA) e criptografia simétrica: conforme visto no capítulo 4, a criptografia assimétrica convencional (RSA), a criptografia assimétrica por curvas elípticas e a criptografia simétrica tem uma grande diferença no tamanho da chave para garantirem o mesmo nível de segurança, esse item é uma vantagem de sistemas IBE pois faz com que sua chave seja menor. Tem-se as seguintes desvantagens na utilização de esquemas criptográficos baseado em identidade (BENITS, 2003, p.63): I. Grande dependência da chave mestra do PKG: como foi visto, todas as chaves privadas geradas pelo PKG são geradas baseadas na chave mestra do PKG, caso essa chave seja comprometida, todas as chaves privadas geradas, todas as mensagens enviadas e todas as mensagens que serão enviadas futuramente estariam comprometidas. Para resolver este problema poderia ser utilizado múltiplos PKGs, onde deveria ser mantido em segurança todos os servidores PKG; II. O PKG tem conhecimento de todas as chaves privadas de seus usuários: como já levantado, este item repete-se pelo fato de poder ser considerado uma desvantagem, para corrigir este problema poderia ser utilizado a mesma solução utilizada no item anterior, múltiplos PKG; 52 III. Dificuldade da implementação do emparelhamento de TATE: o cálculo do emparelhamento de Tate é muito custoso a níveis computacionais, dependendo da forma que foi implementado pode levar um esquema IBE a ser inviável de se utilizado em termos práticos, pois ficaria muito lento. Alguns pesquisadores como Galbraith, Harrison, Soldera, Barreto, Lynn e Scott já conseguiram uma implementação mais eficiente do emparelhamento de Tate, porém este possui ordem de grandeza superior ao cálculo de exponenciação em um corpo finito. 6.4 PLATAFORMA VOLTAGE A plataforma de Voltage possui mecanismos para o envio seguro de e-mails, mensagens instantâneas, voz sobre IP entre outros. Além disso, o kit de ferramentas de Voltage permite que desenvolvedores utilizem as bibliotecas de criptografia, inclusive o IBE. A Figura 14 e a Figura 15 ilustram o funcionamento do Voltage Secure-mail. Figura 14: Funcionamento do Secure-mail do Voltage, primeira utilização. Fonte: O Autor (adaptado de Security (SECURITY, 2006)) Na Figura 14, para Bob enviar uma mensagem para Alice não precisará de nenhuma operação adicional, quando Bob clicar no botão ’enviar’, o sistema irá criptografar a mensagem dele usando o e-mail de Alice. Para a operação acima se concretizar não é preciso nenhum processamento prévio para geração da chave pública, pois a chave pública no caso é o e-mail de Alice. Para Alice visualizar a mensagem em seu computador, caso ela não possua o Voltage Secure-mail instalado irá aparecer no e-mail criptografado e um link para baixar o Voltage 53 Secure-mail, o Voltage Secure-mail deverá ser autenticado em algum servidor e, após isso, ele baixará a chave privada do usuário, o que permitirá que a mensagem seja descriptografada. Figura 15: Funcionamento do Secure-mail do Voltage, segunda utilização. Fonte: O Autor (adaptado de Security (SECURITY, 2006)) A Figura 15 mostra o mesmo processo descrito na Figura 14, porém aqui Alice já possui sua chave privada, onde não é mais necessário para Alice comunicar-se com o PKG e requisitar sua chave privada novamente. 6.5 IMPLEMENTAÇÃO BONEH FRANKLIN COM DISPONIBILIDADE TEMPORAL Será apresentado o desenvolvimento efetuado para demonstrar a aplicabilidade do esquema do Boneh Franklin. Como diferencial das demais implementações deste modelo este desenvolvimento aplica a disponibilidade temporal. De forma simplificada, disponibilidade temporal é utilizada para enviar uma mensagem e o tempo que a mensagem estará disponível para o receptor conseguir decifrá-la é limitado no envio da mensagem. Desta forma pode-se enviar uma mensagem para Bob e garantir que ele poderá ver está mensagem somente hoje, caso não faça isso, não poderá mais visualizá-la corretamente. Como o desenvolvimento teve ênfase educacional, o programa desenvolvido mostra todas as variáveis do sistema, onde é exibido o tamanho máximo dos números primos gerados aleatoriamente, o valor do master key utilizado pelo servidor PKG, o valor da variável ’q’, a função de hash utilizada e qual curva está sendo utilizada, conforme demonstra a Figura 16. A aplicação é dividida em 2 componentes: 54 Figura 16: Implementação Boneh Franklin - Variáveis disponíveis. Fonte: O Autor. I. Servidor PKG: servidor que possui todo o processamento da criptografia IBE, é responsável por cifrar, decifrar, gerar todas as variáveis do servidor e gerar a chave privada dos usuários. II. Cliente: aplicação que se conecta no servidor PKG e solicita a cifragem de mensagens, a decifragem de mensagens e a geração de sua chave privada. O cliente foi desenvolvido para permitir várias instâncias no mesmo computador. Figura 17: Implementação Boneh Franklin - Servidor PKG. Fonte: O Autor. Para iniciar a aplicação cliente primeiramente deve-se ter um servidor PKG disponível, para isso devemos iniciar o servidor conforme demonstra a Figura 17. A Figura 18 mostra a aplicação cliente iniciada, assim que o usuário abrir a aplicação cliente deverá efetuar a configuração do servidor PKG clicando no botão ’Configuração Servidor’ e em seguida informar o ’Nome’ do ’Servidor RMI’ e efetuar a parametrização da identidade utilizada informando em ’Servidor Local’ o número da porta, sendo que o ’Nome’ em ’Servidor Local’ é assumido por padrão como o endereço de IP do computador, conforme mostra Figura 19. 55 Figura 18: Implementação Boneh Franklin - Tela Principal. Fonte: O Autor. Figura 19: Implementação Boneh Franklin - Configuração servidor PKG e configuração da Identidade. Fonte: O Autor. Na Figura 19 é parametrizado o servidor PKG, a comunicação com o servidor PKG é feita pelo protocolo RMI1 , assim deverá ser informado a localização do servidor RMI para parametrização do servidor PKG. Após informado o servidor PKG, deverá ser informado a porta que será recebida as mensagens, a porta fará parte da identidade do usuário juntamente com o endereço de IP do computador. A identidade utilizada pelo cliente é nada mais do que uma informação que distingue o usuário na rede, possibilitando assim que outros computadores utilizando o cliente possam conversar com ele. 1 RMI será explicado no capítulo 8. 56 Desta forma, a identidade utilizada é o IP do computador (na Figura 19 não se pode informar o nome do computador pois sempre é assumido o computador local) somado da porta configurada para receber as mensagens. Após efetuar as parametrizações acima, o usuário precisa ativar o cliente, nesta operação o cliente se conecta no servidor PKG, utilizando o protocolo RMI e também irá ficar ouvindo a porta configurada para receber novas mensagens, assim que uma mensagem for recebida, a tabela da direita intitulada de ’Mensagens Recebidas’ será alimentada, conforme mostra a Figura 20. Figura 20: Implementação Boneh Franklin - Mensagem recebida. Fonte: O Autor Assim que a mensagem for recebida o usuário poderá clicar sobre ela na tabela da direita e assim poderá exibir a mensagem descriptografada, conforme mostra a Figura 21. A configuração da disponibilidade temporal é feita sempre antes de enviar a mensagem, assim pode-se limitar a data máxima de leitura da mensagem. Inicialmente o cliente permite fornecer disponibilidade ’Não Utilizado’, ’Diária’, ’Mensal’ ou ’Anual’, sendo que é possível utilizar qualquer unidade de tempo para a disponibilidade temporal. A chave pública no cliente atualmente é composta das seguintes informações: Endereço de IP : Porta recebedora de mensagens Levando para exemplo acima ela seria: 127.0.0.1:2121 57 Figura 21: Implementação Boneh Franklin - Mensagem recebida cifrada e decifrada. Fonte: O Autor. Sendo que este cliente está configurado para receber mensagens na porta 2121. Para a implementação de disponibilidade foi somado no final da identidade do cliente a disponibilidade temporal aplicada. Agora a chave pública do cliente tem o seguinte formato: Endereço de IP : Porta recebedora de mensagens : Disponibilidade Utilizando o exemplo acima e imaginando que a disponibilidade temporal seja mensal, partindo da data referência como 01/11/2006, a identidade do usuário seria a seguinte (a aplicação utiliza meses partindo de Janeiro com valor 0 (zero) até dezembro com valor 11 (onze)): 127.0.0.1:2121:10/2006 Desta forma, quando receber a mensagem o receptor terá de verificar a disponibilidade temporal aplicada (’Não Utilizado’, ’Diária’, ’Mensal’ ou ’Anual’). A utilização de disponibilidade temporal fica visível no programa, demonstrando a seção de log, em que o programa grava todos os passos do sistema, conforme mostra a Figura 22. Caso um usuário tentasse visualizar uma mensagem com a disponibilidade temporal vencida, não iria conseguir visualizar a mensagem tendo um retorno semelhante a Figura23. 58 Figura 22: Implementação Boneh Franklin - Tela de Log. Fonte: O Autor. 59 Figura 23: Implementação Boneh Franklin - Mensagem com disponibilidade temporal vencida. Fonte: O Autor. 60 7 BUSCA EM BANCO DE DADOS CIFRADOS Busca em banco de dados cifrados utilizando IBE é estudada a alguns meses, já é possível levantar vários autores com artigos a respeito. Este capítulo baseia-se principalmente no artigo escrito por Waters (WATERS et al., 2004). Segue algumas notas de alguns outros autores referente a busca de palavras em banco de dados cifrados. Abdalla propôs em seu artigo algumas extensões da busca cifrada (ABDALLA et al., 2005): I. IBE anônimo: um esquema IBE é anônimo que não revela a identidade da pessoa, Abdalla et al. propuseram algumas alterações para fazer com que a identidade do receptor não fosse revelada pela chave pública do mesmo. II. PETKS - Public key Temporary Keyword Searchable: disponibiliza palavras-chave para buscas somente num determinado período de tempo. III. Criptografia baseada em identidade com busca de palavras-chave: Combinaram os conceitos de criptografia baseada em identidade e PEKS 1 para obter criptografia baseada em identidade com busca de palavras-chave (IBEKS - Identity based encryption with keyword search). Semelhante aos esquemas IBE, este permite utilizar qualquer texto como chave pública do receptor para o esquema PEKS. Philippe Golle e David Wagner propuseram em seu artigo os seguintes itens (GOLLE; WAGNER, 2006): I. Busca em banco cifrado por múltiplas palavras-chave: Prover ao sistema a capacidade de buscar por mais de uma palavra separadamente ou juntamente na mesma busca. Utilizando PEKS o únicos caminho para fazer isso é procurar cada palavra separadamente e efetuar operações para buscar pelas outras palavras no resultado da primeira busca. Esta técnica não é prática quando têm-se um número elevado de palavras-chave num conjunto de requisições, pois todos os dados são buscados para todas as buscas por palavras-chave simples. II. Canais seguros (Secure Channels): O esquena PEKS precisa de um canal seguro para os clientes comunicarem com o servidor, isso se faz necessário pelo motivo de um intruso puder recuperar a chave pública. O algoritmo PEKS foi alterado para cifrar palavras-chave 1 PEKS - Public key Encryption with Keyword Searchable (Criptografia por chave pública com busca por palavrachave cifrada 61 utilizando a chave pública do cliente e a chave pública do servidor, enquanto o algoritmo de teste precisa da chave privada do servidor para poder decifrar o dado e somente o servidor poderia efetuar esta operação. Ohtaki propôs a utilização da inversão dos índices para determinar quais registros satisfazem a busca num banco de dados cifrados. O processo se resume em (OHTAKI, 2005): I. Cada palavra é assinada com a chave secreta S0 , concatenado com o identificador do registro, então criptografa utilizando a chave pública P1 : uij = E p 1(I i |Es0 (wij )) onde j = 1, 2, ..., m II. Identificador do registro é criptografado usando a chave secreta do admin s0 e o registro é criptografado usando a criptografia simétrica F . K i = Es0 (I i ) , V i = FK i (Ri ) Um grupo de registros criptografados com identificadores denominado C : C = (I 1 ,C1 ,V 1 ), (I 2 ,C2 ,V 2 ), ..., (I n ,Cn ,V n ) III. Quando o investigador for buscar os dados ele deverá passar uma palavra para o admin, o admin irá retornar a palavra cifrada W 0 cifrada com a chave privada S0 . IV. O investigador concatena a palavra com o identificador I i : W i = E p1 (I i |W 0 ), i = 1, 2, ..., n V. O investigador compara W i com uij . Se o registro tem uma entrada parecida com W i , o investigador poderá saber o registro atrelado a palavra-chave. Abaixo segue os principais pontos levantados do artigo do Waters (WATERS et al., 2004) e que serão utilizados para o desenvolvimento da aplicação no Capítulo 8. O principal objetivo do log é saber a situação atual de um sistema, quais as rotinas estão sendo executadas, e quais rotinas o sistema já executou. Atualmente vários sistemas incluem a opção de log, afim de verificar possíveis problemas durante a execução de processos , identificar possíveis tentativas de ataques ou até mesmo identificar ataques sofridos que não foram descobertos até então. 62 Juntamente com as informações dos usuários que tiveram acesso a um sistema qualquer, ou até mesmo, todas as atividades que um usuário efetuou no sistema podem ser logadas para futuras consultas, algumas informações podem ser de grande importância para a organização e talvez seja perigoso mante-lá em um arquivo de acesso geral, ou em um banco de dados que pessoas mal intencionadas possam ter acesso afim de roubar informações. Para isso, muitas empresas acabam criando verdadeiras muralhas para guardar seus logs, evitando assim que qualquer usuário tenha acesso aos logs. Outras empresas também usam a prática de criptografar o banco de dados, assim usuários que não podem ter acesso a tal informação não poderão compreende-lá, e não poderão usá-la de forma incorreta. O problema de criptografar banco de dados ou logs é na hora de efetuar buscas afim de analisar as atividades efetuadas ou analisar um período qualquer, pois para poder compreender o log é necessário descriptografar todas as informações contidas nele, tornando o processo além de lento também inseguro, pois caso algum usuário mau intencionado tivesse acesso aos dados descriptografados poderia colocar em risco as informações da empresa. Waters, em seu artigo, mostra como fazer um sistema de logs em que se permite ter os logs criptografados, efetuar buscas por palavras-chave no banco de dados criptografado e descriptografar todos os dados referente a um registro qualquer. A entidade que armazena as chaves pode designar para qualquer usuário, que será chamado de investigador, a possibilidade de consultar por palavras-chave que não pertençam a ele, isso é conhecido como delegação de capacidade de busca, onde a entidade que armazena as chaves pode ceder acesso a qualquer usuário. O artigo do Waters, onde ele descreve a criação e a consulta de dados em um banco de dados criptografado foi baseado na criptografia por identidade (IBE), sendo o esquema do Boneh e Franklin, conhecido por BasicIdent, o esquema aplicado para sua implementação. O servidor que possui o banco de dados onde é armazenado os logs utiliza uma palavrachave para a criptografia dos dados. No esquema proposto por Waters é gerado palavras-chave para efetuar a busca dos dados. Estas palavras-chave são criptografadas utilizando a própria palavra como chave pública. Assim quando o usuário receber o texto criptografado ele não saberá qual palavra-chave foi utilizado para criptografar aquele dado. Na criptografia simétrica fazer uma busca em um banco de dados criptografado é fácil, pois o banco de dados inteiro possui apenas uma chave, que é compartilhada por todos os 63 registros. Com isso, não se consegue garantir o legítimo dono de uma informação (registro), fazendo com que qualquer pessoa tivesse acesso àquela informação. Utilizando o esquema de criptografia assimétrica, como por exemplo IBE, somente o legítimo dono da informação poderá acessar aquele dado. No caso de se fazer necessário um usuário buscar informações que não sejam a respeito daquele usuário, o PKG poderá ’ceder’ permissão ao usuário, como foi visto anteriormente, é o que se chama de delegação de capacidade de busca. 7.1 CARACTERÍSTICAS DO LOG DE AUDITORIA SEGURO As características principais do log de auditoria seguro são: I. Desenhado para prevenir e garantir autenticidade II. Desenhado para controlar os dados, garantindo que eles não serão alterados e controlar o acesso aos dados 7.2 RESISTENTE A ENGANOS O log de auditoria seguro foi feito para prevenir e cuidar da elegibilidade nos dados, garantindo assim que nenhum outro usuário, além do criador do registro do log, poderá visualizar os dados. 7.3 VERIFICABILIDADE É possível verificar todas as entradas do log presentes e que não foram alteradas. Para verificar um log auditor tem-se duas maneiras: I. Cada entrada no log auditor conterá informações para garantir sua autenticidade. Se algumas entradas foram alteradas ou deletadas, será detectado, pois os dados são gravados criptografados. Caso alguma informação foi perdida ou modificada, é possível verificar as demais entradas para recuperar alguma informação útil no log danificado. II. Os registros devem ser linkados a ponto de ser possível determinar se algum registro está faltando. Como por exemplo, poderia se adotar a utilização de um número de série para identificar se todos os registros estão presentes. 64 7.4 CONTROLE DE ACESSO AOS DADOS E BUSCA O controle de acesso e o controle de buscas no log de auditoria seguro é possível, sendo que este é criptografado, onde as atividades de controlar o acesso é feito por custódia da chave privada do usuário que gravou o dado. No controle de buscas é introduzido o conceito de delegação de capacidades, onde o PKG pode fornecer a um investigador a possibilidade de efetuar buscas por palavras no banco de dados criptografado. Para a delegação ser considerada segura, enquanto não for delegado a possibilidade a um usuário, o mesmo não poderá visualizar informações que não pertençam a ele. 7.5 NOTAÇÕES E COMPONENTES DO LOG AUDITOR Utilizando um exemplo prático, onde se faz necessário logar todas as informações dos usuários que estão acessando um ou mais banco de dados SQL. A log de auditoria consiste em uma série de registros de log individuais, cada registro de log possui: I. Criptografia dos dados com uma chave Ki , com um metadata que é a identidade do usuário, opcionalmente também pode conter o resultado da consulta executada. O valor de Ki é gerado aleatoriamente para cada registro; II. H(Ri − 1) o hash do registro anterior, afim de manter uma corrente de hash; III. palavras-chave (wa , wb , wc ) que poderão ser utilizadas na busca (cwa , cwb , cwc ); IV. hash da data atual 7.5.1 Extração de palavras-chave A Figura 24 demonstra como acontece a extração das palavras-chave, além das in- formações extraídas da operação executada, são extraídas meta-informações do usuário que executou a consulta, a data e a hora. Lembrando que as palavras-chave são categorizadas, e as buscas não precisam ser feitas apenas pelas palavras-chave, mas também pelas meta informações do usuário (identidade do usuário que efetuou a busca, por exemplo) ou pela data ou hora. 65 Figura 24: Esquema de busca de palavra em banco de dados cifrados. Fonte: O Autor (adaptado de Stallings (STALLINGS, 2005, p.22)) 7.6 ESQUEMA POR CHAVE ASSIMÉTRICA Esse esquema pode ser desenvolvido utilizando chaves simétricas também, nesta seção será apresentado os principais conceitos deste esquema aplicado na criptografia assimétrica, pois no capítulo 8 esta proposta será implementada utilizando o esquema do Boneh Franklin. O log de auditoria seguro detalhado aqui se baseia na implementação do esquema IBE do Boneh Franklin conhecido como BasicIdent, para maiores informações a respeito do esquema BasicIdent consulte o capítulo 6. Os principais componentes do auditor de log seguro (WATERS et al., 2004): I. INICIALIZA : Inicialmente é setado a instância do IBE utilizado. No sistema, o agente audi- tor escravo é determinado o IBE master secret s , e todos os servidores que contribuem para o auditor de log são determinados pelo parâmetro do sistema P . II. CIFRA : Suponha que o servidor esta encriptando a entrada do log m, juntamente com as palavras-chave w1 , w2 , ...wn . O servidor executa os seguintes passos: (a) O servidor escolhe aleatoriamente uma chave simétrica K , para ser usada somente para está entrada do log; (b) O servidor cifra o dado utilizando K , para possuir Ek (m); 66 (c) Para cada palavra-chave w1 , o servidor processa o IBE c1 do texto (flag|K) usando w1 como chave pública e P como parâmetros públicos; (d) O servidor escreve EK(m) , c1 , c2 , ..., cn como entrada no log de auditoria. A única forma de voltar algum registro do log é decifrar a palavra-chave c1 e obter a chave simétrica K . III. BUSCA E DECIFRA : Para efetuar a busca de uma palavra-chave, um investigador irá soli- citar a delegação para poder pesquisar a palavra w . Se o agente auditor aprovar, ele irá retornar dw que representa a chave privada IBE da palavra-chave w. Para cada registro do log, o investigador executa os passos abaixo: (a) Para cada c1 , o investigador tenta decifrar usando a chave privada IBE, se o prefixo do resultado é semelhante a flag, então o investigador extrai K , caso contrário partirá para o próximo registro; (b) Se um dos resultados ser semelhante a flag, então, é computado K para decifrar EK (m) para obter m . 67 8 IMPLEMENTAÇÃO BUSCA EM BANCO CIFRADO Neste capítulo, serão apresentados os principais passos para o desenvolvimento do esquema de Boneh e Franklin utilizando disponibilidade temporal e uma aplicação de busca de palavra em banco de dados cifrados utilizando IBE. Todos os passos utilizados no desenvolvimento, desde materiais pesquisados, preparação do ambiente, diagramação do desenvolvimento, problemas encontrados no desenvolvimento e a correção dos problemas estão apresentados neste capítulo. 8.1 LINGUAGEM, AMBIENTE E FERRAMENTAS DISPONÍVEIS PARA CURVAS ELÍPTICAS E IBE Para o desenvolvimento proposto foi utilizado a linguagem de programação orientada a objetos Java. A escolha por se optar por esta linguagem de programação, já que existem tantas outras linguagens com maior disponibilidade de material referente a criptografia como por exemplo ’C’, foi pela escassez de materiais e escassez de desenvolvimentos nesta linguagem, em que por outro lado, existem vários exemplos e casos de sucesso de desenvolvimento de ferramentas de criptografia utilizando linguagens de programação ’C’. Um exemplo disto é o o projeto conhecido como Multiprecision Integer and Rational Arithmetic C/C++ Library (MIRACL). O projeto MIRACL disponibiliza uma biblioteca onde se tem disponível uma série de rotinas necessárias para implementação de esquemas criptográficos, como cálculo de curvas elípticas entre outras funções. Outro ponto positivo para a escolha do Java como linguagem de programação foi o conhecimento técnico e a experiência profissional já adquiridas em outros projetos. No desenvolvimento proposto foi estudado os artigos relacionados aos esquemas criptográficos que utilizam IBE, tais como o esquema criptográfico IBE proposto por Boneh Franklin, o esquema criptográfico IBE proposto por Waters e o esquema criptográficos IBE proposto por Naccache. Além do próprio artigo proposto por Waters onde é apresentado a proposta de desenvolvimento de pesquisa de palavra em um banco de dados criptografado, conforme apresentado no Capítulo 7. O artigo do Boneh Franklin foi bastante utilizado sendo que a busca por palavra em banco de dados cifrados proposto por Waters em seu artigo se baseia na implementação do esquema criptográfico IBE proposto por Boneh e Franklin conhecida como BasicIdent. 68 8.1.1 Java Em Dezembro de 1990 a Sun Microsystem iniciou o desenvolvimento do projeto Green Project que é conhecido como o ’berço’ do Java, os principais membros deste projeto eram Patrick Naughton, Mike Sheridan e James Gosling (JAVA, 2007). O objetivo do projeto não era o desenvolvimento de uma nova linguagem de programação mas sim planejar e antecipar o futuro, onde eles acreditavam numa convergência entre dispositivos domésticos e computadores (JAVA, 2007). Uma das principais características do projeto era Write Once, Run AnyWhere, que significa, ’escreva uma vez, rode em qualquer lugar’, característica diretamente ligada a idéia da convergência entre dispositivos domésticos e computadores. Em 1992, a equipe finalizou o primeiro protótipo do projeto, onde o mesmo se chamava StarSeven (*7), o mesmo era um controle remoto numa tela touchscreen 1 , o projeto *7 tinha um mascote que hoje em dia é conhecido no mundo Java como Duke (SUN, 2007). James Gosling especificou uma nova linguagem de programação para o protótipo *7, e o batizou de Oak, que significa ’carvalho’. O objetivo da equipe era achar mercado para o *7. Como ainda era cedo demais para esse tipo de tecnologia o projeto acabou se inviabilizando (SUN, 2007). Em Julho de 1994, Bill Joy iniciou o projeto Liveoak com objetivo inicial de construir um pequeno grande sistema operacional. Em Julho de 1994, o projeto conseguiu um espaço, onde Naughton pegou a idéia de colocar o Liveoak para trabalhar na internet enquanto escrevia um navegador de internet no seu longo final de semana. Este foi o marco inicial do Java (FEIZABADI, 2007). Desde 1995, a Netscape Corporations incorporou o suporte do Java no seu navegador. Esse foi o triunfo do Java, sendo que ele tinha sido suportado pelo navegador de internet mais popular do mundo. Mais tarde a Microsoft também suportou o Java no seu navegador (FEIZABADI, 2007). Hoje em dia, o Java esta presente em navegadores de Internet, mainframes, em sis- temas operacionais, celulares, palmtops, cartões inteligentes e entre outros dispositivos. 1 interatividade utilizando a toques diretamente na tela e não a partir de periférico de entrada como mouse ou teclado 69 8.1.2 Arquitetura de Criptografia Java (Java Cryptography Architecture - JCA) Esta é a API designada para permitir que desenvolvedores incorporem segurança de baixo e alto nível em seus programas. O primeiro lançamento da API de segurança no JDK 1.1 foi chamada de Java Cryptography Architeture (JCA). Esta também atualizada para suportar gerenciamento de certificados, como o X.509 v3, e introduziu a nova arquitetura de segurança Java para granulamento fino, configurável, flexível e expansível. O Java Cryptography Extension (JCE) extende a API JCA para incluir APIs para criptografia, geração de chaves, acordo de chaves e mensagens de código de autenticação (MAC). O suporte a criptografia inclui criptografia assimétrica, simétrica, criptografia por bloco e cifradores constantes. Anteriormente nas versões do Java SDK 1.2 e .1.3 a API JCE era uma extensão, agora no Java SDK 1.4 ela foi integrada no SDK. 8.1.3 API de persistência em Java (Java Persistence API - JPA) Java Persistence API, ou API de persistência em Java está disponível a partir do Java 1.5 (SUN, 2006). JPA é a primeira API de persistência em Java, sendo que ela é uma junção do projeto Hibernate (framework de persistência disponível em Java) com EJB 2.1 (framework de persistência e de computação distribuída em Java) (SUN, 2006). A unificação dos dois projetos gerou o que conhecemos hoje em dia como JPA, o mesmo foi utilizado no projeto como API de persistência, e foi usado para salvar, deletar e efetuar busca de palavra no banco de dados cifrados (SUN, 2006). 8.1.4 Invocação de métodos remotos (Remote Method Invocation - RMI) Remote Method Invocation ou Invocação de métodos remotos é uma das abordagens da tecnologia Java para prover as funcionalidades de uma plataforma de objetos distribuídos. Esse sistema de objetos distribuídos faz parte do núcleo básico do Java desde a versão JDK 1.1 (RICARTE, 2002). Por meio da utilização da arquitetura RMI, é possível que um objeto ativo em uma máquina virtual Java possa interagir com objetos de outras máquinas virtuais Java, independentemente da localização dessas máquinas virtuais (RICARTE, 2002). 70 RMI foi utilizado no desenvolvimento do esquema de Boneh e Franklin na utilização do servidor PKG e dos clientes. Todos os clientes se conectam ao servidor PKG e utilizam o objeto de criptografia remotamente através do protocolo RMI. 8.1.5 Prevayler O Prevayler é um projeto livre que efetua a persistência de objetos em Java. Com ele não é necessário a utilização de banco de dados, sendo que o Prevayler é quem serializa os objetos e armazena eles em arquivos (PREVAYLER, 2006). O conceito do Prevayler baseia-se no conceito de banco de dados orientado a objetos, sendo assim não é um banco de dados relacional, então aplicações que utilizam-se do Prevayler não terão comandos SQL na sua implementação (PREVAYLER, 2006). Todas as consultas são feitas por meio dos métodos de acessos da classe, sendo que caso o seu sistema seja mal diagramado, poderá ter problemas em acessar os dados (PREVAYLER, 2006). Pelo Prevayler ter essa característica de não utilizar comandos SQL, muitas empresas têm medo de utilizá-lo em projetos grandes. O sucesso de um projeto utilizando Prevayler depende da diagramação das classes e da forma de acesso dos dados. O Prevayler foi utilizado no projeto no desenvolvimento do banco de dados cifrados. Como o servidor PKG sempre sorteia novos valores para sua chave privada, o objeto de criptografia é serializado e assim toda vez que a aplicação é iniciada o objeto é des-serializado, restaurando sua configuração e mantendo a mesma chave privada do servidor PKG. 8.1.6 Eclipse Elipse é um ambiente de desenvolvimento que pode ser utilizado para diversas lingua- gens de programação, tais como C, C++, Java, Progress, PHP entre outras. O Eclipse é distribuído de forma livre, o que o faz ser o um dos ambientes de desenvolvimento em Java mais difundido e mais utilizado no mundo. Por ele ser tão difundindo, o transforma num dos melhores IDE2 para se utilizar com Java, isso também o faz ter vários plug-ins 3 para agilizar o desenvolvimento. 2 3 IDE - Integrated Development Environment (ambiente integrado para desenvolvimento de software) Mini aplicativos adicionais, afim de facilitar e agilizar o processo de desenvolvimento 71 O Eclipse foi utilizado no desenvolvimento dos dois programas e foi utilizado como ambiente de desenvolvimento padrão deste projeto. Figura 25: Eclipse utilizado no desenvolvimento. Fonte: O Autor. 8.2 PRÉ-REQUISITOS PARA O DESENVOLVIMENTO Os pré-requisitos necessários são os seguintes: I. Conhecimento em Java: é imprescindível possuir conhecimento básico em todas as tecnologias levantadas nos itens anteriores; II. Ambiente Java: é importante possuir o ambiente de desenvolvimento acima utilizado, no caso o Eclipse, mas não se faz obrigatório. Para o desenvolvimento basta utilizar apenas um editor de textos simples, como por exemplo o bloco de notas do windows; III. Conhecimento em IBE: conhecer os esquemas criptográficos IBE envolvidos no desenvolvimento, no caso o esquema IBE do Boneh e Franklin e conhecimentos relatados no artigo proposto por Waters (WATERS et al., 2004). Sem os conhecimentos acima o projeto proposto não poderá ser desenvolvido. 8.3 IMPLEMENTAÇÃO DE DISPONIBILIDADE TEMPORAL NO ESQUEMA DE BONEH FRAKLIN No Capítulo 6 foi demonstrado a utilização do desenvolvimento e explicado como internamente a aplicação faz para a utilização da disponibilidade temporal no esquema IBE. 72 Figura 26: Diagrama do esquema Boneh Franklin com disponibilidade. Fonte: O Autor. A Figura 26 simplifica o funcionamento do sistema, quando Alice deseja enviar uma mensagem para Bob com disponibilidade temporal para o mês atual. Inicialmente, Alice envia para o PKG a mensagem, para a mesma ser criptografada, juntamente com a mensagem Alice envia a chave pública e o tipo de disponibilidade que deverá ser aplicado para que a mensagem possa ser cifrada. Em posse dessas informações o servidor PKG cifra a mensagem e retorna a mesma para Alice. Após Alice receber a mensagem cifrada do PKG envia a mesma para Bob, informando juntamente com a mensagem que a disponibilidade temporal dela é mensal. Com a mensagem cifrada, Bob envia a mensagem juntamente com a disponibilidade para o PKG informando a sua identidade. Nesse momento o servidor PKG valida a identidade de Bob para ter certeza que o Bob é realmente o Bob, após isso decifra a mensagem e retorna a mensagem decifrada para o Bob. A comunicação entre os clientes e o PKG acontecem por intermédio do protocolo RMI. Com o funcionamento acima foi implementado a utilização da disponibilidade temporal no esquema IBE do Boneh Franklin. Para o desenvolvimento acima foi utilizado a biblioteca IBE fornecida pela Universidade Maynooth da Irlanda. A biblioteca utilizada é integrada com a API JCA do Java. 73 8.3.1 Dificuldades Encontradas Durante o processo de desenvolvimento do esquema IBE do Boneh Franklin com dispo- nibilidade tiveram os seguintes problemas: I. Pela biblioteca fornecida ser integrada com a API de criptografia do Java, houve alguns contra tempo para a utilização, sendo que para isso foi necessário baixar o JCE Unlimited Strength Jurisdiction Policy Files para deixar de gerar o erro Illegal key size na execução da aplicação. Os arquivos baixados nesta foram atualizados no JRE 4 do SDK 5 do Java. II. Dificuldade em localizar ponto onde indicava o tamanho máximo do número primo gerado. Com a diminuição do tamanho máximo do número primo gerado diminuiu-se também a segurança do sistema, mas a nível de testes da aplicação levava-se muito tempo em testes. 8.4 IMPLEMENTAÇÃO DA BUSCA DE PALAVRA EM BANCO DE DADOS CIFRADOS O desenvolvimento da aplicação que efetua busca de palavra em banco de dados cifrados foi baseado no artigo de Waters (WATERS et al., 2004). O artigo foi discutido em detalhes no Capítulo 7. O sistema desenvolvido é bem simples, em que o principal objetivo dele é exemplificar a utilização do esquema e mostrar os benefícios na utilização dele. No projeto foi utilizado somente duas tabelas, que elas são definidas conforme o modelo de entidade e relacionamento da Figura 27. Figura 27: Implementação de busca de palavra em banco de dados cifrados - Modelo de entidades e relacionamento. Fonte: O Autor. No modelo apresentado na Figura 27, nota-se que as informações persistidas para o record são: 4 Java Runtime Engine, máquina virtual do Java Software Development Kit, kit de desenvolvimento do Java, necessário para o desenvolvimento de programas Java 5 74 I. id: Código primário para o registro; II. data: Informação guardada cifrada usando criptografia simétrica, no caso AES, o dado inserido informado pelo usuário; III. date: Data da inserção do registro; IV. user: Usuário que efetuou a inserção, utilizado como filtro na busca. Para a tabela keyword as informações persistidas são as seguintes: I. id: Código primário para a palavra-chave; II. record id: Código primário do registro a qual esta palavra-chave representa; III. word: Palavra-chave cifrada utilizando criptografia assimétrica IBE, a identidade utilizada é a mesma palavra; IV. keyCripto: Chave secreta utilizada para cifrar o registro (record), a chave secreta é guardada criptografada utilizando criptografia simétrica IBE, a identidade utilizada é a palavra-chave (word). Pelos motivos levantados no capítulo 2, se decidiu utilizar a criptografia simétrica AES. O objetivo da aplicação desenvolvida é a garantia da privacidade dos dados, sendo assim somente quem realmente souber da existência da palavra poderá buscá-la. A tela principal da aplicação desenvolvida é conforme a Figura 28. Nesta tela pode ser observado na tabela da direita todas as atividades pendentes, que podem ser inserções ou buscas . Na parte da esquerda do programa temos um filtro para a realização de buscas, assim que ordenado efetuar uma busca clicando no botão O o sistema irá adicionar esta ordem de busca na lista de tarefas e a mesma irá aparecer na tabela da direita. Após a busca ter sido efetuada, será alimentado a tabela do lado esquerdo da tela. As atividades de inserção e de busca na aplicação são enfileiradas, este enfileiramento é feito por causa do tempo de processamento para finalizar as atividades pode ser alto, essas atividades podem ser demoradas pois elas dependem de alguns fatores conforme abaixo: 75 Figura 28: Implementação de busca de palavra em banco de dados cifrados - Tela principal. Fonte: O Autor. I. Inserção: pode variar o tempo dependendo do tamanho da informação a ser inserida. Como toda palavra com mais de quatro caracteres é considerado uma palavra-chave, caso a informação inserida contenha muitas palavras chaves o sistema irá demorar muito tempo na geração da criptografia IBE de cada palavra. II. Busca: caso a base de dados contenha muitos dados o sistema irá demorar muito para efetuar a busca na base inteira. Na medida que a busca é efetuada, os dados na tabela chamada de ’Resultados Busca’ serão alimentados, mas para a busca finalizar por completo pode-se levar alguns minutos dependendo do tamanho da base de dados. O processo de inserção de dados é feito clicando no botão ’Inserir’ na tela principal, após clicado, uma tela, conforme a Figura 29, será aberta. Figura 29: Implementação de busca de palavra em banco de dados cifrados - Tela de inserção de dados. Fonte: O Autor. 76 Na tela apresentada na Figura 29 deverá ser digitado a informação que será inserida e o usuário que está inserindo. Após clicado no botão ’OK’, o sistema irá efetuar o processo de inserção. O processo de inserção efetua os passos conforme demonstra a Figura 30. Figura 30: Implementação de busca de palavra em banco de dados cifrados - Diagrama de seqüência - Operação inserir. Fonte: O Autor. A Figura 30 exemplifica o processo de inserção. O primeiro processo a ser executado é a geração da chave secreta, representado pelo processo 1.1 e é utilizada pela criptografia simétrica. Após o processo 1.2 é executado, neste processo os dados inseridos na Figura 29 no campo ’Informação’ serão cifrados utilizando a chave secreta gerada no processo 1.1. Após estes dois processos o registro record já está pronto para ser inserido. O próximo passo a ser executado é cifrar cada palavra-chave utilizando a própria palavra-chave como chave pública (identidade), este processo é representado pelo passo 1.3. O último processo executado é o processo 1.4, onde juntamente com cada palavra-chave é guardado a chave secreta da criptografia simétrica, esta chave é guardada criptografada pelo esquema IBE, a chave pública utilizada é a mesma utilizada para cifrar a palavra. O próximo passo no sistema é efetuar buscas. Para efetuar buscas deverá ser preenchido, no mínimo, o campo ’Palavra Chave’ na tela da Figura 28. O processo de busca de palavras esta exemplificado na Figura 31 77 Figura 31: Implementação de busca de palavra em banco de dados cifrados - Diagrama de seqüência - Operação buscar. Fonte: O Autor. A Figura 31 exemplifica o processo de busca em um banco de dados cifrados. O primeiro processo a ser executado é o 1.1, onde é efetuado a busca de todas as palavras chaves, no processo 1.2 tenta-se decifrar cada palavra-chave buscada do banco de dados utilizando a palavra que está sendo buscada como chave pública (identidade). Caso a palavra resultante da decifragem da palavra chave resgatada do banco de dados seja igual a palavra-chave fornecida na busca, então parte-se para o item 1.3, caso contrário o próximo registro é tentado. No processo 1.3 decifra a chave secreta da criptografia simétrica utilizando a palavra buscada como chave pública. Com a chave secreta em mãos, os dados do registro é decifrado. Após estes processos é retornado o registro para a interface do usuário. Na Figura 32 e Figura 33 percebe-se através de uma busca diretamente no banco de dados que as informações inseridas são possíveis de ser compreendidas somente pela utilização da interface de busca. 78 Figura 32: Implementação de busca de palavra em banco de dados cifrados - Busca diretamente na base de dados - Tabela de Keyword. Fonte: O Autor. Figura 33: Implementação de busca de palavra em banco de dados cifrados - Busca diretamente na base de dados - Tabela de Record. Fonte: O Autor. 79 Figura 34: Implementação de busca de palavra em banco de dados cifrados - Lista de tarefas. Fonte: O Autor. Figura 35: Implementação de busca de palavra em banco de dados cifrados - Resultado busca. Fonte: O Autor. 80 8.4.1 Dificuldades Encontradas Durante o processo de desenvolvimento, teve-se as seguintes dificuldades: I. Pela biblioteca fornecida ser integrada com a API de criptografia do Java, houve algum contra tempo para a utilização, sendo que para isso foi necessário baixar o JCE Unlimited Strength Jurisdiction Policy Files para deixar de gerar o erro Illegal key size na execução da aplicação. Os arquivos baixados nesta foram atualizados no JRE do SDK do Java. II. Dificuldade em localizar ponto onde indicava o tamanho máximo do número primo gerado. Com a diminuição do tamanho máximo do número primo gerado diminuiu-se também a segurança do sistema, mas a nível de testes da aplicação levava-se muito tempo em testes. III. Dificuldade em estabilizar a aplicação no quesito de restaurar a chave da criptografia simétrica, onde após a utilização de algumas vezes da busca a aplicação gera erros de recuperação da chave simétrica. IV. Dificuldade em trabalhar com o Prevayler sob os objetos desenvolvidos pela Universidade da Irlanda, pois os mesmos objetos não implementavam a interface necessário para a utilização de serialização de objetos, para a correção deste problema os objetos da Universidade da Irlanda foram descompilados e foi alterado as classes necessárias para serem serializados. Esta alteração fez perder a assinatura da biblioteca chamada por ’blitz-dev.jar’. A aplicação não chegou a ter uma versão final estável com a utilização do Prevayler. 81 9 CONCLUSÕES A criptografia é um método muito antigo para esconder mensagens e, atualmente, é utilizada para manter seguro o conteúdo de informações sigilosas. Com a expansão da Internet, está ficando cada vez mais comum utilizá-la para compras on-line, consulta de dados nos bancos, entre outros serviços. Juntamente com a expansão da Internet, precisa-se garantir que as informações trafegadas por ela sejam seguras, e garantir que somente as devidas pessoas fiquem de posse de tais informações sigilosas. A assinatura digital é uma das formas para garantir a autenticidade dos dados, utilizando um esquema criptográfico a troca de informações pode ser segura, sem que o remetente nege a autoria dos dados. O problema na utilização de assinaturas digitais é o custo elevado. Por esse motivo, foi desenvolvido outra forma de garantir a autenticidade dos dados na troca de mensagens, à criptografia baseada em identidade, onde a identidade é a chave pública na criptografia e pode ser o RG, CPF ou alguma outra informação que identifique a pessoa. A implementação de aplicabilidade do esquema de Boneh Franklin foi apresentada no ’8th International Symposium on Systems and Information Security’ que foi realizado no Instituto Tecnológico de Aeronáutica (ITA) no dia 10 de Novembro de 2006, onde teve boa aceitação dentre todos os presentes. Antes mesmo de totalmente concluído o trabalho, ele já estava contribuindo para a criptográfica. A integra do minicurso apresentado encontra-se em (MISAGHI, 2006). A implementação da aplicabilidade de busca de palavra em banco de dados cifrados não foi apresentado no mesmo congresso pois ainda estava em período de desenvolvimento. Com o desenvolvimento do trabalho, alcançou-se a compreenção dos conceitos referentes a criptografia simétrica, assimétrica, a compreenção dos modelos criptográficos baseados em identidade proposto por Boneh Franklin (BasicIdent). Após estudos e vários testes foi possivel também compreender os conceitos levantados por Waters referente a busca de palavra cifrada em banco de dados, após a compreenção destes conceitos foi levantado outros autores que também elaboraram trabalhos referente a busca de palavras cifrada. Após esses passos foi iniciado o desenvolvimento do esquema proposto por Boneh Franklin com a utilização da disponibilidade temporal, depois de algumas dificuldades levantadas no capítulo do desenvolvimento a implementação foi concluida. No desenvolvimento de busca de palavra em banco de dados cifrados teve-se alguns problemas maiores, onde o mesmo apresenta algumas instabilidades. 82 Os pontos que contribuiram para que os resultados iniciais não fossem alcançados são a dificuldade em compreender os sistemas criptográficos baseados em identidade, sendo que este envolve muitas operações matemáticas. A escassez de explicações sobre as implementações, esses dois pontos contribuiram, sendo que foi gasto bastante tempo nesses itens. Outro ponto que contribuiu foi o processo de recuperar a chave utilizada na criptografia simétrica, onde a mesma, às vezes, apresenta erro e a chave não consegue efetuar o processo de descriptografia dos dados. Como sugestão para trabalhos futuros lista-se os itens a seguir: I. Implementar os esquemas de Waters e Naccache; II. Alteração do desenvolvimento de disponibilidade temporal para poder escolher o esquema que deseja-se escolher, podendo ser entre o esquema de Boneh Franklin, o esquema de Waters e o esquema de Naccache; III. Implementação dos itens levantados por outros autores referente a busca cifrada, onde pode-se levantar os seguintes: busca com múltiplas palavras chaves, busca com palavras chaves temporárias (PETKS). IV. Submissão do trabalho intitulado Identity Based Searchable Encrypted Data Fundamentals1 ainda em fase de desenvolvimento que será submetido para o evento ’SecSE 2007 1st International Workshop on Secure Software Engineering que acontecerá em Vienna na Austria no período de 10 à 13 de Abril de 2007. O artigo será submetido até 17 de Dezembro de 2006. V. Submissão do trabalho intitulado Identity Based Searchable Encrypted Data Environment2 ainda em fase de desenvolvimento que será submetido para o evento ıACNS 2007 5th International Conference on Applied Cryptography and Network Security que acontecerá em Zhuhai na China no período de 5 à 8 de Junho de 2007. O artigo será submetido até o dia 14 de Dezembro de 2006. 1 2 Site do evento: http://www.ares-conference.eu/conf/ Site do evento: http://www.i2r.a-star.edu.sg/icsd/acns2007/ 83 REFERÊNCIAS ABDALLA, M. et al. Searchable Encryption Revisited: Consistency Properties, Relation to Anonymous IBE, and Extensions. Arquivo: Cryptology ePrint Archive. 2005. ABSOLUTA, V. Histórias e Aplicações da Criptografia. 1999. Disponível em: <http://www.absoluta.org/cripty/cripty_h.htm>. Acesso em: 30 jun. 2006. BAEK, J. et al. A Survey of Identity-Based Cryptography. 2004. AUUG 2004. Disponível em: <http://jan.netcomp.monash.edu.au/publications/>. Acesso em: 05 abr. 2006. BARBOSA, J. C. Criptografia de chave pública baseada em curvas elípticas. Criptografia de chave pública baseada em curvas elípticas. Rio de Janeiro: UFRJ, 2003. BENITS, W. D. Sistemas criptográficos baseados em identidades pessoais. Sistemas criptográficos baseados em identidades pessoais. São Paulo: [s.n.], 2003. BONEH, D.; BOYEN, X. Efficient selective-ID secure identity based encryption without random oracles. Advances in Cryptology - EUROCRYPT. Berlin: Springer-Verlag, 2004. p. 223–238. BONEH, D.; BOYEN, X.; GOH, E.-J. Hierarchical Identity Based Encryption with Constant Size Ciphertext. Arquivo: Cryptology ePrint Archive. 2005. BONEH, D.; FRANKLIN, M. K. Identity-based encryption from the weil pairing. Advances in Cryptology - CRYPTO. London: Springer-Verlag, 2001. p. 213–229. ISBN 3-540-42456-3. CHA, J. C.; CHEON, J. H. An identity-based signature from gap diffie-hellman groups. Proceedings of the 6th International Workshop on Theory and Practice in Public Key Cryptography. London: Springer-Verlag, 2003. p. 18–30. ISBN 3-540-00324-X. COCKS, C. An identity based encryption scheme based on quadratic residues. Proceedings of the 8th IMA International Conference on Cryptography and Coding. London: Springer-Verlag, 2001. p. 360–363. ISBN 3-540-43026-1. COUTINHO, S. C. Números Inteiros e Criptografia RSA. 2. ed. Rio de Janeiro: Sociedade Brasileira de Matemática, 2000. DIFFIE, W.; HELLMAN, M. E. New directions in cryptography. IEEE Transactions on Information Theory, IT-22, n. 6, p. 644–654, 1976. EBERLE, H. et al. A public-key cryptographic processor for rsa and ecc. Shreyas Sundaram, University of Waterloo, 2004. FEIZABADI, S. History of Java. 2007. Java. Disponível em: <http://ei.cs.vt.edu/~wwwbtb/book/chap1/java_hist.html>. Acesso em: 01 jan. 2007. FORD, S. AES: Question and Answers. 2000. Disponível em: <http://www.nist.gov/public_affairs/releases/aesq&a.htm>. Acesso em: 26 nov. 2006. 84 GOLLE, P.; WAGNER, D. Cryptanalysis of a Cognitive Authentication Scheme. Arquivo: Cryptology ePrint Archive. 2006. GUPTA, V. et al. Performance analysis of elliptic curve cryptography for ssl. Proceedings of the 3rd ACM workshop on Wireless security. New York: ACM Press, 2002. p. 87–94. ISBN 1-58113-585-8. HANKERSON, D.; MENEZES, A.; VANSTONE, S. Guide to Elliptic Curve Cryptography. Secaucus: Springer, 2003. ISBN 0-387-95273-X. INFORMÁTICA, P. de. Portal de Informática. 2006. Disponível em: <http://www.portaldeinformatica.com.br/artigos_ssl.htm>. Acesso em: 03 out. 2006. JAVA, T. A Brief History of the Green Project. 2007. Java. Disponível em: <http://today.java.net/jag/old/green/>. Acesso em: 01 jan. 2007. KAHN, D. The code-breakers: The story of secret writing. The Code-Breakers: The story of secret writing. New York: Macmillan Publishing Company, 1967. KAK, A. Finite Fields, Theoretical Underpinnings of AES and ECC. 2006. Disponível em: <http://cobweb.ecn.purdue.edu/~kak/courses-i-teach/compsec/Lecture/ Lecture_4_2.pdf>. Acesso em: 15 out. 2006. KAWAHARA, Y.; TAKAGI, T.; OKAMOTO, E. Efficient Implementation of Tate Pairing on a Mobile Phone using Java. Arquivo: Cryptology ePrint Archive. 2006. KOBLITZ, N.; MENEZES, A. Pairing-Based Cryptography at High Security Levels. Arquivo: Cryptology ePrint Archive. 2005. LOPES, F. C. de O. Denúncia anônima segura. Florianópolis: [s.n.], 2003. MAIA, L. P.; PAGLIUSI, P. S. Criptografia e Certificação. 1999. Disponível em: <http://www.training.com.br/lpmaia/pub_seg_cripto.htm>. Acesso em: 01 out. 2006. MISAGHI, M. Criptografia baseado em identiadade. Proceedings of the 8th International Symposium on Systems and Information Security. São José dos Campos: ITA, 2006. ISBN 3-540-43026-1. MORIMOTO, C. E. Guia do Hardware. 2006. Disponível em: <http://www.guiadohardware.net/guias/10/printall.php>. Acesso em: 03 out. 2006. NACCACHE, D. Secure and Practical Identity-Based Encryption. Arquivo: Cryptology ePrint Archive. 2005. NIST. SHS Validated Implementations. 2006. Disponível em: <http://csrc.nist.gov/cryptval/shs/shaval.htm>. Acesso em: 13 ago. 2006. 85 OHTAKI, Y. Constructing a searchable encrypted log using encrypted inverted indexes. International Conference on Cyberworlds. Washington: IEEE Computer Society, 2005. p. 130–138. ISBN 0-7695-2378-1. OPENBSD. Criptografia no OpenBSD. 2006. Disponível em: <http://www.openbsd.org/pt/crypto.html>. Acesso em: 03 out. 2006. PREVAYLER. Prevayler. 2006. Disponível em: <http://www.prevayler.org/index.pr>. Acesso em: 15 out. 2006. RFC. rfc 4492. 2006. Disponível em: <http://tools.ietf.org/html/rfc4492>. Acesso em: 08 out. 2006. RICARTE, I. L. M. Programação Orientada a objetos: Java RMI. 2002. Disponível em: <http://www.dca.fee.unicamp.br/cursos/PooJava/objdist/javarmi.html>. Acesso em: 10 nov. 2006. RIVEST, R. et al. The rc6 block cipher. San Mateo, USA, 2004. http://theory.lcs.mit. edu/~rivest/rc6.pdf. SAEKI, M. Elliptic curve cryptosystems. Elliptic Curve Cryptosystems. McGill University, Montreal: [s.n.], 1997. SECURITY, V. Secure Encrypted Email. 2006. Disponível em: <http://www.voltage.com/products/securemail.htm>. Acesso em: 10 out. 2006. SOEKRIS. Soekris Engineering. 2006. Disponível em: <http://www.soekris.com/>. Acesso em: 03 out. 2006. STALLINGS, W. Cryptography and Network Security. 2. ed. New Jersey: Prentice Hall, 2005. SUN. Java Persistence API FAQ. 2006. Disponível em: <http://java.sun.com/javaee/overview/faq/persistence.jsp>. Acesso em: 10 nov. 2006. SUN. Java Technology: The early years. 2007. Java. Disponível em: <http://java.sun.com/features/1998/05/birthday.html>. Acesso em: 01 jan. 2007. TKOTZ, V. Criptografia. 2003. Disponível em: <http://www.numaboa.com.br/criptologia/criptografia.php>. Acesso em: 30 jul. 2006. TKOTZ, V. A Linha do Tempo da Criptografia na Antiguidade. 2004. Disponível em: <http://www.numaboa.com.br/criptologia/historia/antiga.php>. Acesso em: 04 ago. 2006. WATERS, B. Efficient identity-based encryption without random oracles. Advances in Cryptology - EUROCRYPT. [S.l.]: Springer-Verlag, 2005. p. 114–127. ISBN 3-540-25910-4. 86 WATERS, B. R. et al. Building an Encrypted and Searchable Audit Log. 2004. Internet Society. 87 ANEXOS ANEXO A Abaixo o código fonte da classe responsável em efetuar a criptografia baseada em identidade. A classe abaixo é utilizada nos dois projetos desenvolvidos. Listagem 9.1: Classe de Criptografia IBE 1 package b r . com . s o c i e s c . b s i . t c c . i b e . s e r v i c e ; 2 3 import j a v a . i o . IOException ; 4 import j a v a . i o . S e r i a l i z a b l e ; 5 import j a v a . i o . UnsupportedEncodingException ; 6 import j a v a . math . B i g I n t e g e r ; 7 import j a v a . s e c u r i t y . I n v a l i d A l g o r i t h m P a r a m e t e r E x c e p t i o n ; 8 import j a v a . s e c u r i t y . I n v a l i d K e y E x c e p t i o n ; 9 import j a v a . s e c u r i t y . KeyPair ; 10 import j a v a . s e c u r i t y . KeyPairGenerator ; 11 import j a v a . s e c u r i t y . MessageDigest ; 12 import j a v a . s e c u r i t y . NoSuchAlgorithmException ; 13 import j a v a . s e c u r i t y . P r i v a t e K e y ; 14 import j a v a . s e c u r i t y . P r o v i d e r ; 15 import j a v a . s e c u r i t y . PublicKey ; 16 import j a v a . s e c u r i t y . SecureRandom ; 17 import j a v a . s e c u r i t y . spec . AlgorithmParameterSpec ; 18 import j a v a . u t i l . HashMap ; 19 20 import j a v a x . c r y p t o . BadPaddingException ; 21 import j a v a x . c r y p t o . Cipher ; 22 import j a v a x . c r y p t o . I l l e g a l B l o c k S i z e E x c e p t i o n ; 23 import j a v a x . c r y p t o . NoSuchPaddingException ; 24 25 import nuim . cs . c r y p t o . b i l i n e a r . B i l i n e a r M a p ; 26 import nuim . cs . c r y p t o . b i l i n e a r . M o d i f i e d T a t e P a i r i n g ; 27 import nuim . cs . c r y p t o . i b e . IbeKeyParameters ; 28 import nuim . cs . c r y p t o . i b e . I b e P r o v i d e r ; 29 import nuim . cs . c r y p t o . i b e . I b e P u b l i c K e y ; 30 import nuim . cs . c r y p t o . i b e . IbeSystemParameters ; 31 import sun . misc . BASE64Decoder ; 32 import sun . misc . BASE64Encoder ; 33 34 35 36 37 public class IbeCryptographyBean implements I b e C r y p t o g r a p h y S e r v i c e , S e r i a l i z a b l e { public s t a t i c f i n a l i n t TAMANHO_NUMERO_PRIMO p r i v a t e B i g I n t e g e r masterKey p r i v a t e B i l i n e a r M a p map null ; = 70; = null ; = 89 38 private Provider provider = new I b e P r o v i d e r ( ) ; 39 p r i v a t e Cipher c i p h e r = null ; 40 p r i v a t e MessageDigest hash = null ; 41 p r i v a t e AlgorithmParameterSpec parametersSystem = n u l l ; 42 43 /∗∗ 44 ∗ C o n s t r u t o r e f e t u a o método SETUP 45 ∗/ 46 public IbeCryptographyBean ( ) { setup ( ) ; 47 48 } 49 50 /∗∗ 51 ∗ Retorna v a r i á v e i s do sistema 52 ∗/ 53 public HashMap< S t r i n g , S t r i n g > g e t I n f o r m a t i o n ( ) { HashMap< S t r i n g , S t r i n g > i n f o r m a t i o n s = new HashMap< S t r i n g , S t r i n g > ( ) 54 ; 55 56 i n f o r m a t i o n s . p u t ( "qValue" , t h i s . map . getQ ( ) . t o S t r i n g ( ) ) ; 57 i n f o r m a t i o n s . p u t ( "curve" , t h i s . map . getCurve ( ) . t o S t r i n g ( ) ) ; 58 i n f o r m a t i o n s . p u t ( "masterKey" , t h i s . masterKey . t o S t r i n g ( ) ) ; 59 i n f o r m a t i o n s . p u t ( "bitLengthPrime" , I n t e g e r . t o S t r i n g ( t h i s . TAMANHO_NUMERO_PRIMO) ) ; i n f o r m a t i o n s . p u t ( "hash" , t h i s . hash . t o S t r i n g ( ) ) ; 60 61 return i n f o r m a t i o n s ; 62 63 } 64 65 /∗∗ 66 ∗ D e s c r i p t o g r a f a um dado c r i p t o g r a f a d o usando o método e n c r y p t i o n 67 ∗ 68 ∗ @param t e x t 69 ∗ @param p r i v a t e K e y 70 ∗/ 71 72 73 public S t r i n g d e c r y p t i o n ( S t r i n g t e x t , P r i v a t e K e y p r i v a t e K e y ) { try { t h i s . c i p h e r . i n i t ( Cipher .DECRYPT_MODE, p r i v a t e K e y , t h i s . parametersSystem , new SecureRandom ( ) ) ; 74 } catch ( I n v a l i d K e y E x c e p t i o n e ) { 90 e . printStackTrace ( ) ; 75 } catch ( I n v a l i d A l g o r i t h m P a r a m e t e r E x c e p t i o n e ) { 76 e . printStackTrace ( ) ; 77 } 78 79 try { 80 r e t u r n new S t r i n g ( t h i s . c i p h e r . d o F i n a l (new BASE64Decoder ( ) . 81 decodeBuffer ( t e x t ) ) ) ; } catch ( I l l e g a l B l o c k S i z e E x c e p t i o n e ) { 82 e . printStackTrace ( ) ; 83 } catch ( BadPaddingException e ) { 84 e . printStackTrace ( ) ; 85 } catch ( UnsupportedEncodingException e ) { 86 e . printStackTrace ( ) ; 87 } catch ( IOException e ) { 88 e . printStackTrace ( ) ; 89 90 } 91 return null ; 92 } 93 94 /∗∗ 95 ∗ Overload do método d e c r y p t i o n ( S t r i n g t e x t , P r i v a t e K e y p r i v a t e K e y ) 96 ∗ 97 ∗ @param message 98 ∗ @param i d e n t i t y 99 ∗/ 100 public S t r i n g d e c r y p t i o n ( S t r i n g t e x t , S t r i n g i d e n t i t y ) { return this . decryption ( tex t , this . p r i v a t e K e y E x t r a c t i o n ( i d e n t i t y ) ) ; 101 102 } 103 104 /∗∗ 105 ∗ C r i p t o g r a f a uma mensagem 106 ∗ 107 ∗ @param t e x t 108 ∗ @param p u b l i c K e y 109 ∗/ 110 111 112 public S t r i n g e n c r y p t i o n ( S t r i n g t e x t , PublicKey p u b l i c K e y ) { try { t h i s . c i p h e r . i n i t ( Cipher .ENCRYPT_MODE, publicKey , t h i s . parametersSystem , new SecureRandom ( ) ) ; 113 114 115 } catch ( I n v a l i d K e y E x c e p t i o n e ) { e . printStackTrace ( ) ; } catch ( I n v a l i d A l g o r i t h m P a r a m e t e r E x c e p t i o n e ) { 91 e . printStackTrace ( ) ; 116 } 117 118 try { 119 r e t u r n new BASE64Encoder ( ) . encode ( ( t h i s . c i p h e r . d o F i n a l ( t e x t . 120 g e t B y t e s ( "UTF8" ) ) ) ) ; } catch ( I l l e g a l B l o c k S i z e E x c e p t i o n e ) { 121 e . printStackTrace ( ) ; 122 } catch ( BadPaddingException e ) { 123 e . printStackTrace ( ) ; 124 } catch ( IOException e ) { 125 e . printStackTrace ( ) ; 126 127 } 128 return null ; 129 } 130 131 /∗∗ 132 ∗ Overload do método e n c r y p t i o n ( S t r i n g t e x t , PublicKey p u b l i c K e y ) 133 ∗ 134 ∗ @param t e x t 135 ∗ @param i d e n t i t y 136 ∗/ 137 public S t r i n g e n c r y p t i o n ( S t r i n g t e x t , S t r i n g i d e n t i t y ) { return this . encryption ( tex t , this . publicKeyExtraction ( i d e n t i t y ) ) ; 138 139 } 140 141 /∗∗ 142 ∗ Retorna a chave p r i v a d a 143 ∗ 144 ∗ @param i d e n t i t y 145 ∗ @return P r i v a t e K e y 146 ∗/ 147 public P r i v a t e K e y p r i v a t e K e y E x t r a c t i o n ( S t r i n g i d e n t i t y ) { 148 KeyPairGenerator kpg 149 AlgorithmParameterSpec parametersKey 150 PrivateKey privateKey = null ; = null ; = null ; 151 152 parametersKey = new IbeKeyParameters ( t h i s . hash , i d e n t i t y , t h i s . masterKey , t h i s . map) ; 153 154 155 try { i f ( kpg == n u l l ) { 92 kpg = KeyPairGenerator . g e t I n s t a n c e ( I b e P r o v i d e r . IBE , 156 this . provider ) ; 157 } 158 kpg . i n i t i a l i z e ( parametersKey ) ; } catch ( I n v a l i d A l g o r i t h m P a r a m e t e r E x c e p t i o n e1 ) { 159 e1 . p r i n t S t a c k T r a c e ( ) ; 160 } catch ( NoSuchAlgorithmException e ) { 161 e . printStackTrace ( ) ; 162 } 163 164 165 KeyPair k e y P a i r = kpg . generateKeyPair ( ) ; 166 privateKey = keyPair . getPrivate ( ) ; 167 return privateKey ; 168 169 } 170 171 /∗∗ 172 ∗ Retorna a chave p u b l i c a 173 ∗ 174 ∗ @param i d e n t i t y 175 ∗ @return PublicKey 176 ∗/ 177 public PublicKey p u b l i c K e y E x t r a c t i o n ( S t r i n g i d e n t i t y ) { PublicKey p u b l i c K e y = new I b e P u b l i c K e y ( t h i s . hash . d i g e s t ( i d e n t i t y . 178 getBytes ( ) ) ) ; 179 return publicKey ; 180 181 } 182 183 184 /∗∗ ∗ I n i c i a l i z a o s e r v i d o r de c r i p t o g r a f i a , chamado após i n i c i a l i z a r a a p l i c a ç ã o de busca . 185 ∗ U t i l i z a d o após o p r e v a y l e r . 186 ∗/ 187 188 public Boolean i n i t i a l i z e ( ) { t h i s . p r o v i d e r = new I b e P r o v i d e r ( ) ; 189 190 191 try { t h i s . c i p h e r = Cipher . g e t I n s t a n c e ( I b e P r o v i d e r . IBE , t h i s . provider ) ; 192 193 194 t h i s . hash = MessageDigest . g e t I n s t a n c e ( "MD5" ) ; } catch ( NoSuchAlgorithmException e ) { e . printStackTrace ( ) ; 93 195 } catch ( NoSuchPaddingException e ) { 196 e . printStackTrace ( ) ; } 197 198 t h i s . parametersSystem 199 = new IbeSystemParameters ( t h i s . map , t h i s . hash , t h i s . masterKey ) ; 200 return true ; 201 202 } 203 204 /∗∗ 205 ∗ Método de setup 206 ∗/ 207 208 public Boolean setup ( ) { try { t h i s . c i p h e r = Cipher . g e t I n s t a n c e ( I b e P r o v i d e r . IBE , t h i s . 209 provider ) ; t h i s . hash = MessageDigest . g e t I n s t a n c e ( "MD5" ) ; 210 211 } catch ( NoSuchAlgorithmException e ) { 212 e . printStackTrace ( ) ; 213 } catch ( NoSuchPaddingException e ) { 214 e . printStackTrace ( ) ; 215 } 216 217 t h i s . map = new M o d i f i e d T a t e P a i r i n g ( IbeCryptographyBean . TAMANHO_NUMERO_PRIMO) ; 218 219 boolean f i e l d T o o S m a l l = f a l s e ; 220 do { 221 fieldTooSmall = false ; 222 B i g I n t e g e r maxPts = t h i s . map . getCurve ( ) . g e t F i e l d ( ) . getChar ( ) . d i v i d e ( t h i s . map . getCurve ( ) . getKappa ( ) ) ; 223 i n t b y t e s = maxPts . b i t L e n g t h ( ) / 8 ; 224 i f ( b y t e s < t h i s . hash . g e t D i g e s t L e n g t h ( ) ) { t h i s . map = new M o d i f i e d T a t e P a i r i n g ( 225 IbeCryptographyBean .TAMANHO_NUMERO_PRIMO) ; fieldTooSmall = true ; 226 227 228 } } while ( f i e l d T o o S m a l l ) ; 229 230 t h i s . masterKey = new B i g I n t e g e r ( t h i s . map . getQ ( ) . b i t L e n g t h ( ) − 1 , new SecureRandom ( ) ) ; 94 t h i s . parametersSystem 231 = new IbeSystemParameters ( t h i s . map , t h i s . hash , t h i s . masterKey ) ; 232 return true ; 233 } 234 235 236 } ANEXO B Abaixo o código fonte da classe responsável em efetuar a criptografia simétrica. A classe abaixo é utilizada somente no projeto de busca de palavra em banco de dados cifrados. Listagem 9.2: Classe de Criptografia IBE 1 package b r . com . s o c i e s c . b s i . t c c . i b e . s e r v i c e ; 2 3 import j a v a . i o . IOException ; 4 import j a v a . i o . UnsupportedEncodingException ; 5 import j a v a . s e c u r i t y . I n v a l i d K e y E x c e p t i o n ; 6 import j a v a . s e c u r i t y . NoSuchAlgorithmException ; 7 8 import j a v a x . c r y p t o . BadPaddingException ; 9 import j a v a x . c r y p t o . Cipher ; 10 import j a v a x . c r y p t o . I l l e g a l B l o c k S i z e E x c e p t i o n ; 11 import j a v a x . c r y p t o . KeyGenerator ; 12 import j a v a x . c r y p t o . NoSuchPaddingException ; 13 import j a v a x . c r y p t o . SecretKey ; 14 import j a v a x . c r y p t o . spec . SecretKeySpec ; 15 16 import sun . misc . BASE64Decoder ; 17 import sun . misc . BASE64Encoder ; 18 19 20 public class Sy me t r i c Cr yp t o gr af y B e an implements S y m e t r i c C r y p t o g r a f y S e r v i c e { p r i v a t e Cipher c i p h e r ; 21 22 p r i v a t e SecretKeySpec secretKeySpec ; 23 24 /∗∗ 25 ∗ C o n s t r u t o r i n i c i a r á o c i f r a d o r com a c r i p t o g r a f i a s i m é t r i c a AES 26 ∗/ 27 public S y m et ri c C r y pt og r a fy Be an ( ) { try { 28 c i p h e r = Cipher . g e t I n s t a n c e ( "AES" ) ; 29 } catch ( NoSuchAlgorithmException e ) { 30 31 e . printStackTrace ( ) ; 32 } catch ( NoSuchPaddingException e ) { 33 e . printStackTrace ( ) ; } 34 35 } 36 37 38 /∗∗ ∗ E f e t u a a c r i p t o g r a f i a do t e x t o passado como parâmetro 96 39 ∗ 40 ∗ @param t e x t 41 ∗ @return S t r i n g 42 ∗/ 43 public S t r i n g e n c r y p t i o n S y m e t r i c ( S t r i n g t e x t ) { try { 44 c i p h e r . i n i t ( Cipher .ENCRYPT_MODE, makeSymetricKey ( ) ) ; 45 } catch ( I n v a l i d K e y E x c e p t i o n e ) { 46 e . printStackTrace ( ) ; 47 } 48 49 try { 50 r e t u r n new BASE64Encoder ( ) . encode ( c i p h e r . d o F i n a l ( t e x t 51 . g e t B y t e s ( "UTF8" ) ) ) ; 52 } catch ( I l l e g a l B l o c k S i z e E x c e p t i o n e ) { 53 e . printStackTrace ( ) ; 54 } catch ( BadPaddingException e ) { 55 e . printStackTrace ( ) ; 56 } catch ( UnsupportedEncodingException e ) { 57 e . printStackTrace ( ) ; 58 59 } 60 return null ; 61 } 62 63 /∗∗ 64 ∗ Método para d e s c r i p t o g r a f a r um t e x t o c r i p t o g r a f a d o p e l o método e n c r y p t i o n 65 ∗ 66 ∗ @param t e x t 67 ∗ @return S t r i n g 68 ∗/ 69 70 public S t r i n g d e c r y p t i o n S y m e t r i c ( S t r i n g t e x t ) { try { c i p h e r . i n i t ( Cipher .DECRYPT_MODE, t h i s . secretKeySpec ) ; 71 72 } catch ( I n v a l i d K e y E x c e p t i o n e1 ) { e1 . p r i n t S t a c k T r a c e ( ) ; 73 74 } 75 76 77 78 79 80 81 try { r e t u r n new S t r i n g ( c i p h e r . d o F i n a l (new BASE64Decoder ( ) . decodeBuffer ( t e x t ) ) ) ; } catch ( I l l e g a l B l o c k S i z e E x c e p t i o n e ) { e . printStackTrace ( ) ; } catch ( BadPaddingException e ) { 97 e . printStackTrace ( ) ; 82 } catch ( IOException e ) { 83 e . printStackTrace ( ) ; 84 85 } 86 return null ; 87 } 88 89 /∗∗ 90 ∗ Gera a chave s i m é t r i c a 91 ∗ 92 ∗ @return secretKeySpec 93 ∗/ 94 p r i v a t e SecretKeySpec makeSymetricKey ( ) { 95 / / Get t h e KeyGenerator 96 KeyGenerator kgen = n u l l ; 97 try { kgen = KeyGenerator . g e t I n s t a n c e ( "AES" ) ; 98 } catch ( NoSuchAlgorithmException e1 ) { 99 e1 . p r i n t S t a c k T r a c e ( ) ; 100 101 } 102 kgen . i n i t ( 1 2 8 ) ; / / 192 and 256 b i t s may n o t be a v a i l a b l e 103 104 / / Generate t h e s e c r e t key specs . 105 SecretKey skey = kgen . generateKey ( ) ; 106 byte [ ] raw = skey . getEncoded ( ) ; 107 t h i s . secretKeySpec = new SecretKeySpec ( raw , "AES" ) ; 108 109 r e t u r n t h i s . secretKeySpec ; 110 111 } 112 113 /∗∗ 114 ∗ Retorna a chave s i m é t r i c a 115 ∗ 116 ∗ @return S t r i n g 117 ∗/ 118 public S t r i n g getSymetricKey ( ) { r e t u r n new BASE64Encoder ( ) . encode ( t h i s . secretKeySpec . getEncoded ( ) ) ; 119 120 } 121 122 /∗∗ 123 ∗ A t r i b u i uma chave s i m é t r i c a 124 ∗ 98 125 ∗ @param key 126 ∗/ public void setSymetricKey ( S t r i n g key ) { 127 try { 128 t h i s . secretKeySpec = new SecretKeySpec (new BASE64Decoder ( ) 129 . decodeBuffer ( key ) , "AES" ) ; 130 } catch ( IOException e ) { 131 e . printStackTrace ( ) ; 132 } 133 } 134 135 }