FABIANO REESE RIGHETTI O IMPACTO DO USO DA CRIPTOGRAFIA NO THROUGHPUT DE REDES LOCAIS: UM ESTUDO DE CASO USANDO O ALGORITMO TRIPLE-DES Monografia apresentada para obtenção do título de Bacharel em Ciência da Computação do Curso de Ciência da Computação da Faculdade de Ciências Aplicadas de Cascavel - FACIAP. Orientador: Prof. Fabio Alexandre Spanhol, MSc. CASCAVEL 2004 TERMO DE APROVAÇÃO FABIANO REESE RIGHETTI O IMPACTO DO USO DA CRIPTOGRAFIA NO THROUGHPUT DE REDES LOCAIS: UM ESTUDO DE CASO USANDO O ALGORITMO TRIPLE-DES Monografia aprovada como requisito parcial para obtenção do grau de Bacharel em Ciência da Computação da Faculdade de Ciências Aplicadas de Cascavel – FACIAP, pela Comissão formada pelos professores: Orientador: Prof. Fabio Alexandre Spanhol, MSc. Ciência da Computação, UNIPAN Prof.ª Sirlei Lourdes Bach, MSc. Ciência da Computação, UNIPAN Prof. Ivonei Freitas da Silva, MSc. Informática, UNIOESTE Cascavel, 17 de dezembro de 2004. ii “Software Livre, socialmente justo, economicamente viável e tecnologicamente sustentável” (Software Livre Brasil) iii SUMÁRIO 1 INTRODUÇÃO....................................................................................................................1 1.1 OBJETIVOS ........................................................................................................................ 1 1.2 MOTIVAÇÃO ..................................................................................................................... 2 2 CRIPTOGRAFIA ................................................................................................................ 3 2.1 HISTÓRIA........................................................................................................................... 3 2.1.1 Cifras por substituição ...................................................................................................... 4 2.1.2 Cifras por permutação ....................................................................................................... 5 2.2 TIPOS DE CHAVES ...........................................................................................................5 2.2.1 Algoritmos Simétricos ...................................................................................................... 6 2.2.2 Algoritmos Assimétricos................................................................................................... 8 3 ALGORITMO DES........................................................................................................... 11 3.1 DESCRIÇÃO..................................................................................................................... 12 3.2 ESTRUTURA DE FUNCIONAMENTO..........................................................................12 3.2.1 Obter 16 sub-chaves de 48 bits cada ............................................................................... 12 3.2.2 Obter blocos codificados de cada 64 bits da mensagem .................................................14 3.2.3 Decifração ....................................................................................................................... 19 3.2.4 Triple-DES ...................................................................................................................... 19 4 IMPLEMENTAÇÃO.........................................................................................................22 4.1 AMBIENTE DE SIMULAÇÃO........................................................................................ 22 4.2 SISTEMA GERADOR DE DATAGRAMAS CIFRADOS..............................................23 4.3 TESTES REALIZADOS ................................................................................................... 29 4.4 RESULTADOS ................................................................................................................. 31 5 CONCLUSÃO.................................................................................................................... 33 5.1 TRABALHOS FUTUROS ................................................................................................33 REFERÊNCIAS ..................................................................................................................... 34 APÊNDICE 1 .......................................................................................................................... 36 iv LISTA DE ACRÔNIMOS DED – Decrypt-Encrypt-Decrypt DES – Data Encryption Standard EDE – Encrypt-Decrypt-Encrypt IP – Internet Protocol TCP – Transmission Control Protocol v LISTA DE ILUSTRAÇÕES FIGURA 1: FUNCIONAMENTO DE ALGORITMOS DE CHAVES SIMÉTRICAS ................................. 7 FIGURA 2: FUNCIONAMENTO DE ALGORITMOS DE CHAVES ASSIMÉTRICAS ............................ 9 FIGURA 3: CICLO DES DE OBTENÇÃO DE 16 SUB-CHAVES DE 48 BITS........................................ 14 FIGURA 4: CICLO DES DE CODIFICAÇÃO DE BLOCOS DE MENSAGENS...................................... 18 FIGURA 5: FUNCIONAMENTO DO TRIPLE-DES COM DUAS CHAVES DE 56 BITS....................... 20 FIGURA 6: FUNCIONAMENTO DO TRIPLE-DES COM TRÊS CHAVES DE 56 BITS ........................ 21 FIGURA 7: AMBIENTE DE SIMULAÇÃO................................................................................................ 23 FIGURA 8: ESTRUTURA DO CABEÇALHO IP ....................................................................................... 23 FIGURA 9: ESTRUTURA DO CABEÇALHO TCP ................................................................................... 26 FIGURA 10: GRÁFICO CONFRONTANDO TOTAL DE DADOS RECEBIDOS...................................... 32 FIGURA 11: GRÁFICO CONFRONTANDO DADOS RECEBIDOS POR SEGUNDO ............................. 32 vi LISTA DE TABELAS TABELA 1: PERMUTAÇÃO PC-1 .............................................................................................................. 13 TABELA 2: NÚMERO DE ITERAÇÕES DO DESLOCAMENTO A ESQUERDA CIRCULAR ............. 13 TABELA 3: PERMUTAÇÃO PC-2 .............................................................................................................. 13 TABELA 4: PERMUTAÇÃO IP ................................................................................................................... 14 TABELA 5: EXPANSÃO E .......................................................................................................................... 15 TABELA 6: S-BOX S1................................................................................................................................... 15 TABELA 7: S-BOX S2................................................................................................................................... 15 TABELA 8: S-BOX S3................................................................................................................................... 16 TABELA 9: S-BOX S4................................................................................................................................... 16 TABELA 10: S-BOX S5 .................................................................................................................................. 16 TABELA 11: S-BOX S6 .................................................................................................................................. 16 TABELA 12: S-BOX S7 .................................................................................................................................. 16 TABELA 13: S-BOX S8 .................................................................................................................................. 16 TABELA 14: PERMUTAÇÃO P .................................................................................................................... 16 TABELA 15: PERMUTAÇÃO IP-1................................................................................................................. 17 vii LISTA DE QUADROS QUADRO 1: ROTINA QUE DEFINE O CABEÇALHO IP.......................................................................... 24 QUADRO 2: ROTINA QUE DEFINE O CABEÇALHO TCP ...................................................................... 26 QUADRO 3: ROTINA QUE DEFINE OS DATAGRAMA........................................................................... 28 QUADRO 4: OPÇÕES DISPONÍVEIS PARA O USUÁRIO........................................................................ 28 QUADRO 5: ROTINA UTILIZADA PARA CRIPTOGRAFAR .................................................................. 29 QUADRO 6: PARÂMETROS USADOS PARA GERAR DATAGRAMAS EM TEXTO PLANO............. 29 QUADRO 7: DATAGRAMA CAPTURADO PELO TCPDUMP EM TEXTO PLANO.............................. 30 QUADRO 8: PARÂMETROS USADOS PARA GERAR DATAGRAMAS CRIPTOGRAFADOS............ 30 QUADRO 9: DATAGRAMA CAPTURADO PELO TCPDUMP JÁ CRIPTOGRAFADO ......................... 30 QUADRO 10: VAZÃO DE REDE ALCANÇADA POR DATAGRAMAS EM TEXTO PLANO ................ 31 QUADRO 11: VAZÃO DE REDE ALCANÇADA POR DATAGRAMAS CRIPTOGRAFADOS ............... 31 viii RESUMO Este trabalho realiza uma análise comparativa entre o envio de dados não criptografados e dados criptografados em redes locais com o intuito de medir o impacto causado no throughput. O algoritmo de criptografia simétrica escolhido para esta análise foi o Triple-DES por se tratar de um algoritmo seguro, simples, amplamente utilizado e relativamente rápido. Foi adotado um ambiente de simulação utilizando-se de dois microcomputadores interligados através de uma rede 10/100 BaseT, um sistema para geração de datagramas em texto puro e criptografados desenvolvido na linguagem de programação C, ferramenta para análise do tráfego na rede (TCPDUMP) e o sistema operacional GNU/Linux. Os testes realizados buscaram simular um ambiente real sendo a rede isolada e todas as características dos computadores mantidas durante a geração dos dois tipos de datagramas. Com base nos resultados alcançados pode-se notar uma elevada diferença no volume de pacotes enviados nas duas formas, cerca de 60%. Ficando claro que por mais que o algoritmo seja simples e relativamente rápido o throughput é afetado, sendo de elevada importância fazer um estudo de qual algoritmo adotar em um projeto e analisar formas de aumentar a segurança sem degradar o desempenho do mesmo. ix 1 1 INTRODUÇÃO A crescente utilização de computadores interligados em rede para transmissão ou armazenamento de informações torna o fator de segurança essencial, precisando que em tais informações sejam garantidas sua integridade, origem e autenticidade. Sendo que todas as mensagens que trafegam na rede de computadores estão sujeitas a algum tipo de ataque ou violação, a solução é o emprego de técnicas que enfatizem manter o conteúdo dessas mensagens desconhecidas para quem não tiver autorização. Entre as várias técnicas de escrita secreta conhecida, a mais adequada à aplicação em computadores são as cifras. Uma cifra implica em um método, ou sistema, de escrita que é ilimitado no seu uso e pelo qual deve ser possível transformar qualquer mensagem, sem consideração sobre linguagem e tamanho, para uma forma não compreensível, chamada criptograma (PICONI, 2004). O processo de transformar o criptograma na mensagem em claro original se chama decifragem. Tanto para cifragem quanto para decifragem é necessário um segundo parâmetro: a chave. A ciência que estuda como quebrar um sistema criptográfico é chamado de criptoanálise, a união das duas ciências forma um campo chamado criptografia (MORAES, 2004). 1.1 OBJETIVOS Avaliar o impacto que o emprego do algoritmo de criptografia simétrica Triple-DES causa no throughput de uma rede local, confrontando os dados estatísticos obtidos com os da não utilização dele, já que é considerável o aumento de um datagrama utilizando tais técnicas de ocultação de informação e o delay gerado para criar cada criptograma. 2 1.2 MOTIVAÇÃO A segurança da informação tornando-se um fator essencial para todo tipo de comunicação, seja ela, pessoal ou comercial. É praticamente obrigatório à utilização de algum meio que garanta a troca de tais informações entre um emissor e destinatário sem que haja interferência no meio do caminho, ou seja, que a informação mandada só possa ser lida pelo destinatário sem que outros consigam obter o significado do esteja sendo enviado. Para isto existem os algoritmos de criptografia que são seqüências de operações que buscam a complexidade (BLAZA et al., 1996) com o objetivo de elevar exponencialmente o custo para decifração por qualquer um que não seja o real destinatário (LAMBERT, 2003). Uma variante do algoritmo de criptografia DES foi escolhida por se tratar de um algoritmo criptográfico mais estudado e conhecido da história (FIPS, 1999). 3 2 CRIPTOGRAFIA Criptografia é a ciência que consiste na arte da transformação de mensagens numa representação sem significado para qualquer pessoa exceto para quem saiba qual o processo de reverter à transformação. A palavra criptografia teve origem da palavra grega kryptos que significa "escondida", e graphia cujo significado é "escrever". No uso generalizado em redes de comunicação de dados à criptografia estende-se a diversos domínios, desde a autenticação de utilizadores, a privacidade de comunicações pessoais, ou difundidas, em canais de comunicação poucos seguros, ou de acesso livre. Algoritmos criptográficos envolvem funções matemáticas usadas para codificação dos dados, garantindo segredo e autenticação. Precisando ser conhecidos e testados, pois, ao contrario do que muitos sistemas de segurança existentes que se utilizam da obscuridade para garantir sua suposta funcionalidade, os algoritmos criptográficos mais seguros são justamente os mais conhecidos, aqueles que já foram publicados em periódicos de pesquisa e amplamente estudados em universidades do mundo todo. A segurança reside na chave secreta que deve ter tamanho suficiente para evitar sua descoberta por teste exaustivo. A principal motivação de sistemas de criptografia é proporcionar segurança a todos os usuários e evitar que a transação possa ser decifrada por pessoas não autorizadas. 2.1 HISTÓRIA A palavra criptografia é derivada de palavras gregas, e a definição que a originou é: "Arte de escrever com chave secreta ou de modo enigmático". Obviamente há anos que a criptografia deixou de ser uma arte para virar uma técnica, ou melhor, um conjunto de técnicas que tratam da proteção. Este tipo de técnica já existe há muito 4 tempo, mesmo que tenha sido usada informalmente por muitas pessoas que, de alguma forma ou de outra, queriam manter segredo em relação ao conteúdo de suas mensagens (MORAES, 2004). Os militares foram os grupos de pessoas que mais usaram a técnica de criptografia para conseguir segurança de seus dados transmitidos, sendo eles também os maiores responsáveis pelo desenvolvimento da criptografia. Todos os sistemas de criptografia anteriores a 2ª Guerra Mundial podem-se chamar de algoritmos de criptografia clássicos, que coincide com o nascimento dos computadores. Com o avanço dos computadores as mensagens criptografadas utilizando-se de algoritmos clássicos são facilmente decifradas por teste exaustivo, por isso caíram rapidamente em desuso. Todos os algoritmos clássicos são simétricos, ou seja, se utilizam de uma mesma chave tanto para criptografar ou para decifrar. Dentre eles pode-se citar as cifras por substituição e por permutação, os quais estas são descritas nas seções seguintes. 2.1.1 Cifras por substituição As cifras por substituição são aquelas em que os caracteres da mensagem em texto plano são sistematicamente substituídos por outros caracteres. As quais são divididas nas seguintes categorias: • Cifras por deslocamento ou mono alfabéticas: são todos os algoritmos de criptografia que, sem desordenar os símbolos dentro da mensagem, estabelecem um mapeamento único para todos eles em todo o texto. o Algoritmo Caesar: é chamado assim por ser o que Julio Caesar empregava para enviar suas mensagens secretas, é um dos algoritmos mais simples. Consiste em somar três ao número de ordem de cada letra. Desta forma o A corresponde ao D, o B ao E, ..., o W ao Z, o X 5 ao A, o Y ao B e o Z ao C. o Algoritmo Rot 13: muito semelhante ao de Caesar, consiste em substituir uma letra por outra situada treze posições mais à frente no alfabeto. o Algoritmo Shift-n: é substituído às letras por outras situadas mais à frente no alfabeto, como nos métodos anteriores. A única diferença é o número de deslocamentos a serem realizados a cada letra definido no algoritmo. Sendo este a chave. • Cifras poli alfabéticas: neste tipo de algoritmo existem múltiplas chaves e cada uma é usada para encriptar uma letra do texto, ou seja, a substituição aplicada a cada caractere varia em função da posição que ele ocupa dentro do texto plano. • Cifras homofônicas: estes algoritmos tratam de ocultar as propriedades estatísticas do texto plano, empregando um alfabeto de saída com mais símbolos que o alfabeto de entrada, ou seja, associando várias saídas a um símbolo que ocorre mais vezes na palavra, impossibilitando assim um ataque baseado em freqüências. 2.1.2 Cifras por permutação As cifras por permutação também são conhecidas como cifra por transposição e a idéia emprega é manter os mesmos caracteres do texto plano, apenas rearranjando suas posições. Neste tipo de cifra consiste em misturar as letras do texto original de acordo com uma regra reversível qualquer. A transposição pode ser uma permutação baseada numa palavra-chave ou obtida através de um dispositivo mecânico. 2.2 TIPOS DE CHAVES A chave consiste em uma string que pode ser alterada sempre que necessário. 6 Desse modo o algoritmo de criptografia pode ser conhecido. Quando o algoritmo se torna público, vários especialistas tentam decodificar o sistema. Se após alguns anos nenhum destes conseguirem quebrá-lo, significa que o algoritmo é seguro (PICONI et al., 2004). O tipo de chave usada depende do tipo da criptografia usada. Existem dois tipos de criptografia: • Criptografia simétrica: que usa uma chave privada. • Criptografia assimétrica: que usa um par de chaves, conhecida como chave pública e privada. 2.2.1 Algoritmos Simétricos Sistema simétrico ou também conhecido como criptografia por chave secreta ou única e criptografia simétrica ou tradicional, são os algoritmos que se utiliza de uma única chave para encriptar ou criptografar e decriptar ou descriptografar os dados, ou seja, por usar a mesma chave para as duas tarefas o processo de criptografia é relativamente pequeno e rápido, contudo como desvantagem, não só o transmissor deve conhecer a chave como também o receptor (PICONI et al., 2004). 7 FIGURA 1: FUNCIONAMENTO DE ALGORITMOS DE CHAVES SIMÉTRICAS Texto Puro Algoritmo Criptografia Mensagem Criptografada Chave Internet Mensagem Criptografada Mensagem Decriptografada Algoritmo Decriptografia Chave Fonte: MORAES (2004) Conforme demonstra a figura acima, o funcionamento de algoritmos simétricos é simples. A soma da mensagem mais a chave geram uma mensagem criptografada, após a geração, ela é enviada através da rede, e ao chegar ao lado oposto, ela é descriptografada através da chave que esta no destino. A chave deve ser conhecida tanto pelo remetente quanto pelo receptor da mensagem. Sua geração, transmissão e armazenamento são denominados Gerência de Chaves (MORAES, 2004). O principal desafio (e fragilidade) deste método é garantir que ninguém mais conheça a chave além do transmissor e receptor originais, pois o simples fato de ter que transmitir ou informar a chave para o receptor já torna falho este tipo de algoritmo, porque estaria abrindo a possibilidade de um atacante obter a chave e ter acesso irrestrito aos dados criptografados, podendo ler, modificar ou até mesmo forjar novas 8 mensagens encriptadas ou autenticadas. Esta forma de algoritmo por chave privada funciona muito bem quando o usuário que encripta é o mesmo que desencripta o arquivo (MORAES, 2004). 2.2.2 Algoritmos Assimétricos Em 1976, os cientistas americanos Whitfield Diffie e Martin Hellman apresentaram o conceito de criptografia por chave pública. A grande inovação foi o uso de duas chaves (PICONI et al., 2004). Os principais objetivos desta nova modalidade de troca de mensagens cifradas, é encriptação e assinaturas digitais. Neste sistema cada pessoa possui um par de chaves, uma denominada chave pública e outra denominada chave privada. Enquanto a chave pública tem seu conhecimento difundido, a chave privada deve ser mantida em segredo (MORAES, 2004). Esta nova modalidade elimina o problema dos algoritmos simétricos que necessitavam que as partes comunicantes trocassem informações sigilosas, sendo que agora todas as comunicações irão envolver somente a chave pública (sem a necessidade de meios de transmissão seguros) não sendo necessária à troca de chaves secretas por nenhuma das partes. 9 FIGURA 2: FUNCIONAMENTO DE ALGORITMOS DE CHAVES ASSIMÉTRICAS Texto Puro Algoritmo Criptografia Mensagem Criptografada Chave Pública Internet Mensagem Criptografada Mensagem Decriptografada Algoritmo Decriptografia Chave Privada Fonte: MORAES (2004) Um emissor possuindo a chave pública do receptor pode usá-la para enviar mensagens cifradas e a mesma mensagem só pode ser lida mediante o uso da chave privada de pertence ao receptor. Neste sistema criptográfico a chave privada é matematicamente derivada da chave pública. Se, em tese, é probabilisticamente impossível a um atacante derivar a chave privada da chave pública, esta propriedade ainda não pode ser matematicamente comprovada (MORAES, 2004). Algoritmos de criptografia por chave pública resolvem o problema de transmitir uma mensagem totalmente segura através de um canal inseguro (sujeito a observação). O receptor da mensagem cria duas chaves que são relacionadas entre si, uma pública e uma privada. A chave pública pode e deve ser distribuída livremente. Quem envia a mensagem tem que utilizar a chave pública do receptor para encriptá-la. 10 Uma vez encriptada, esta mensagem só pode ser desencriptada pela chave do receptor (MORAES, 2004). 11 3 ALGORITMO DES Após a segunda guerra mundial, ainda não se tinha um padrão criptográfico que permitisse que diferentes equipamentos compartilhassem dados criptografados, mesmo com a chamada criptografia moderna que no período da 2ª guerra mundial avançou muito nesta década. Com criação desse padrão tornaria a proteção de informações muito mais barata e confiável (HINZ, 2000). Pensando nisto em 15 de maio de 1973 a NBS (National Bureau of Standards) realizou um anúncio público solicitando propostas de algoritmos para proteção de dados durante sua transmissão e armazenamento (MORAES, 2004). Este algoritmo deveria obedecer algumas especificações (HINZ, 2000): • Deve ter alto nível de segurança; • Deve estar totalmente documentado e ser de fácil entendimento; • A segurança do algoritmo deve se encontrar na chave e não depender do sigilo do algoritmo; • Deve estar disponível para todos os usuários; • Deve ser adaptável para uso em diversas aplicações; • Deve ser economicamente implementável em dispositivos eletrônicos; • Deve ser eficiente; • Deve estar habilitado para validação; • Deve ser exportável. Não houve resposta até seis de agosto de 1974 quando a IBM apresentou o criptossistema desenvolvido chamado LUCIFER (WEBER, 1995). A NSA (National Security Agency) e a NBS avaliaram o algoritmo e em 15 de julho de 1977 adotou-se uma modificação no LUCIFER e passou a chamar-se DES (Data Encryption Standard) (MORAES, 2004) com um padrão de 64 bits de leitura e uma chave com 56 bits para a mensagem (GONÇALVES, 2001). 12 3.1 DESCRIÇÃO Tanto o algoritmo quanto a chave são simétricos, ou seja, utiliza-se de uma chave K para cifrar blocos de texto claro (M) e decifrar blocos de texto cifrado (C) (LAMBERT, 2003). Por padrão possui uma chave de 64 bits no qual para cada 64 bits de texto simples na entrada do algoritmo, surgem 64 bits de texto criptografado na saída e todos os oitavos bits de cada byte da mensagem são usados somente como bits de paridade (HINZ, 2000). Este algoritmo foi adotado e permaneceu como padrão para criptografia de dados do governo americano por mais de 25 anos, no qual ainda é muito estudado atualmente (LAMBERT, 2003). O DES é um algoritmo criptográfico que se utiliza originalmente de uma seqüência de 16 iterações, sendo que em cada uma dessas são realizadas sucessivas transposições, substituições e permutações entre os bits da chave e de cada bloco de texto em claro (que por padrão devem possuir 64 bits cada), resultando finalmente em um criptograma. 3.2 ESTRUTURA DE FUNCIONAMENTO O DES opera sobre os blocos de mensagem de 64 bits a fim de obter o criptograma na seguinte seqüência de operações apresentadas nas próximas seções (LAMBERT, 2003). 3.2.1 Obter 16 sub-chaves de 48 bits cada É preciso obter-se 16 sub-chaves de 48 bits cada para serem usadas posteriormente na etapa de geração dos criptogramas 64 bits, mais especificamente nas operações XOR (Exclusive OR). Depois de realizado a verificação de integridade da chave (K) resta-se somente 56 bits e esses são permutados conforme demonstrado na tabela de permutação de compressão PC-1 a seguir: 13 TABELA 1: 57 1 10 19 63 7 14 21 49 58 2 11 55 62 6 13 PERMUTAÇÃO PC-1 41 50 59 3 47 54 61 5 33 42 51 60 39 46 53 28 25 34 43 52 31 38 45 20 17 26 35 44 23 30 37 12 9 18 27 36 15 22 29 4 Agora se divide a chave em duas partes. Os primeiros 28 bits da chave passam a se chamar C0 e os últimos 28 bits em D0 (MORAES, 2004), então inicia-se um processo de iteração que tem o objetivo de criar 16 blocos Cn e Dn, onde, 1 <= n <= 16, utilizando-se do esquema de deslocamento para a esquerda circular conforme tabela a seguir: TABELA 2: NÚMERO DE ITERAÇÕES DO DESLOCAMENTO A ESQUERDA CIRCULAR Iteração: Deslocamento: 1 1 2 1 3 2 4 2 5 2 6 2 7 2 8 2 9 1 10 2 11 2 12 2 13 2 14 2 15 2 16 1 Aplicando outra tabela de permutação de compressão chamada PC-2 (apresentada logo abaixo) em cada um dos pares concatenados CnDn, obtêm-se 16 subchaves (Kn) de 48 bits cada. TABELA 3: 14 3 23 16 41 30 44 46 17 28 19 7 52 40 49 42 PERMUTAÇÃO PC-2 11 15 12 27 31 51 39 50 24 6 4 20 37 45 56 36 1 21 26 13 47 33 34 29 5 10 8 2 55 48 53 32 A figura abaixo ilustra melhor as etapas aqui apresentadas para obtenção de 16 sub-chaves de 48 bits cada a partir da chave original. 14 FIGURA 3: CICLO DES DE OBTENÇÃO DE 16 SUB-CHAVES DE 48 BITS Chave Original Permutação de Compressão (PC-1) Left Shift Left Shift Permutação de Compressão (PC-2) Chave 48 bits Fonte: Baseado em HINZ (2000) 3.2.2 Obter blocos codificados de cada 64 bits da mensagem Primeiramente é separado do texto plano um bloco de 64 bits. Se o bloco for menor do que 64 bits, ele é preenchido com zeros (MORAES, 2004). Então é realizada uma permutação inicial (IP) de cada bloco da mensagem M, conforme tabela logo abaixo. A permutação inicial não influi diretamente na segurança do DES, pois ela apenas executa uma simples permutação de bits com o propósito de facilitar o uso do DES em chips quando ele é implementado em hardware (HINZ, 2000). TABELA 4: 58 60 62 64 57 59 61 63 50 52 54 56 49 51 53 55 42 44 46 48 41 43 45 47 PERMUTAÇÃO IP 34 36 38 40 33 35 37 39 26 28 30 32 25 27 29 31 18 20 22 24 17 19 21 23 10 12 14 16 9 11 13 15 2 4 6 8 1 3 5 7 15 Divide-se o bloco de 64 bits resultante da permutação em duas partes L0 e R0, cada uma com 32 bits (MORAES, 2004). Depois disto, deve-se processar o bloco de dados L0R0 em 16 sub-chaves. E para isto o bloco Rn-1 com 32 bits é expandido para 48 bits através da tabela de expansão abaixo que repete alguns bits da chave, resultando E(Rn-1). TABELA 5: 32 4 8 12 16 20 24 28 1 5 9 13 17 21 25 29 EXPANSÃO E 2 6 10 14 18 22 26 30 3 7 11 15 19 23 27 31 4 8 12 16 20 24 28 32 5 9 13 17 21 25 29 1 A seguir é realizado um XOR na saída E(Rn-1) com a chave Kn. É importante esta etapa porque o XOR é reversível e serve para podermos reverter o processo na decifragem da mensagem (FIPS, 1999). O XOR resultará em uma chave de 48 bits que será dividida em oito blocos de seis bits cada, se tornando B1, ..., B8. Para cada bloco Bj será aplicada uma S-Box correspondente (conforme tabelas a seguir). Sendo a linha representada pelo primeiro e último bit do bloco Bj e a coluna representada pelos quatro bits do meio do bloco Bj, resultando a transformação Sj(Bj) num número binário de 4 bits que se encontra na posição indicada pela linha e coluna formada pelo Bj. TABELA 6: 14 0 4 15 4 15 1 12 13 7 14 8 1 4 8 2 15 3 0 13 1 13 14 8 8 4 7 10 14 7 11 1 2 14 13 4 15 2 6 9 11 13 2 1 8 1 11 7 TABELA 7: 6 15 10 3 11 2 4 15 3 8 13 4 4 14 1 2 S-BOX S1 3 10 15 5 10 6 12 11 6 12 9 3 12 11 7 14 5 9 3 10 9 5 10 0 0 3 5 6 7 8 0 13 13 10 6 12 12 6 9 0 0 9 3 5 5 11 2 14 10 5 15 9 S-BOX S2 9 12 5 11 7 0 8 6 2 1 12 7 16 TABELA 8: 10 13 13 1 0 7 6 10 9 0 4 13 14 9 9 0 6 3 8 6 3 5 0 6 0 6 12 10 3 4 15 9 15 6 3 8 5 10 0 7 TABELA 9: 7 13 10 3 13 8 6 15 14 11 9 0 6 15 11 1 9 0 7 13 10 3 13 8 S-BOX S3 1 2 11 4 13 8 1 15 12 5 2 14 7 14 12 3 11 12 5 11 4 11 10 5 2 15 14 2 8 1 7 12 S-BOX S4 1 4 15 9 2 7 1 4 8 2 3 5 5 12 14 11 11 1 5 12 12 10 2 7 4 14 8 2 15 9 4 14 TABELA 10: S-BOX S5 2 14 4 11 12 11 2 8 4 2 1 12 1 12 11 7 7 4 10 1 12 10 9 4 1 15 14 3 10 4 15 2 15 2 5 12 9 7 2 9 10 7 13 14 11 13 7 2 6 1 8 13 8 5 15 6 5 0 9 15 3 15 12 0 15 10 5 9 13 3 6 10 0 9 3 4 14 8 0 5 9 6 14 3 11 8 6 13 TABELA 11: S-BOX S6 2 12 8 5 6 9 12 15 8 5 3 10 0 6 7 11 13 1 0 14 3 13 4 1 4 14 10 7 14 0 1 6 7 11 13 0 5 3 11 8 7 12 8 15 5 2 0 14 10 15 5 2 6 8 9 3 14 11 13 0 5 0 15 3 0 14 3 5 12 9 5 6 TABELA 12: S-BOX S7 4 13 1 6 11 0 4 11 2 11 11 13 14 7 13 8 15 4 12 1 0 9 3 4 8 1 7 10 13 10 14 7 3 14 10 9 12 3 15 5 9 5 6 0 1 6 2 12 TABELA 13: S-BOX S8 13 1 7 2 2 15 11 1 8 13 4 14 4 8 1 7 6 10 9 4 15 3 12 10 11 7 14 8 1 4 2 13 10 12 0 15 9 5 6 12 3 6 10 9 7 2 8 11 A concatenação da saída das S-Box Sj(Bj) resulta em um novo bloco de 32 bits. Neste bloco aplica-se a permutação P apresentada na tabela abaixo. TABELA 14: PERMUTAÇÃO P 16 29 1 5 2 32 7 12 15 18 8 27 20 28 23 31 24 3 21 17 26 10 14 9 17 19 22 13 11 30 4 6 25 Com o resultado da permutação P aplica-se a operação XOR com o elemento Ln-1, resultando em Rn. Por último o elemento Ln é igual a Rn-1. Depois de realizado o cálculo dos 16 sub-blocos deve-se aplicar a permutação IP-1 na concatenação de R16L16. TABELA 15: PERMUTAÇÃO IP-1 40 39 38 37 36 35 34 33 8 7 6 5 4 3 2 1 48 47 46 45 44 43 42 41 16 15 14 13 12 11 10 9 56 55 54 53 52 51 50 49 24 23 22 21 20 19 18 17 64 63 62 61 60 59 58 57 32 31 30 29 28 27 26 25 Com todas estas etapas, resultará o bloco de 64 bits M num bloco cifrado C com o algoritmo DES. Todo este processo pode ser melhor compreendido na ilustração abaixo (Figura 4), que representa a junção do passo anterior (obter 16 sub-chaves de 48 bits cada) com este. 18 FIGURA 4: CICLO DES DE CODIFICAÇÃO DE BLOCOS DE MENSAGENS Bloco Plano Chave Original Permutação IP Permutação de Compressão (PC-1) Ln-1 Rn-1 Left Shift Permutação de Expansão (E) Left Shift Permutação de Compressão (PC-2) Chave 48 bits S-Box P-Box Ln Rn R16 L16 Permutação IP-1 Bloco Cifrado Fonte: Baseado em HINZ (2000) e FIPS (1999) 19 3.2.3 Decifração O processo de decifração de blocos cifrados pelo algoritmo de criptografia DES utiliza-se do mesmo processo de cifragem, mas as sub-chaves de 48 bits (K1 à K16) geradas a partir da chave original de 64 bits, são usadas na ordem inversa durante o algoritmo, ou seja, após a permutação de expansão a primeira sub-chave que irá realizar a operação XOR com o resultado da permutação será K16. 3.2.4 Triple-DES Como o DES tem dois objetivos básicos, a difusão que busca distribuir a redundância existente na mensagem original para a cifrada, e a confusão que tem o propósito de tornar complexa a relação entre a chave e a mensagem (JASCONE, 2003). O DES pode ser quebrado pelo método de força bruta (testes exaustivos), tentando-se todas as combinações possíveis de chave (JASCONE, 2003). Por este motivo buscou-se a criação de alguma técnica para alavancar a segurança neste algoritmo. Em 1979 Tuchman propôs o uso de três etapas adicionais no algoritmo padrão DES (HANDSCHUH, 1999), por isso o nome Triple-DES que é uma variação do algoritmo DES no qual é considerado seguro e mesmo que praticamente triplicando o processo de crifagem ele ainda é um método de criptografia simétrica rápida (SANTOS, 2002) (VILELA, 2003). Na etapa de cifragem este algoritmo é do tipo EDE (Encrypt-DecryptEncrypt), ou seja, a primeira chave é utilizada para encriptar, a segunda para decifrar (com o intuito de embaralhar ainda mais o bloco e não de voltar para o bloco original), e finalmente a terceira e última chave é utilizada para encriptar novamente o bloco de 64 bits fornecido no inicio do algoritmo. Na primeira e terceira chave pode ser utilizado a mesma chave (MAO, 2003). Já para decifrar o algoritmo realiza as operações inversas da cifragem, ficando com o esquema de DED (Decrypt-EncryptDecrypt) (MAO, 2003). 20 Nas figuras 5 e 6 pode-se visualizar mais adequadamente o funcionamento deste algoritmo utilizando duas chaves de 56 bits (totalizando 112 bits) e na seqüência com três chaves também de 56 bits cada (totalizando 168 bits). FIGURA 5: FUNCIONAMENTO DO TRIPLE-DES COM DUAS CHAVES DE 56 BITS Bloco Plano DES Encripta Chave 2 DES Decifrar DES Encripta Bloco Cifrado Fonte: Baseado em JILANI (2003) Chave 1 21 FIGURA 6: FUNCIONAMENTO DO TRIPLE-DES COM TRÊS CHAVES DE 56 BITS Bloco Plano DES Encripta Chave 2 DES Decifrar DES Encripta Bloco Cifrado Fonte: Baseado em JILANI (2003) Chave 1 Chave 3 22 4 IMPLEMENTAÇÃO Com o objetivo de demonstrar o impacto gerado na utilização de um algoritmo de criptografia, mais especificamente, o algoritmo Triple-DES, no throughput de uma rede local. Definiu-se a utilização dos seguintes componentes para o desenvolvimento de uma aplicação que servirão para demonstrar o objetivo descrito: • Sistema Operacional GNU/Linux; • Ferramenta de captura de tráfego na rede TCPDUMP versão 3.8.3; • Linguagem de programação C, no qual será utilizada para geração de datagramas criptográficos com o algoritmo Triple-DES. • Computador AMD K7-800 MHz com as seguintes características: o 384 MB de memória RAM; o Placa de rede Realtek 8139; o Distribuição Debian Testing com kernel 2.4.27. • Computador AMD K6-500 MHz com as seguintes características: o 160 MB de memória RAM; o Placa de rede Realtek 8139; o Distribuição Debian Stable com kernel 2.6.7. 4.1 AMBIENTE DE SIMULAÇÃO No ambiente de simulação será utilizado duas máquinas com GNU/Linux interligadas por um HUB e sem nenhuma conexão externa, conforme demonstra a figura abaixo. 23 FIGURA 7: AMBIENTE DE SIMULAÇÃO Sistema GNU/Linux Debian com Kernel 2.4.27 e rodando a ferramenta TCPDUMP 10.0.0.139 Sistema GNU/Linux Debian com Kernel 2.6.7 e rodando o sistema 10.0.0.144 gerador de datagramas HUB 10/100 BaseT 4.2 SISTEMA GERADOR DE DATAGRAMAS CIFRADOS Este sistema tem por função a geração de datagramas TCP cifrados pelo algoritmo Triple-DES para um determinado IP e porta específica durante um tempo pré-definido. E para realizar esta tarefa foi utilizado raw sockets (AL-HERBISH, 1999), no qual possibilita trabalhar diretamente com a estrutura do protocolo, ou seja, possibilita a manipulação dos dados no cabeçalho do datagrama IP (Internet Protocol). O datagrama IP é muito importante no que diz respeito à versão do protocolo, fragmentação dos datagramas, entre outras opções como demonstra a figura abaixo. FIGURA 8: ESTRUTURA DO CABEÇALHO IP Versão Tamanho do cabeçalho Tipo do serviço (TOS) Tamanho Total Identificação Flags Deslocamento do fragmento Tempo de vida (TTL) Protocolo Checksum do cabeçalho Endereço IP de origem Endereço IP de destino Opções Padding Dados Fonte: TORRES (2001) Todas essas opções acima apresentadas do datagrama IP foram 24 respectivamente definidas pelo trecho de código no quadro a seguir. QUADRO 1: ROTINA QUE DEFINE O CABEÇALHO IP void set_ip_header(struct sockaddr_in *dst) { datagram.ipheader.version = IPVERSION; datagram.ipheader.ihl = sizeof(struct iphdr) >> 2; datagram.ipheader.tos = 0x00; datagram.ipheader.tot_len = htons(sizeof(struct _datagram)); datagram.ipheader.id = htons(0x01); datagram.ipheader.frag_off = htons(IP_DF); // Não fragmentar. datagram.ipheader.ttl = 0x40; datagram.ipheader.protocol = IP_TCP; datagram.ipheader.check = htons(0x00); datagram.ipheader.saddr = htonl(SRCADDR); datagram.ipheader.daddr = dst->sin_addr.s_addr; } Explicando o trecho de código acima: • datagram.ipheader.version: define a versão do protocolo IP que está sendo usado. No qual neste caso é a versão 4; • datagram.ipheader.ihl: especifica o número de linhas de 32 bits que o cabeçalho possui. É feito um deslocamento a direito de 2 bits sobre o tamanho da struct iphdr, resultando no número 5; • datagram.ipheader.tos: este campo define a qualidade desejada para a entrega do datagrama. Como o datagrama gerado não irá passar por nenhum roteador, então definiu-se como “0”, pois não iria fazer diferença se o definise para ter delay (atraso), throughput (velocidade) e realiability (confiabilidade); • datagram.ipheader.tot_len: indica o número total de bytes que compõem o datagrama. Este recebe o tamanho da struct _datagram que é composta pelos cabeçalhos IP e TCP (Transmission Control Protocol) mais a quantia de dados, totalizando neste caso 48 bytes; • datagram.ipheader.id: usado para identificar o datagrama. Como os datagramas gerados pelo sistema não vão ser fragmentados este campo recebeu o valor numérico um; • datagram.ipheader.frag_off: controla a fragmentação de datagramas, e 25 como já dito acima não é necessário fragmentar pois os datagramas gerados são pequenos (48 bytes), foi definido como IP_DF (IP Don’t Fragment) que possui o valor 0x4000; • datagram.ipheader.ttl: indica o tempo máximo de vida do datagrama. Como especificado anteriormente, os datagramas gerados não irão passar por nenhum roteador, então foi adotado um valor padrão de 64; • datagram.ipheader.protocol: define o protocolo utilizado para envio dos datagramas. Neste caso o protocolo TCP que é definido pelo valor numérico seis; • datagram.ipheader.check: este campo indica o checksum, no qual é utilizado para definir se o cabeçalho está ou não corrompido. Como neste ambiente de simulação os datagramas não irão passar por nenhum roteador optou-se por defini-lo com o valor zero. • datagram.ipheader.saddr: endereço IP de onde esta partindo o datagrama. Foi definido com o valor 127.0.0.1; • datagram.ipheader.daddr: endereço IP de destino do datagrama. É definido por parâmetro ao programa. Como foi definido no cabeçalho IP que o protocolo utilizado é o TCP, a figura a seguir demonstra as opções que o mesmo contém. 26 FIGURA 9: ESTRUTURA DO CABEÇALHO TCP Porta origem Porta destino Número Seqüência Número reconhecimento Deslocamento Reservado Controle Janela Checksum Ponteiro urgência Opções Padding Dados Fonte: TORRES (2001) Essas opções acima apresentadas do datagrama TCP foram respectivamente definidas pelo trecho de código no quadro a seguir. QUADRO 2: ROTINA QUE DEFINE O CABEÇALHO TCP void set_tcp_header(struct sockaddr_in { datagram.tcpheader.th_sport = datagram.tcpheader.th_dport = datagram.tcpheader.th_seq = datagram.tcpheader.th_ack = datagram.tcpheader.th_off = datagram.tcpheader.th_flags = datagram.tcpheader.th_win = datagram.tcpheader.th_urp = *dst) dst->sin_port; dst->sin_port; 0x00; 0x00; sizeof(struct tcphdr) >> 2; TH_SYN; htons(0x01); 0x01; memset(&header, 0, sizeof(struct _header)); header.saddr.s_addr header.daddr.s_addr header.zero header.protocol header.length = = = = = htonl(SRCADDR); dst->sin_addr.s_addr; 0; IP_TCP; sizeof(struct tcphdr) + DES3_DATASIZE; datagram.tcpheader.th_sum = checksum((u_short *) &header, sizeof(struct _header)); } Explicando o trecho de código acima: • datagram.tcpheader.th_sport: porta de origem dos dados, sendo definido a mesma porta que a de destino; • datagram.tcpheader.th_dport: porta de destino dos dados, definido com o 27 valor padrão de 63221 ou podendo ser especificada pelo usuário através de parâmetros; • datagram.tcpheader.th_seq: representa o número do primeiro byte do fragmento. Como neste ambiente é gerado toda vez o mesmo datagrama e não ocorre fragmentação, o valor vai ser sempre zero; • datagram.tcpheader.th_ack: número de seqüência do próximo fragmento. Novamente este campo também é definido por não ocorrer fragmentação; • datagram.tcpheader.th_off: especifica o tamanho do cabeçalho, sendo realizado um deslocamento de dois bits para a direita sobre o tamanho da struct tcphdr, resultando o valor numérico cinco (5); • datagram.tcpheader.th_flags: este define os códigos de controle, sendo somente defino pelo código de TH_SYN que significa sincronismo; • datagram.tcpheader.th_win: serve para enviar vários pacotes antes de receber a confirmação de recebimento. Neste caso não foi preciso usar esta opção, pois não é feito o controle se o datagrama foi recebido ou não, então o mesmo recebeu o valor numérico um; • datagram.tcpheader.th_urp: outro campo desnecessário nesta aplicação no qual define se existe dados urgentes no segmento de dados, especificando onde os mesmos terminam; • datagram.tcpheader.th_sum: este recebe o valor calculado do checksum sobre um pseudo cabeçalho. Sendo o pseudo cabeçalho utilizado somente para o cálculo do checksum e por conseqüência não irá ser transmitido. Todo este processo de definição do cabeçalho IP, TCP e inserção dos dados que serão enviados (texto plano ou cifrado) se repete toda vez que irá ser enviado um datagrama, possibilitando uma melhor comparação com um fato real. O trecho que monta o datagrama pode ser visualizado no quadro a seguir. 28 QUADRO 3: ROTINA QUE DEFINE OS DATAGRAMA void init_datagram(const char *data, struct sockaddr_in *dst) { memset(&datagram, 0, sizeof(struct _datagram)); memcpy(&datagram.data, data, DES3_DATASIZE); set_ip_header(dst); set_tcp_header(dst); } Repara-se que toda vez é realizado a mesma operação tanto para criação dos datagramas criptografados e para datagramas em texto plano, isto para não afetar nos resultados. Seguindo o código, é primeiramente zerada a estrutura datagram com a função memset() e então copiados os dados passados por parâmetros a sub-rotina init_datagram() para o campo de dados do datagrama definido na estrutura como datagram.data, após isto é definido o cabeçalho IP e TCP através das sub-rotinas apresentas anteriormente. As opções disponíveis para o usuário como, definição de tempo de envio dos datagramas, porta de destino, especificar se o datagrama é criptografado ou não e o endereço do destino, pode-se ser compreendido no quadro abaixo. QUADRO 4: OPÇÕES DISPONÍVEIS PARA O USUÁRIO # ./gen Sistema Gerador de Datagramas Cifrados - v0.1 Copyright (C) 2004 Fabiano R. Righetti - frighetti AT cascavel.pm.org Mode de uso: ./gen [-cpt] <host|ip> -c Habilitar cifragem com algoritmo Triple-DES -p <porta> Porta TCP do servidor. -t <tempo> Tempo total de envio de datagramas em minutos. (default: 10) # Os datagramas criptografados irão se utilizar do algoritmo de criptografia Triple-DES implementado por DEVINE (2004) seguindo as normas do documento FIPS (1999). Segue trecho de código que realiza a criptografia dos dados através de funções da biblioteca de DEVINE (2004). 29 QUADRO 5: ROTINA UTILIZADA PARA CRIPTOGRAFAR void triple_des_cipher(const char *data) { des3_context ctx3; memset(triple_des.DATA, 0, DES3_DATASIZE + 1); memcpy(triple_des.DATA, data, DES3_DATASIZE); des3_set_3keys(&ctx3, DES3_KEY[0], DES3_KEY[1], DES3_KEY[2]); des3_encrypt(&ctx3, triple_des.DATA, triple_des.DATA); } Em todo datagrama criptografado será primeiramente zerada o campo de dados da estrutura triple_des e então copiados os dados recebidos por parâmetro que estão em texto plano para o campo triple_des.DATA. Depois de realizado esta tarefa é definida as três chaves que serão utilizadas para cifrar os dados na variável declarada no início da sub-rotina como ctx3 do tipo des3_context através da chamada da função des3_set_3keys(). Finalmente é realizado a cifragem dos dados pela função des3_encrypt() passando a estrutura de chaves e o texto plano que será criptografado. 4.3 TESTES REALIZADOS Foi realizado diversas vezes testes de desempenho com o objetivo de verificar a vazão de rede alcançada. Primeiramente foi feito um isolamento da rede, deixando somente duas máquinas rodando o sistema GNU/Linux interligadas por um HUB e utilizando-se de uma conexão 10/100 BaseT. A composição dos datagramas em texto plano e já criptografados, capturados pelo analisador de rede TCPDUMP pode ser visualizado nos quadros a seguir, com os respectivos parâmetros passados ao programa. QUADRO 6: PARÂMETROS USADOS PARA GERAR DATAGRAMAS EM TEXTO PLANO # ./gen 10.0.0.139 Sistema Gerador de Datagramas Cifrados - v0.1 Copyright (C) 2004 Fabiano R. Righetti - frighetti AT cascavel.pm.org + stream inicializada! +++ aguarde 10 minutos... + stream finalizada! # 30 QUADRO 7: DATAGRAMA CAPTURADO PELO TCPDUMP EM TEXTO PLANO # tcpdump -i eth0 tcp dst port 63221 -n -c 1 -X listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 20:46:38.592821 IP 127.0.0.1.63221 > 10.0.0.139.63221: S 0:8(8) win 1 0x0000: 4500 0030 0001 4000 4006 b13b 7f00 0001 E..0..@.@..;.... 0x0010: 0a00 008b f6f5 f6f5 0000 0000 0000 0000 ................ 0x0020: 5002 0001 237e 0100 7465 7374 616e 646f P...#~..testando 1 packets captured # QUADRO 8: PARÂMETROS USADOS PARA GERAR DATAGRAMAS CRIPTOGRAFADOS # ./gen 10.0.0.139 -c Sistema Gerador de Datagramas Cifrados - v0.1 Copyright (C) 2004 Fabiano R. Righetti - frighetti AT cascavel.pm.org + stream inicializada! +++ aguarde 10 minutos... + stream finalizada! # QUADRO 9: DATAGRAMA CAPTURADO PELO TCPDUMP JÁ CRIPTOGRAFADO # tcpdump -i eth0 tcp dst port 63221 -n -c 1 -X tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 20:47:32.678442 IP 127.0.0.1.63221 > 10.0.0.139.63221: S 0:8(8) win 1 0x0000: 4500 0030 0001 4000 4006 b13b 7f00 0001 E..0..@.@..;.... 0x0010: 0a00 008b f6f5 f6f5 0000 0000 0000 0000 ................ 0x0020: 5002 0001 237e 0100 91e4 15c6 468b 4ee7 P...#~......F.N. 1 packets captured # Após ter realizado alguns testes, notou-se que o intervalo entre um datagrama em texto plano e outro estava sendo maior que o dos datagramas criptografados. Por razão disto foi averiguado que o TCPDUMP não estava conseguindo receber todos os datagramas enviados em texto plano e que recebia somente uma notificação do kernel do sistema que o pacote foi recebido, mas descartado pelo mesmo. Em razão disto buscaram-se outros meios de captura de datagramas, e então foi realizado o teste utilizando-se da ferramenta IPTABLES (programa utilizado para criar regras de filtragem em pacotes provenientes da rede, em outras palavras, um firewall) para gravar em um arquivo os datagramas recebidos, mas novamente a taxa de recebimento de datagramas em texto plano estava sendo muito pouco. Devido a estes fatores chegou-se a conclusão que pelo fato de os datagramas estarem sendo gerados muito rapidamente e enviados pela rede, levou a algum motivo o kernel do sistema bloquear os mesmo. 31 Pode-se notar a grande diferença em datagramas bloqueados pelo kernel entre os em texto plano e os criptografados nos quadros a seguir. QUADRO 10: VAZÃO DE REDE ALCANÇADA POR DATAGRAMAS EM TEXTO PLANO # tcpdump -i eth0 tcp dst port 63221 -n -w plain.raw tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 1307185 packets captured 21796712 packets received by filter 20489527 packets dropped by kernel # QUADRO 11: VAZÃO DE REDE ALCANÇADA POR DATAGRAMAS CRIPTOGRAFADOS # tcpdump -i eth0 tcp dst port 63221 -n -w cipher.raw tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 10313926 packets captured 10313938 packets received by filter 12 packets dropped by kernel # Os dados apresentados nos quadros acima representam a captura dos respectivos tipos de datagramas durante dez minutos. Sendo que as características da rede foram mantidas durante os dois testes. 4.4 RESULTADOS Diante dos resultados obtidos durante os testes, averiguou-se que os datagramas em texto plano alcançaram à marca de 21.796.712 datagramas recebidos com 48 bytes cada. Já os datagramas de criptografia chegaram à marca de 10.313.938 datagramas recebidos de 48 bytes cada. Com a totalização de datagramas recebidos pode-se chegar-se aos seguintes dados apresentados nos gráficos a seguir. 32 FIGURA 10: GRÁFICO CONFRONTANDO TOTAL DE DADOS RECEBIDOS Tipo do datagrama Dados enviados durante 10 minutos 472,13 1 997,77 - 500,00 Criptografado Texto Plano 1.000,00 Total de dados em MBytes FIGURA 11: GRÁFICO CONFRONTANDO DADOS RECEBIDOS POR SEGUNDO Tipo do datagrama Dados enviados por segundo 0,79 1 - 1,66 0,50 1,00 1,50 Total de dados em MBytes 2,00 Criptografado Texto Plano 33 5 CONCLUSÃO Com os resultados obtidos pode-se concluir que mesmo utilizando um algoritmo de criptografia simétrica no qual é considerado rápido, houve uma elevada diferença entre o total de dados enviados, aproximadamente 60%. Todo sistema que seja necessário uma melhor segurança e que a solução para isto é a utilização de sistema de criptografia, deve-se fazer um estudo sobre qual algoritmo utilizar, seja ele simétrico ou assimétrico, e se os blocos criptografados pelo mesmo serão maiores que em texto puro, pois como demonstrado no ambiente de teste proposto, os resultados foram afetados somente pelo delay causado pelo algoritmo criptografia, sem considerar o tamanho dos blocos gerados porque a cifragem realizado pelo Triple-DES resulta em blocos de mesmo tamanho. Pelo fato de algoritmos simétricos se utilizarem de uma mesma chave, e havendo a necessidade de o receptor conhece-la, pode-se optar por usar em conjunto os algoritmos assimétricos para não perder muito desempenho na transmissão. Sendo os algoritmos assimétricos utilizados somente para repassar ao receptor a chave utilizada pelos algoritmos simétricos. 5.1 TRABALHOS FUTUROS Ainda tem-se uma ampla gama de testes que devem ser feitos que possam contribuir ainda mais com as conclusões chegadas com este trabalho, entre eles: • Adotar um algoritmo de criptografia que não resulte um bloco criptografado de mesmo tamanho do bloco de entrada como o DES; • Variar o tamanho dos datagramas enviados; • Confrontar os resultados obtidos entre algoritmos de criptografia simétrica e assimétrica; • Realizar teste utilizando-se os dois tipos de algoritmos em conjunto. 34 REFERÊNCIAS AL-HERBISH, Thamer. Raw IP Networking FAQ. Disponível <http://www.whitefang.com/rin/rawfaq.html>. Acesso em: 08 dez. 2004. em: BLAZE, Matt; DIFFIE, Whitfield; RIVEST, Ronald L.; SCHNEIER, Bruce; SHIMOMURA, Tsutomu; THOMPSON, Eric; WIENER, Michael. Minimal Key Lengths for Symmetric Ciphers to Provide Adequate Commercial Security. 1996. DEVINE, Christophe. Implementação do Triple-DES na liguagem ANSI C. Disponível em: <http://www.cr0.net:8040/code/crypto/des/>. Acesso em: 05 dez. 2004. FIPS. Data Encryption Standard. Federal Information Processing Standards Publication (46-3). 1999. GONÇALVES, Leandro Salenave; RIBEIRO, Vinicius Gadis. Um Estudo Comparativo entre algoritmos de criptografia DES – Lucifer (1977) e AES – Rijndael (2000). Canoas, 2001. Faculdade de Informática – Universidade Luterana do Brasil. HANDSCHUH, Helena; Preneel, Bart. On the Security of Double and 2-key Triple Modes of Operation. In: Fast Software Encryption, vol. 1636, pp. 215. SpringerVerlag, 1999. HINZ, Marco Antônio Mielke. Um estudo descritivo de novos algoritmos de criptografia. Pelotas, 2000. Monografia (Bacharelado em Informática) – Instituto de Física e Matemática, Universidade Federal de Pelotas. JASCONE, Fábio Luis Tavares. Protótipo de Software para Ocultar Texto Criptografado em Imagens Digitais. Blumenau, 2003. Monografia (Bacharelado em Ciência da Computação) – Centro de Ciências Exatas e Naturais – FURB – Universidade Regional de Blumenau. JILANI, Ibrahim; LI, Lan; SHI, Yixin. VHDL implementation of Data Encryption Standard (DES). Chicago, 2003. ECE 567 Project Report – ECE Department – UIC – University of Illinois at Chicago. LAMBERT, Jorge. Criptoanalise por Entradas Invariantes. Rio de Janeiro, 2003. Relatório Técnico – Departamento de Engenharia de Sistemas, Instituto Militar de Engenharia. MAO, Wenbo. Modern Cryptography: Theory and Practice. Upper Saddle River, NJ: Prentice Hall PTR, 2003. MORAES, Rosane França. Construção de um ambiente WEB com ferramentas para estudo de algoritmos de criptografia através do Matlab. Rio de Janeiro, 2004. Departamento de Eletrônica – Escola de Engenharia. UFRJ – Universidade Federal do Rio de Janeiro. PICONI, Andressa Cristiani; SUZUKI, Elcio Keniti; CAMARGO, Juliana Aparecida. Algoritmo RSA. Campinas, 2004. Especialização em Redes de Computadores – Instituto de Computação, UNICAMP – Universidade de Campinas. 35 SANTOS, Jorge Manuel Lopes. O uso de cifragem para protecção de canais abertos. Portugal, 2002. Dissertação (Mestrado em Ensino da Matemática) – Departamento de Matemática Pura – Faculdade de Ciências da UP – Universidade do Porto. TORRES, Gabriel. Redes de Computadores - Curso Completo. Rio de Janeiro, RJ: Axcel Books, 2001. VILELA, Henrique de Souza. Criptografia. Pelotas, 2003. Escola de Informática, UCPEL – Universidade Católica de Pelotas. WEBER, Raul Fernando. Criptografia Contêmporanea. Porto Alegre, 1995. Instituto de Informática, UFRGS – Universidade Federal do Rio Grando do Sul. 36 APÊNDICE 1 Código fonte do sistema gerador de datagramas cifrados desenvolvido na linguagem de programação C. /* * Sistema Gerador de Datagramas Cifrados * Copyright (C) 2004 Fabiano R. Righetti - frighetti AT cascavel.pm.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. */ #include #include #include #include #include #include #include #include #include #include #include <stdio.h> <stdlib.h> <string.h> <unistd.h> <time.h> <netdb.h> <arpa/inet.h> <sys/types.h> <sys/socket.h> <netinet/in.h> <netinet/ip.h> #include "des.h" #define #define #define #define #define #define #define #define #define #define #define #define #define VERSION TEMPO PORTA SRCADDR IP_TCP TH_FIN TH_SYN TH_RST TH_PUSH TH_ACK TH_URG DES3_DATASIZE DES3_KEYSIZE "0.1" 10 63221 0x7f000001 // 127.0.0.1 6 0x01 0x02 0x04 0x08 0x10 0x20 8 8 void u_short void void int void void void void init_sockaddr(struct sockaddr_in *, const char *, int); checksum(u_short *, u_short); usage(const char *); send_datagrams(char *, int, int, int); open_rawsocket(); set_ip_header(struct sockaddr_in *); set_tcp_header(struct sockaddr_in *); init_datagram(const char *, struct sockaddr_in *); triple_des_cipher(const char *); static unsigned char DES3_DATA[DES3_DATASIZE] = { 0x74, 0x65, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x6f // testando }; static unsigned char DES3_KEY[3][DES3_KEYSIZE] = { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, { 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01 }, { 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23 } 37 }; /* * TCP header. * Per RFC 793, September, 1981. * * Copyright (c) 1982, 1986 Regents * All rights reserved. */ struct tcphdr { u_short th_sport; u_short th_dport; u_int32_t th_seq; u_int32_t th_ack; #if __BYTE_ORDER == __LITTLE_ENDIAN u_char th_x2:4, th_off:4; #endif #if __BYTE_ORDER == __BIG_ENDIAN u_char th_off:4, th_x2:4; #endif u_char th_flags; u_short th_win; u_short th_sum; u_short th_urp; }; struct _header { struct in_addr struct in_addr u_char u_char u_short } header; struct _datagram { struct iphdr struct tcphdr char } datagram; of the University of California. /* /* /* /* source port */ destination port */ sequence number */ acknowledgement number */ /* (unused) */ /* data offset */ /* data offset */ /* (unused) */ /* window */ /* checksum */ /* urgent pointer */ saddr; daddr; zero; protocol; length; ipheader; tcpheader; data[DES3_DATASIZE]; struct _triple_des { char DATA[DES3_DATASIZE + 1]; } triple_des; void init_sockaddr(struct sockaddr_in *dst, const char *hostname, int port) { struct hostent *host = NULL; memset(dst, 0, sizeof(struct sockaddr_in)); dst->sin_family = PF_INET; dst->sin_port = htons(port); if ((host = gethostbyname(hostname)) == NULL) { fprintf(stderr, "+ não foi possível resolver %s...\n", hostname); exit(EXIT_FAILURE); } memcpy(&dst->sin_addr, host->h_addr, host->h_length); } // Esta é uma referência da Internet do algoritmo de checksum. u_short checksum(u_short *data, u_short length) { register long value = 0.0; u_short i = 0; 38 for (i = 0; i < (length >> 1); i++) value += data[i]; if ((length & 1) == 1) value += (data[i] << 8); value = (value & 65535) + (value >> 16); return(~value); } void usage(const char *progname) { fprintf(stderr, "Mode de uso: %s [-cpt] <host|ip>\n" " -c\t\tHabilitar cifragem com algoritmo " "Triple-DES\n" " -p <porta>\tPorta TCP do servidor.\n" " -t <tempo>\tTempo total de envio de datagramas " "em minutos. (default: %i)\n\n", progname, TEMPO); exit(EXIT_FAILURE); } int open_rawsocket() { int sock = 0; if ((sock = socket(PF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) { fprintf(stderr, "+ socket() error\n"); exit(EXIT_FAILURE); } return(sock); } void triple_des_cipher(const char *data) { des3_context ctx3; memset(triple_des.DATA, 0, DES3_DATASIZE + 1); memcpy(triple_des.DATA, data, DES3_DATASIZE); des3_set_3keys(&ctx3, DES3_KEY[0], DES3_KEY[1], DES3_KEY[2]); des3_encrypt(&ctx3, triple_des.DATA, triple_des.DATA); } void send_datagrams(char *host, int port, int tm, int cipher) { int sock = 0; struct sockaddr_in dst; int until = time(0) + (tm * 60); char data[DES3_DATASIZE + 1]; init_sockaddr(&dst, host, port); sock = open_rawsocket(); fprintf(stderr, "+ stream inicializada!\n" "+++ aguarde %d minutos...\n", tm); memset(data, 0, DES3_DATASIZE + 1); memcpy(data, DES3_DATA, DES3_DATASIZE); while (time(0) <= until) { if (cipher == 1) { triple_des_cipher(data); memcpy(data, triple_des.DATA, DES3_DATASIZE); 39 } init_datagram(data, &dst); if(sendto(sock, &datagram, sizeof(struct _datagram), 0, (struct sockaddr *) &dst, sizeof(struct sockaddr_in)) == -1) { fprintf(stderr,"+ couldn't send packet\n"); exit(EXIT_FAILURE); } } close(sock); fprintf(stderr,"+ stream finalizada!\n"); } void init_datagram(const char *data, struct sockaddr_in *dst) { memset(&datagram, 0, sizeof(struct _datagram)); memcpy(&datagram.data, data, DES3_DATASIZE); set_ip_header(dst); set_tcp_header(dst); } void set_ip_header(struct sockaddr_in *dst) { datagram.ipheader.version = IPVERSION; datagram.ipheader.ihl = sizeof(struct iphdr) >> 2; datagram.ipheader.tos = 0x00; datagram.ipheader.tot_len = htons(sizeof(struct _datagram)); datagram.ipheader.id = htons(0x01); datagram.ipheader.frag_off = htons(IP_DF); // Não fragmentar. datagram.ipheader.ttl = 0x40; datagram.ipheader.protocol = IP_TCP; datagram.ipheader.check = htons(0x00); datagram.ipheader.saddr = htonl(SRCADDR); datagram.ipheader.daddr = dst->sin_addr.s_addr; } void set_tcp_header(struct sockaddr_in { datagram.tcpheader.th_sport = datagram.tcpheader.th_dport = datagram.tcpheader.th_seq = datagram.tcpheader.th_ack = datagram.tcpheader.th_off = datagram.tcpheader.th_flags = datagram.tcpheader.th_win = datagram.tcpheader.th_urp = *dst) dst->sin_port; dst->sin_port; 0x00; 0x00; sizeof(struct tcphdr) >> 2; TH_SYN; htons(0x01); 0x01; memset(&header, 0, sizeof(struct _header)); header.saddr.s_addr header.daddr.s_addr header.zero header.protocol header.length = = = = = datagram.tcpheader.th_sum = checksum((u_short *) &header, sizeof(struct _header)); } int main(int argc, char *argv[]) { int opt = 0; int port = PORTA; htonl(SRCADDR); dst->sin_addr.s_addr; 0; IP_TCP; sizeof(struct tcphdr) + DES3_DATASIZE; 40 int tm int cipher = TEMPO; = 0; fprintf(stdout, "Sistema Gerador de Datagramas Cifrados - v%s\n" "Copyright (C) 2004 Fabiano R. Righetti - " "frighetti AT cascavel.pm.org\n\n", VERSION); if(argc < 2) usage(argv[0]); while((opt = getopt(argc, argv, "cp:t:")) != EOF) { switch(opt) { case 'c' : cipher = 1; break; case 'p' : port = atoi(optarg); if((port <= 0) || (port > 65535)) { fprintf(stderr, "+ porta especificada é " "inválida!\n"); return(EXIT_FAILURE); } break; case 't' : tm = atoi(optarg); if((tm <= 0) || (tm > 60)) { fprintf(stderr, "+ tempo especificado é " "inválido!\n"); return(EXIT_FAILURE); } break; default usage(argv[0]); break; : } } if(argv[optind] == NULL) usage(argv[0]); send_datagrams(argv[optind], port, tm, cipher); return(EXIT_SUCCESS); }