terça-feira, 5 de maio de 2009

Funcionamento do TKIP e AES

Para quem ainda não entregou o trabalho do professor Fábio, aqui vai uma ajudinha.


> AES Advanced Encryption Standard

A medida que começou a se aproximar do fim de sua vida útil, mesmo com DES triplo, o NIST (National Institute od Standards and Tecnology), o órgão do departamento do comércio dos EUA encarregado de aprovar padrões para o Governo Federal dos EUA, decidiu que o governo precisava de um novo padrão criptográfico para uso não confidencial. O NIST estava ciente de toda a controvérsia que cercava o DES e sabia muito bem que, se anunciasse um novo padrão, todas as pessoas que soubessem algo sobre criptografia concluiriam automaticamente que a NSA havia criado uma porta dos fundos no DES, e assim a NSA poderia ler tudo que fosse criptografado com ele. Sob essas condições, talvez ninguém ultilizasse o padrão e seria mais provável que ele desaparecesse. Dessa forma, O NIST adotou uma estratégia diferente e surpreendente para um órgão do governo: patrocinou um concurso de criptografia. Em janeiro de 1997, pesquisadores do mundo inteiro foram convidados a submeter propostas para um novo padrão, a ser chamado AES (Advanced Encryption Standard).

Foram feitas quinze propostas sérias e foram organizadas conferências públicas nas quais essas propostas eram apresentadas, e os participantes eram encorajados ativamente a encontrar falhas em todas elas. Em agosto de 1998, o NIST selecionou cinco finalistas, baseado principalmente em seus requisitos de segurança, eficiência, simplicidade, flexibilidade e memória (importante para sistemas incorporados). Foram realizadas outras conferências e mais tentativas de encontrar falhas nos algoritmos. Na última conferência, houve uma votação sem compromisso. Os finalistas e suas pontuações foram:

1. Rijndael (de Joan Daemen e Vincent Rijmen, 86 votos).

2. Serpent (de Ross Anderson, Eli Biham e Lars Knudsen, 59 votos).

3. Twofish (de uma equipe liderada por Bruce Schneier, 31 votos).

4. RC6 (da RSA Laboratories, 23 votos).

5. MARS (da IBM, 13 votos).

Em outubro de 2000, o NIST anunciou que também votou no Rijndael e, em novembro de 2001, o Rijndael se tornou um padrão do Governo dos Estados Unidos publicado como Federal Information Processing Standard FIPS 197. Devido à extraordinária abertura da competição, às propriedades técnicas do Rijndael e ao fato de que a equipe premiada consis tia em dois jovens criptógrafos belgas (com pouca probabilidade de terem criado uma porta dos fundos só para agradar a NSA), esperava-se que o Rijndael se to rnasse o padrão criptográfico dominante no mundo por pelo menos uma década. O nome Rijndael deriva dos sobrenomes dos autores: Rijmen + Daemen. O Rijndael admite tamanhos de chaves e tamanhos de blocos desde 128 bits até 256 bits em intervalos de 32 bits. O comprimento da chave e o do bloco podem ser escolhidos independentemente. Porém, o AES especifica que o tamanho do bloco deve ser 128 bits e o comprimento da chave deve ser 128, 192 ou 256 bits. É pouco provável que alguém utilize chaves de 192 bits; assim, de fato, o AES tem duas variantes: um bloco de 128 bits com uma chave de 128 bits e um bloco de 128 bits com uma chave de 256 bits. Em nosso tratamento do algoritmo apresentado a seguir, examinaremos apenas o caso de 128/128, porque é provável que esse se torne a norma comercial. Uma chave de 128 bits oferece um espaço de chaves de 2128~3x1038 chaves. Ainda que o NSA consiga construir uma máquina com um bilhão de processadores paralelos, cada um capaz de avaliar uma chave por picos segundo, tal máquina levaria cerca de 1010 anos para pesquisar o espaço de chaves. Nessa época, o sol já terá explodido e as pessoas que sobreviverem terão de ler os resultados a luz de vela.

Rijndael

Sob uma perspectiva matemática, o Rijndael se baseia na teoria de campo de Galois, que proporciona ao algoritmo algumas propriedades de segurança demonstráveis. Porém, ele também pode ser visto como código em C, sem a necessidade de entrarmos nos detalhes matemáticos. Como o DES, o Rijndael utiliza substituição e permutações, e também emprega várias rodadas. O número de rodadas depende do tamanho da chave e do tamanho do bloco, sendo 10 para chaves de 128 bits com blocos de 128 bits, passando para 14 no caso da maior chave ou do maior bloco. No entanto, diferente do DES, todas as operações envolvem bytes inteiros, a fim de permitir implementações eficientes, tanto em hardware quanto em software.

A função rijndael tem três parâmetros. Esses parâmetros são: plaintext, um array de 16 bytes contendo os dados de entrada, ciphertext, um array de 16 bytes no qual será retornada a saída cifrada e key, a chave de 16 bytes. Durante o cálculo, o estado atual dos dados é mantido no array de bytes state, cujo tamanho é NROWS NCOLS. No caso de blocos de 128 bits, esse array tem 44 bytes. Em 16 bytes, é possível armazenar todo o bloco de dados de 128 bits. O array state é inicializado como o texto simples e modificado por cada etapa da computação. Em algumas etapas, é executada a substituição byte a byte. Em outras etapas, os bytes são permutados dentro do array. Outras transformações também são usadas. No final, o conteúdo do

array state é retornado como texto cifrado. O código começa expandindo a chave em 11 arrays do mesmo tamanho que o estado. Eles são armazenados em rk, um array de structs, cada uma contendo um array de estado. Um desses arrays será utilizado no início do cálculo, e os outros 10 serão usados durante as 10 rodadas, um por rodada. O cálculo das chaves de rodadas a partir da chave de criptografia é muito complicado para ser examinado aqui. Basta saber que as chaves de rodadas são produzidas pela rotação e pela operação XOR repetida de vários grupos de bits da chave. Para ver todos os detalhes, consulte (Daemen e Rijmen, 2002). A próxima etapa é copiar o texto simples no array state de forma que ele possa ser processado durante as rodadas. O texto é copiado em ordem de colunas, com os quatro primeiros bytes na coluna 0, os quatro bytes seguintes na coluna 1 e assim por diante. Tanto as colunas quanto as linhas são numeradas a partir de 0, embora as rodadas se iniciem em 1. Há mais uma etapa antes do início da principal computação: rk[0] é submetido a uma operação XOR em state byte por byte. Em outras palavras, cada um dos 16 bytes em state é substituído pelo XOR do próprio valor com o byte correspondente em rk[0].

Agora chegou a hora da atração principal. O loop executa 10 repetições, uma por rodada, transformando state em cada repetição. O conteúdo de cada redonda consiste em quatro etapas. A etapa 1 efetua uma substituição byte a byte em state. Por sua vez, cada byte é usado como um índice para uma caixa S, a fim de substituir seu valor pelo conteúdo dessa entrada da caixa S. Essa etapa é uma cifra de substituição monoalfabética. Diferente do DES, que tem diversas caixas S, o Rijndael tem apenas uma caixa S. A etapa 2 gira cada uma das quatro linhas para a esquerda. A linha 0 é girada 0 bytes (isto é, não se altera), a linha 1 é girada 1 byte, a linha 2 é girada 2 bytes e a linha 3 é girada 3 bytes. A etapa 3 mistura cada coluna independentemente das outras. A mistura é realizada com o uso da multiplicação de matrizes, na qual a nova coluna é o produto da coluna antiga por uma matriz constante, sendo a multiplicação feita com o campo finito de Galois, GF (28). Embora isso possa parecer complicado, existe um algoritmo que permite calcular cada elemento da nova coluna usando duas pesquisas de tabelas e três operações XOR (Daemen e Rijmen, 2002, Apêndice E).

Finalmente, a etapa 4 efetua o XOR da chave correspondente a essa rodada no array state. Tendo em vista que cada etapa é reversível, a decodificação pode ser feita simplesmente executando-se o algoritmo no sentido inverso. Porém, também existe um artifício, pelo qual a decodificação pode ser realizada executando-se o algoritmo de criptografia com a utilização de tabelas diferentes. O algoritmo foi projetado não só por segurança, mas também para aumentar a velocidade. Uma boa implementação de software em uma máquina de 2 GHz deve ser capaz de alcançar uma taxa de criptografia de 700 Mbps, que é rápida o suficiente para codificar mais de 100 vídeos MPEG-2 em tempo real. As implementações de hardware são ainda mais rápidas.

Modos de Cifra

Apesar de toda essa complexidade, o AES (ou o DES, ou ainda qualquer cifra de bloco) é basicamente uma cifra de substituição monoalfabética que utiliza caracteres grandes (caracteres de 128 bits para AES, e caracteres de 64 bits para DES). Sempre que o mesmo bloco de texto simples chega ao front end, o mesmo bloco de texto cifrado sai pelo back end. Se codificar o texto simples abcdefgh 100 vezes com a mesma chave DES, você obterá o mesmo texto cifrado 100 vezes. Um intruso pode explorar essa propriedade para ajudar a subverter a cifra.

O modo Electronic Code Book

Para ver como essa propriedade das cifras de substituição mono alfabética podem ser usadas para anular parcialmente a cifra, usaremos o DES (triplo), por ser mais fácil representar blocos de 64 bits que blocos de 128 bits, mas o AES tem exatamente o mesmo problema. A maneira direta de usar o DES para codificar um longo fragmento de texto simples é dividi-lo em blocos consecutivos de 8 bytes (64 bits) e codificá-los uns após outros com a mesma chave. O último fragmento de texto simples é completado até 64 bits, se necessário. Essa técnica é conhecida como modo ECB (modo Electronic Code Book) em analogia aos antigos livros de código em que cada palavra de texto simples era listada, seguida por seu texto cifrado (em geral, um número decimal de cinco dígitos). Em um exemplo temos o início de um arquivo de computador listando as gratificações anuais que uma empresa decidiu oferecer a seus funcionários. Esse arquivo consiste em registros de 32 bytes consecutivos, um por funcionário, no formato mostrado: 16 bytes para o nome, 8 bytes para o cargo e 8 bytes para a gratificação. Cada um dos dezesseis blocos de 8 bytes (numerados de 0 até 15) é codificado pelo DES (triplo).

Modo de encadeamento de blocos de cifras

Para contrariar esse tipo de ataque, todas as cifras de blocos podem ser encadeadas de várias maneiras, para que a substituição de um bloco como a que Leslie fez transforme o texto simples decodificado em lixo, a partir do bloco substituído. Uma forma de encadeamento é o encadeamento de blocos de cifras. Nesse método, cada bloco de texto simples é submetido a uma operação XOR com o bloco de texto cifrado anterior, antes de ser codificado. Conseqüentemente, o mesmo bloco de texto simples não é mais mapeado para o mesmo bloco de texto cifrado, e a criptografia não é mais uma grande cifra de substituição mono alfabética. O primeiro bloco é submetido a uma operação XOR com um IV (Initialization Vector vetor de inicialização), escolhido ao acaso, que é transmitido (e m texto simples) juntamente com o texto cifrado.

Modo de feedback de cifra

No entanto, o encadeamento de blocos de cifras tem a desvantagem de exigir a chegada de um bloco de 64 bits inteiro para poder iniciar a decodificação. Quando é utilizado em terminais interativo s, nos quais as pessoas podem digitar linhas com menos de oito caracteres e parar à espera de uma resposta, esse modo é inadequado. No caso da codificação byte a byte, é usado o modo de feedback de cifra, empregando o DES (triplo). Para o AES, a idéia é exatamente a mesma, sendo usado um registrador de deslocamento de 128 bits. Sendo assim o estado da máquina de criptografia é mostrado após os bytes 0 a 9 terem sido codificados e enviados. Ao chegar o byte 10 do texto simples, o algoritmo DES opera sobre o registrador de deslocamento de 64 bits para gerar um texto cifrado de 64 bits. O byte mais à esquerda desse texto cifrado é extraído e submetido a uma operação XOR com P10. Depois, esse byte é encaminhado à linha de transmissão. Além disso, o registrador de deslocamento (shift register) é deslocado 8 bits à esquerda, fazendo C2 ficar fora da extremidade esquerda, e C10 é inserido na posição que acabou de ficar vaga na extremidade direita, logo depois de C9. Observe que o conteúdo do registrador de deslocamento depende de todo o histórico anterior do texto simples; assim, um padrão que se repetir várias vezes no texto simples será criptografado de maneira diferente do texto cifrado a cada repetição. Como ocorre no encadeamento de blocos de cifras, é necessário um vetor de inicialização para dar início ao processo. A decodificação com o modo de feedback de cifra funciona exatamente como a codificação. Em particular, o conteúdo do registrador de deslocamento é codificado e não decodificado, e assim o byte selecionado que é submetido à operação XOR com C10 para se obter P10 é o mesmo que sofreu a operação XOR com P10 para gerar C10 na primeira vez. Desde que os dois registradores de deslocamento permaneçam idênticos, a de codificação funcionar corretamente.



> TKIP

Temporal Key Integrity Protocol permite eliminar os problemas de confidencialidade e integridade apresentados pelo WEP. Basicamente, o TKIP é uma função geradora de chaves para o WEP. Funciona da seguinte forma: o dispositivo começa com uma chave-base secreta de 128 bits, chamada de TK (Temporal Key), então ela é combinada com o TA (Trasmitter Adderess), o endereço MAC do transmissor, criando a chave chamada TTAK (Temporal and Transmitter Address Key). A TTAK é então combinada com o IV (agora com 48 bits) para criar as chaves que variam a cada pacote, chamadas de RC4KEY. Cada chave é utilizada pelo RC4 para criptografar somente um pacote. Percebe-se através do exposto que cada estação, da mesma rede, utiliza uma chave diferente para se comunicar com ponto a ponto. Com o TKIP a colisãode chaves do RC4 foi resolvida. Afinal, antes do IV assumir novamente um valor X substitui-se o TK.


Fonte: Viva sem Fio

Nenhum comentário:

Postar um comentário

Seu comentario foi enviado com sucesso!