Algoritmos de Codificação Simétricos

Propaganda
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
Download