• Nenhum resultado encontrado

Método da cifragem degrau

No documento Criptografia Classica e Moderna (páginas 125-162)

SISTEMAS DE CRIPTOGRAFIA 6.0 – Criptografia Simétrica e Assimétrica

III. Método da cifragem degrau

Este método é utilizado para assegurar a continuidade contextual de blocos sucessivos de dados. Somente uma parte do bloco de dados é codificada de cada vez, e o sistema sobe efetivamente os degraus da mensagem. Pode se acomodar uma mensagem de qualquer tamanho, e os blocos de cifragem intermediários podem ser transmitidos individualmente ou isoladamente, dependendo das exigências de segurança do sistema.

Cifragem degrau

6.1.4.4 – Integridade da Mensagem

O segundo aspecto mais importante da segurança de dados refere-se à verificação da integridade da mensagem. Neste caso, deve assegurar-se de que os dados não foram corrompidos durante a transmissão ou a criptografia.

Existem duas maneiras de fazer isso.

I. Através do Checksum (valor de verificação): este é um dos métodos mais antigos usados para se assegurar de que os dados estão corretos. Ele fornece também uma forma de autenticação, já que um checksum inválido sugere que os dados foram comprometidos de alguma forma.

Um checksum pode ser determinado de duas maneiras.

O checksum de um pacote possui um byte. Um byte é composto de 8 bits, e cada bit pode estar em dois estados (0e 1), levando a um total de 256 (28) combinações possíveis. Como a primeira combinação é igual a zero, o valor máximo de um byte é de 255. Neste caso, ocorre o seguinte:

• Se a soma dos outros bytes no pacote a ser verificado é menor ou igual a 255, então o checksum contém aquele valor exato.

Se a soma dos outros bytes for maior que 255, então o checksum é o restante do valor total após ter sido dividido por 256.

Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7 Byte 8 Total Checksum 212 232 54 135 244 15 179 80 1151 127 1151 / 256 = 4,496 (arredonda-se para 4) 4 x 256 = 1024 1151 – 1024 = 127

II. Através do Cyclic Redundancy Check (CRC): estes possuem uma concepção semelhante ao checksum, mas utilizam a divisão polinomial para determinar o valor do CRC, que geralmente é de 16 ou 32 bits. A vantagem do CRC é que ele é muito preciso. Se um único bit estiver incorreto, o valor do CRC estará correto.

Tanto o checksum quanto o CRC são bons para prevenir eventuais erros na transmissão, mas fornecem pouca proteção a um ataque intencional aos seus dados.

6.1.4.5 – Os Algoritmos RC2212 e RC4

Os algoritmos RC2 e RC4 são funções para ciframento com chave de tamanho variável (variable-key-size cipher functions). Foram projetados por Ron Rivest, como alternativas ao DES, para rápida encriptação de grande volume de dados, sendo tão ou mais rápidos do que este.213

Podem ser mais seguros do que o DES devido à sua habilidade em usar chaves de comprimento longo (o que significa que podem ser menos seguros, se chaves curtas forem utilizadas). Ambos, RC2 e RC4 são muito compactos em termos de tamanho de código.

O RC4 (Ron’s Cipher 4) foi criado por Ronald Rivest em 1987. No início foi mantido em sigilo, porque era propriedade da RSA Security. Tornou-se público em 1994.

Ele é uma cifra de fluxo simétrica com chave de tamanho variável (variable-key- size symmetric stream cipher); ou seja, o RC4 é apenas uma forma de gerar bytes aleatórios a partir de uma chave de tamanho variável. Estes bytes são então usados para encriptar uma mensagem através da operação lógica XOR. O destinatário executa o RC4 como o remetente, obtendo os mesmos bytes aleatórios, podendo assim decifrar a mensagem.

O RC4 é cerca de dez vezes mais rápido do que o DES em software. Sua principal vantagem é que ele é um algoritmo de fluxo, sendo um dos mais largamente usados.

6.1.4.5.1 – Expansão da Chave (KSA) no RC4

O RC4 recebe uma chave ch de nch bits, onde 1 nch 2048. Tem-se que gerar um vetor S de 256 bytes, a partir da chave:

S = (s0, s1, s2, ... , s255)

212 O algoritmo RC2 será visto à frente, por ser cifra de blocos.

Para tanto, utiliza-se o seguinte algoritmo: 1. Para i de 0 a 255, faz-se

a.si := i

2. Seja o vetor de 256 bytes (2048 bits) K = (k0, k1, ... , k255)

3. Copia-se a chave ch para K bit a bit , repetindo-a quantas vezes forem necessárias para preencher K completamente. Por exemplo, se nch=100 copia-se a chave 20 vezes para K, e coloca-se os 48 primeiros bits de ch no fim de K para preenchê-lo. 4. j:=0 5. Seja t um byte. 6. Para i de 0 a 255 faz-se: a. j:=(j+si+ki) mod(256) b. t:=si c. si :=sj d. sj :=t

Note-se que, na realidade, S é uma permuta dos números de 0 a 255, determinada pela chave.

O algoritmo do RC4 (PRGA):

Para gerar os bytes aleatórios tem-se o seguinte algoritmo: 1. i:=0

2. j:=0

3. Seja t um byte

4. Enquanto foram necessários bytes b aleatórios, faz-se: a. i:=(i+1) mod(256) b. j:=(j+si) mod(256) c. t:=si d. si :=sj e. sj:=t f . t :=(si + sj) mod(256) g. b:=st

h. o byte aleatório será o b

Note-se que o vetor S muda à medida que se vão gerando bytes aleatórios. Isto contribui para a força do algoritmo.

6.1.5 – Algoritmos por Cifras em Blocos214

Chama-se transformação de produto à aplicação sucessiva de códigos de substituição e transposição em que grandes blocos de dados podem ser transformados como uma unidade, aumentando deste modo o número possível de padrões de substituição e reordenação.

As cifras por blocos processam blocos de informação de comprimento fixo de uma só vez, concatenando-os no final do processo.215 Neste caso, normalmente são usados blocos de 64 ou 128 bits.216

No caso da cifra da figura anterior, o tamanho do bloco é de 64 bits. Como o arquivo não é múltiplo de 64 bits, um enchimento (padding) é inserido no bloco 5. Cabeçalhos inseridos no arquivo cifrado devem informar qual foi o algoritmo usado, qual o tamanho de bloco e qual o tamanho real do arquivo, para que o padding possa ser descartado quando da desencriptação.

Não é possível cifrar menos do que o tamanho de um bloco. Os algoritmos que operam com blocos efetuam operações de substituição e transposição simultaneamente.

O seu processamento é consideravelmente mais lento do que o processo de cifras de fluxo.217 Por esta razão, a operação com blocos normalmente é um compromisso entre a eficiência da transmissão e a complexidade da implementação.

As cifras em blocos são melhores para criptografar dados estáticos, quando já se sabe antecipadamente o tamanho e se pode dividir em blocos de M bits.

214 Cifra em Blocos; Blocos de Cifras; ou Cifrador de Blocos: do inglês Block-cipher, são usados como

termos equivalentes.

215 A mensagem é partida em blocos do comprimento requerido. Cada bloco deve ser cifrado de cada vez,

e o conjunto de operações matemáticas envolvendo a chave é repetido a cada bloco.

216 Normalmente são utilizados blocos de 64 bits; o algoritmo AES , aprovado pelo NIST em dezembro

de 2001 usa blocos de 128, 192 ou 256 bits e chaves de 128, 192 ou 256 bits. Os algoritmos de chave simétrica raramente são usados sozinhos.

217 Por exemplo, com 64 bits, seria como operar 264 substituições de um alfabeto. O DES, por exemplo, é

6.1.5.1 – Operação das Cifras de Blocos218

Um problema que pode surgir com cifras em bloco é a existência de blocos repetitivos que acabam por criar um padrão. Para evitar o reconhecimento de padrões repetitivos (e para garantir a confidencialidade) usam-se alguns modos de operação de blocos de cifra, que se verão a seguir.219

I – Modo Livro de Códigos (Electronic Code Book - ECB)

Este é o modo de operação mais simples. Por este método, cada bloco da mensagem original é dividida em blocos de tamanho adequado e cifrado isoladamente, para produzir os blocos da mensagem cifrada. No final, os blocos são concatenados na mesma ordem. Um bloco típico tem 64 bits, o que produz um livro de códigos de 264 entradas. Além disso, para cada chave possível existe um livro de códigos diferentes.

Cifração modo ECB

Decifração modo ECB

A vantagem deste método é a simplicidade e a independência entre os blocos. Há algumas desvantagens, como, por exemplo:

• Blocos de texto claro iguais produzem também blocos cifrados iguais, ou seja, o método não esconde o padrão dos dados. Assim, um criptoanalista pode começar a compilar um livro de códigos, ainda que não conheça a chave.

• Este modo de operação não acrescenta nada à confidencialidade proporcionada pela cifra.

218 Ver: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation.

219 A maioria apenas confere confidencialidade; alguns proporcionam confidencialidade e autenticação.

Alguns modos combinados, tais como CCM, EAX, GCM, IAPM e OCB garantem tanto a confidencialidade quanto a integridade da informação.

• Há um outro problema, que a repetição de bloco (blocos idênticos da mensagem original vão produzir blocos cifrados idênticos), de onde um atacante ativo pode alterar parte de uma mensagem criptografada sem saber a chave e nem mesmo o conteúdo que foi modificado.220

II – Modo Encadeamento de Blocos (Cipher Block Chaining - CBC)

No modo de operação Cipher-Block Chaining - CBC (corrente de blocos), é feita uma operação entre cada novo bloco de texto claro com o bloco cifrado obtido na etapa anterior.221 Por esta forma, cada um dos blocos cifrados depende de todos os blocos de texto claro anteriores.

A operação mais utilizada é o XOR com o bloco anterior; assim, os blocos iguais serão normalmente cifrados de forma diferente, desde que no mínimo um dos blocos anteriores seja diferente da mensagem. Entretanto, duas mensagens iguais serão mapeadas para os mesmos blocos e duas mensagens com início igual serão cifradas da mesma forma, até que ocorra a diferença. Para evitar esse problema, utiliza-se um vetor de inicialização distinto para cada mensagem. Também é utilizado um vetor de inicialização para iniciar o processo, já que não existe texto cifrado para o bloco inicial.

Cifração modo CBC

Decifração modo CBC

O CBC é um dos modos de operação mais utilizados. Sua maior desvantagem é ser sequencial. Como não pode ser usado em paralelo (pois sempre depende do

220 Pode-se, por exemplo, interceptar uma transação bancária de transferência de saldo. A seguir, faz-se

uma transferência de saldo de uma conta para a conta do atacante e intercepta-se a mensagem. Assim, pode-se identificar os blocos correspondentes ao destinatário e dessa forma substituir em todas as mensagens o destinatário pelo atacante. O modo ECB também pode fazer com que protocolos sem proteção de integridade se tornem ainda mais vulneráveis a ataques, como ataques de replay.

221 O CBC realimenta a cifragem do último bloco com o resultado das cifragens dos blocos anteriores (do

resultado anterior), seu uso dificulta o processamento de blocos em paralelo, o que melhoraria o desempenho do método.

O PCBC - Propagating cipher-block chaining (modo de operação corrente de blocos em propagação)222 foi projetado para propagar ou esparramar melhor que o CBC pequenas alterações no texto cifrado. As rotinas de cifragem e decifração são as seguintes:

O vetor de inicialização é .

III – Modo Realimentação de Cifra (Cipher Feedback Block – CFB)

Quando há necessidade de enviar mensagens de tamanho menor que um bloco, usa-se o método CFB, o qual trabalha com grupos (por exemplo, de 8 bits - um caracter). Neste modo, cada bloco de texto cifrado antecedente é codificado, e o resultado é combinado com o bloco de texto plano através do operador XOR para produzir o bloco cifrado atual.223 Também se utiliza um vetor de inicialização para iniciar o processo. Uma cifra de bloco operando no modo CFB não pode ser usada como um gerador de números randômicos.

Com o Cipher Feedback um bloco de fluxo de chave é calculado cifrando-se o bloco de texto cifrado anterior.

Cifração modo CFB

222 É usado quase que exclusivamente nos algoritmos Kerberos e WASTE.

Decifração modo CFB

IV – Modo Realimentação do Bloco de Saída (Output Feedback Block – OFB) O modo Output Feedback (OFB) transforma uma cifra de bloco num gerador de números pseudo-aleatórios. O texto cifrado realimenta a cifra de bloco e este processo é repetido para produzir um fluxo de bits pseudo-randômicos.

O fluxo de bits é totalmente determinado pelo algoritmo, pela chave, por um vetor de inicialização e pelo número de bits que realimentam a cifra em cada etapa. Ele pode então servir para fazer uma operação XOR com o texto claro, a fim de produzir o texto cifrado, transformando efetivamente a cifra de bloco numa cifra de fluxo.

Este modo é muito similar ao anterior, exceto pelo fato de que a quantidade de XOR com cada bloco de texto plano é gerada independentemente do bloco de texto plano ou do bloco de texto cifrado.

O modo OFB gera o próximo bloco de fluxo de chave cifrando o bloco de fluxo de chave anterior:

Decifração modo OFB

V – Modo de Operação Contador (Counter – CTR). Assim como o OFB, o CTR transforma a cifra de bloco numa cifra de fluxo. Ele cria o próximo bloco de fluxo de chave cifrando os valores sucessivos de um contador. Este contador pode ser qualquer função simples que produza uma sequência que só será repetida depois de um longo intervalo de tempo. Apesar dessa exigência, os contadores simples são os mais utilizados.

O modo CRT possui características muito semelhantes às do OFB, porém permite um acesso randômico na decifração, e é comprovadamente seguro se a cifra de bloco também for segura.

Cifração modo CTR

Decifração modo CTR

6.1.5.2 – Proteção de Integridade e Propagação de Erro

Os modos de operação das cifras de bloco mostrados não proporcionam qualquer proteção de integridade. Isto significa que um atacante, ainda que conheça a chave, pode modificar o fluxo de dados de acordo com as suas necessidades. Atualmente é sabido

que, sempre que houver uma cifragem de dados, é também essencial que se adicione uma proteção de integridade para garantir a segurança.

Em operações seguras, o VI (vetor de inicialização) e o texto cifrado gerado através destes modos de operação deveriam ser autenticados com um MAC224 (ver item 11.3.2.6.1) que deve ser checado antes de se efetuar uma decifração.

Antigamente era comum a discussão da propagação de erros dos modos de operação. Observou-se, por exemplo, que um erro em um dos blocos cifrados transmitidos resultaria num erro em apenas um dos blocos de texto claro recuperado se fosse usado o modo ECB, enquanto que no modo CBC o erro afetaria dois blocos.

Propagação de erro no modo CBC

6.1.5.3. – O Vetor de Inicialização – VI

Com exceção do modo de operação ECB, todos os outros requerem um vetor de inicialização. Este vetor é uma espécie de bloco pequeno (dummy block) cuja função é inicializar o processo para o primeiro bloco. Além disso, ele adiciona um elemento randômico ao processo.

O VI não precisa ser secreto, mas é importante que o mesmo VI não seja re- utilizado com a mesma chave. Nos modos CBC e CFB, a re-utilização de VIs deixa vazar algumas informações. Nos modos OFB e CTR, VIs repetidos destroem totalmente a segurança. Já no modo CFB, o VI precisa ser gerado randomicamente e ser mantido em segredo, até que o primeiro bloco de texto claro esteja pronto para ser cifrado.

* * *

A grande maioria dos algoritmos criptográficos atuais são cifras de bloco. As cifras de fluxo, que convertem o texto claro em texto cifrado bit a bit, são atualmente pouco pesquisadas e pouco utilizadas. A razão disso é que elas dependem de geradores randômicos de chaves que, apesar da aparente simplicidade, são difíceis de implementar através de software ou de hardware.225

224 MAC: Message authentication code.

225 A partir da década de 1960 extensas pesquisas sobre segurança criptográfica por computador

determinaram o surgimento de uma série de técnicas que usam uma combinação de lógica de hardware e de rotinas programadas (software).

6.1.5.4 – Sistema de Código em Blocos de Feistel-Notz-Smith

Neste sistema, as substituições são realizadas sob o controle de uma chave de código, e as transposições são feitas seguindo uma seqüência fixa. A substituição, a transposição e uma adição módulo-2 são fatores do código de produto. Este é aplicado ao texto claro várias vezes, produzindo um bloco do texto cifrado do mesmo tamanho do texto claro original.

Modo de operação (cf. Katzan, Jr.):

1. A chave do código contém uma seqüência de número fixo de bits; esta é a chave que pode ser obtida a partir do arquivo ou tabela de chaves. 2. O registrador de deslocamento contém as filas superior e inferior; a

mensagem do texto claro é armazenada no registrador de deslocamento. A fila inferior do registro de deslocamento pode ser lida (para os registros C1 e C2 sem alterar o conteúdo do registrador de deslocamento).

3. Os registros C operam sob o controle de bits na chave do código. Eles são movidos tanto diretamente para baixo ou para cima como um bloco. 4. Os bits passam então por uma transformação não linear226 de modo

que cada quatro bits de entrada podem ser convertidos em quatro bits de saída.

5. Uma outra transposição é realizada – agora, quaisquer bits da mensagem podem ser transpostos.

6. Por fim, os segundos 64 bits da chave do código são somados do módulo-2 para a mensagem, e o resultado é adicionado à metade superior do registrador de deslocamento (shift-register). A metade superior e a metade inferior do registrador de deslocamento são trocadas entre si e a chave do código é girada de uma posição.

7. O processo completo é repetido tanto em número fixo como variável de vezes (chamados rounds – ou rodadas).227

Estes conceitos foram implementados em um sistema experimental de comunicações de dados pela IBM, sendo que o sistema em blocos era projetado em uma unidade de hardware chamada Lúcifer, anexada ao dispositivo terminal do computador.

Uma versão de software da unidade de código permanece no computador, como um programa de código. Assim que a autorização adequada é verificada através do uso do arquivo de senhas, uma chave de código é selecionada a partir de um arquivo de chaves de código para uso pelo programa de código.

226 Atualmente, define-se as substituições como transformações não lineares, realizadas em S-Box, para

garantir a confusão. Quanto às transposições, elas são realizadas por permutações nas P-Box, para garantir difusão.

227 Este método (atribuído a Horst Feistel), muito usado atualmente nas cifras simétricas, é baseado em

rounds repetidos. Os bits a serem codificados são divididos em duas partes, P1 e P2. P1 fica inalterado, e P2 é adicionado a uma função misturada de sentido único f (variado por uma chave) de P1. Os dois resultados então são trocados (isto é chamado de um round). A chave p1 e a chave p2 são vetores do bit; “,” é um operador da concatenação e f é uma função (p1, p2 → p2’, p1) tanto que p2’ = p2 + f(p1,key). Desde que a saída do round tenha acesso ao valor P1, e sendo a adição uma operação reversível, então esta operação pode ser desfeita, para toda função f de um único sentido (one-way). Para decifrar rounds múltiplos, cada um é desfeito na ordem inversa (ou seja, para a decodificação, as chaves são aplicadas em ordem inversa). Após vários rounds (entre 8 e 64) de processamento, e se a chave for suficientemente longa, ataques pela força bruta podem se tornar inviáveis.

O sistema de códigos em blocos desenvolvido por Feistel-Notz-Smith está representado a seguir.

Sistema de código em blocos de Feistel-Notz-Smith

6.1.5.4.1 – Estrutura Genérica da Cifra de Feistel

O diagrama a seguir mostra a estrutura genérica de uma Cifra de Feistel, um esquema que é usado na grande maioria das cifras de bloco modernas.228

228 A implementação de cifras em blocos pode ser feita utiliazando: rede Feistel (Feistel network); Key

A entrada é quebrada em dois blocos de mesmo tamanho, geralmente chamados de esquerdo (L - Left) e direito (R - Right), que são repetidamente operados em ciclos através do algoritmo. Em cada ciclo, uma função hash (f) é aplicada no bloco direito e na chave, e o resultado do hash é usado para fazer um XOR com o bloco esquerdo. Depois disto, os blocos são trocados. O resultado do XOR torna-se o novo bloco direito e o bloco direito inalterado torna-se o bloco esquerdo. O processo é então repetido algumas vezes.

Cifra de Feistel - Genérica

A função hash é somente um misturador de bits.229 A operação correta do algoritmo se baseia na propriedade determinística da função hash, ou seja, se processar exatamente as mesmas entradas, o resultado será sempre o mesmo.

Na decifração, o texto cifrado é dividido em blocos esquerdo e direito. A chave e o bloco bloco direito são submetidos à função hash para se obter o mesmo resultado hash usado no último ciclo da cifragem, sendo que o bloco direito permanece inalterado no último ciclo da cifragem. Em seguida, é feito um XOR entre o hash e o bloco esquerdo para reverter o último ciclo da cifragem e o processo é repetido até que todos os ciclos tenham sido revertidos.

229 O hash é um valor obtido pelo processamento da senha, valor que varia de 128 a 512 bits. A função

que gera o hash não tem inversa, o que quer dizer que, mesmo possuindo o valor do hash, é impossível obter a senha original.

A segurança de uma cifra de Feistel depende essencialmente do tamanho da chave e da irreversibilidade da função hash. O ideal é que o resultado da função hash

No documento Criptografia Classica e Moderna (páginas 125-162)