Algoritmos de Codificação Simétricos Hugo Valente e Ivo Navega – SSI – TPC1 1. A rede de Feistel1 consiste numa cifra de bloco com uma estrutura específica, a qual permite tirar vantagem do facto de puder ser usada quer para codificar dados quer para descodifica-los apenas usando as chaves, que são aplicadas em cada ronda à função f, por ordem inversa. Inicialmente começa-se por dividir o bloco de dados a codificar em dois blocos de tamanho igual, L0 e R0. Em cada ronda, um dos blocos é processado por uma função f, utilizando também uma chave. O resultado desta função é então combinado, através de uma operação XOR, com o outro bloco e os dois blocos são trocados, excepto na última ronda. Na última ronda os dois blocos não são trocados, sendo isto o que permite que a codificação e descodificação passem pela mesma estrutura de blocos, apenas aplicando as chaves por ordem inversa. Estas operações podem ser traduzidas pelas seguintes expressões: Para cada ronda de i igual a 1 até n, Codificação: Li = Ri −1 Descodificação: Ri −1 = Li Ri = Li −1 ⊕ f ( Ri −1 , K i ) Li −1 = Ri ⊕ f ( Li , K i ) Sendo f a função que efectua as operações de substituição e permutação e Ki a sub-chave da ronda. A alteração das expressões da codificação para a descodificação deve-se ao facto do texto cifrado à saída da última ronda ser igual a RnLn, o qual vai ser utilizado como input na primeira ronda do processo de descodificação. 1.1 Pretende-se demonstrar o funcionamento da estrutura da rede de Feistel, usando uma rede com 3 rondas, assumindo que em vez de se usar uma chave para cada ronda, usa-se uma função diferente: F1, F2 e F3. 1 Designada pelo nome do seu inventor, Horst Feistel, criptógrafo da IBM 1 Figura 1 – Codificação através de rede de Feisel Figura 2 – Descodificação através de rede de Feisel De seguida são apresentados os cálculos que permitem comprovar o que se pretende demonstrar. Começando pelo processo de codificação com o bloco de entrada igual a L0R0: Ronda 1 L1 = R0 (1) R1 = L0 ⊕ F1 (2) Ronda 2 L2 = R1 (3) R2 = L1 ⊕ F2 (4) Ronda 3 L3 = R2 (5) R3 = L2 ⊕ F3 (6) 2 Passando para o processo de descodificação, para o qual o bloco inicial será o bloco obtido no processo de codificação, R3L3. Ronda 1 L2 = R3 ⊕ F3 R2 = L3 Substituindo R3 e L3 pelas expressões (6) e (5) respectivamente e reduzindo a expressão2, L2 = L2 ⊕ F3 ⊕ F3 ⇔ L2 = L2 R 2 = R2 Ronda 2 L1 = R2 ⊕ F2 R1 = L2 Substituindo R2 e L2 pelas expressões (4) e (3) respectivamente e reduzindo a expressão, L1 = L1 ⊕ F2 ⊕ F2 ⇔ L1 = L1 R1 = R1 Ronda 3 L0 = R1 ⊕ F1 R0 = L1 Substituindo R1 e L1 pelas expressões (2) e (1) respectivamente e reduzindo a expressão, L0 = L0 ⊕ F1 ⊕ F1 ⇔ L0 = L0 R0 = R0 Como queríamos demonstrar. 1.2 Pretende-se demonstrar o mesmo, mas usando uma rede com 2 rondas, assumindo que em vez de se usar uma chave para cada ronda, usa-se uma função diferente: F1 e F2. 2 Independentemente do valor de Fn, aplicando a operação de XOR a ele próprio obtém-se uma sequência de 0’s, o que na operação XOR funciona como o elemento neutro, por isso simplica-se a expressão. 3 Figura 3 – Codificação através de rede de Feisel Figura 4 – Descodificação através de rede de Feisel Começando pelo processo de codificação com o bloco de entrada igual a L0R0: Ronda 1 L1 = R0 (1) R1 = L0 ⊕ F1 (2) Ronda 2 L2 = R1 (3) R2 = L1 ⊕ F2 (4) Passando para o processo de descodificação, para o qual o bloco inicial será o bloco obtido no processo de codificação, R2L2. Ronda 1 L1 = R2 ⊕ F2 R1 = L2 Substituindo R2 e L2 pelas expressões (4) e (3) respectivamente e reduzindo a expressão, L1 = L1 ⊕ F2 ⊕ F2 ⇔ L1 = L1 R1 = R1 4 Ronda 2 L0 = R1 ⊕ F1 R0 = L1 Substituindo R1 e L1 pelas expressões (2) e (1) respectivamente e reduzindo a expressão, L0 = L0 ⊕ F1 ⊕ F1 ⇔ L0 = L0 R0 = R0 Como queríamos demonstrar. Concluindo-se que a estrutura da rede de Feistel funciona para um qualquer número de rondas de 1 até um valor n, seja esse número par ou ímpar. 3. Os algoritmos de criptografia simétrica podem ser divididos em cifras de stream e cifras de bloco. Cifras de stream encriptam um bit de cada vez, ao passo que as cifras de bloco operam em grupos de bits de um tamanho pré-definido (normalmente blocos de 64 bits ou 128 bits) de uma só vez. 3.1 Pretende-se apresentar uma vantagem e uma desvantagem de um destes tipos em relação ao outro. Indicando para cada um deles uma aplicação. As cifras de stream são normalmente executadas a velocidades mais elevadas e apresentam menos complexidade ao nível do hardware quando comparadas com as cifras em bloco, no entanto este tipo de cifras são susceptíveis a graves problemas de segurança se usadas incorrectamente, em particular no que toca ao estado inicial, uma vez que este nunca deve ser usado mais que uma vez. As cifras de stream funcionam com uma chave de normalmente 128 bits e com base nesta geram números pseudo-aleatórios (PRNG) que são combinados com a informação a cifrar (da mesma forma como é feito com o one-time pad abordado nas aulas), no entanto como o número gerado é pseudo aleatório e não puramente aleatório isto significa que é possível que uma cifra de stream possa ser insegura. As cifras de stream são usadas em aplicações em que a quantidade de informação a codificar é desconhecidas, como por exemplo uma conexão wireless segura, pois se uma cifra de bloco fosse usada neste tipo de aplicação, o programador teria de escolher entre eficiência de transmissão ou complexidade da implementação uma vez que as cifras de bloco não podem trabalhar directamente em blocos menores que o seu tamanho de bloco. Por exemplo se uma cifra de bloco com 128 bits recebesse informação com 32 bits de comprimento, três quartos da informação seria padding, e as cifras de bloco teriam de usar certos modos, alguns dos quais complexos, como a terminação residual de bloco para lidar com o padding. As cifras de bloco são usadas em situações em que é preferível robustez ao nível da segurança em detrimento da perda de alguma velocidade quando comparada com as cifras de stream, sendo usadas por exemplo para codificação de discos rígidos. 5 Figura 5 – Esquema de codificação com cifra de stream 3.2 Pretende-se mostrar que usando o modo apropriado é possível transformar uma cifra de tipo bloco numa cifra de tipo stream. As cifras de bloco operam sobre blocos de bits de tamanho fixo, no entanto podem ser usadas certas técnicas ou modos operacionais para permitir que a cifra de bloco seja também aplicada a informação de tamanho arbitrário. Destas técnicas destacam-se o cipher feedback (CFB) e o output feedback (OFB), porque permitem que uma cifra de bloco seja transformada numa cifra de tipo stream, pois geram uma KeyStream (numero aleatório) com a qual aplicam a operação ou exclusivo à informação a cifrar. No CBF a KeyStream é gerada cifrando a informação cifrada pelo bloco anterior Figura 6 – Exemplo da codificação com a Cifra de Bloco modo CFB 6 No OFB o próximo KeyStream é obtido através da encriptação do KeyStream anterior. Figura 7 – Exemplo da codificação com a Cifra de Bloco modo OFB Podemos realçar que a cifra de bloco CFB é idêntica a cifra de stream com auto sincronização uma vez que o receptor sincroniza-se automaticamente com o gerador da KeyStream depois de receber os N dígitos cifrados, sendo portanto mais fácil recuperar se dígitos forem perdidos ou acrescentados à mensagem, ao passo que a cifra de bloco no modo OFB é identico a cifra de stream sincrona, pois o emissor e o receptor precisam estar exactamente no mesmo passo para a encriptação ser bem sucedida e se digitos forem acrescentados ou removidos da mensagem durante a transmissão, a sincronização é perdida. 7 Referências [1] “Feistel cipher”, Wikipedia, http://en.wikipedia.org/wiki/Feistel_network [2] “Data Encryption Standard”, MathDaily, http://www.mathdaily.com/lessons/Data_Encryption_Standard [3] “Block cipher”, Wikipedia, http://en.wikipedia.org/wiki/Block_cipher [4] “Block cipher modes of operation”, Wikipedia, http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation [5] “Stream cipher”, Wikipedia, http://en.wikipedia.org/wiki/Stream_cipher [6] “Overview of Cryptography”.Garry Kessler, http://www.garykessler.net/library/crypto.html 8