Você está na página 1de 17

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

T1530A, T7043A

VII.Algoritmos com Strings

Versão 0.0

Observação

Esta é a primeira versão desta apostila. Ela ainda deve passar por revisões adicionais para correção de erros de digitação, de português, além da correção de erros de formatação.

Este material não substitui a bibliografia indicada para a disciplina, devendo ser considerado como material complementar. Os alunos devem consultar a bibliografia indicada no final do texto.

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Sumário

VIII.Table of Contents

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

IX. Introdução

Muitas tarefas executadas em computação envolvem o manuseio de seqüências de caracteres. Entre elas podem ser citadas:

Criptologia.

Busca em strings

Busca de padrão

Compressão de dados

Em cada uma das áreas citadas existe um grande número de algoritmos cuja desempenho é fortemente dependente da freqüência de ocorrência de dados manipulados. Neste capítulo estudaremos alguns desses algoritmos.

1 Criptologia

O objeto de estudo da criptologia é a criação ou identificação de chaves que codificam mensagens

A criptologia está dividida em duas sub-áreas:

Criptografia,

voltada

mensagens, e

para

criação

de

métodos

para

codificar

(ou

cifrar)

e

decodificar

Criptoanálise, voltada para a criação de métodos para decifrar mensagens codificadas (sem o conhecimento prévio da chave utilzada para a codificação).

CHAVE (key) é um conceito fundamental em criptologia. As mensagens são cifradas a partir da utilização de uma chave. A natureza dessa chave está relacionada com o método de codificação.

Os algoritmos de criptografia podem ser classificados em termos de como se utilizam as chaves:

Criptografia simétrica: a mesma chave é utilizada para criptografar e decifrar a mensagem.

Criptografia assimétrica, também denominada criptografia de chave pública (public key): a chave para criptografar os daods (chave pública) é diferente da chave utilizada para decifrá-los (esta última denominada chave privada). As duas chaves trabalham em conjunto, de forma que somente uma chave privada específica pode decifrar os dados codificados com uma dada chave pública.

Aplicações:

Dinheiro digital: permite transações financeiras autenticadas, mas não rastreadas;

Cartões inteligentes (tipo de crédito): cartões plásticos que contem computadores e uma

pequenas quantidade de memória;

Provedores de autenticação: para resolver o problemas de duas pessoas conversando na rede

de modo seguro. As pessoas trocam chaves, de forma a ter certeza que a mensagem enviada seja

decifrada somente pelo ouvinte de destino autorizado;

e-mail: codificação de mensagens importantes;

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Segurança Nacional: Codificar pequenas mensagens ou mesmo documentos importantes.

Neste capítulo, nossa atenção estará voltada para um conjunto de métodos criptográficos.

Consideremos a seguinte mensagem:

A PROVA SERA DIFÍCIL

a qual utilizaremos para estudar alguns métodos de codificação (acentos, números e outros sinais gráficos não serão considerados, mas sua inclusão não traz dificuldades).

Codificação de Caeser

Neste método, a n-ésima letra do alfabeto é substituida pela (n+K)-ésima, onde K é uma constante (a chave).

Assim, se K = 3, a mensagem acima definida é codificada como segue:

DCSURYDCVHUDCGLILFLO

O processo completo, apesar de simples, é ilustrado a seguir. A tabela de conversão que usaremos

para acompanhar as substituições é a seguinte:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

 

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

Como comentado anteriormente, é possível estender esta tabela para considerar outros simbolos.

Codificação:

Mensagem original

A

 

P

R

O

V

A

 

S

E

R

A

 

D

I

F

I

C

I

L

Tradução para tabela

1

0

16

18

15

22

1

0

19

5

18

1

0

4

9

6

9

3

9

12

Chave (K)

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

Chave aplicada

4

3

19

21

18

25

4

3

22

8

21

4

3

7

12

9

12

6

12

15

Mensagem cifrada

D

C

S

U

R

Y

D

C

V

H

U

D

C

G

L

I

L

F

L

O

O algoritmo deve considerar o caso da aplicação da chave resultar um número maior que o tamanho

da tabela (no nosso exemplo, esse tamanho é 27). Por exemplo, se a aplicação da chave resulta 29,

subtrai-se 27, resultando 2.

Para decodificar a mensagem para executar o processo no sentido contrário, ou seja, subtrai-se da

mensagem cifrada o valor da chave. Se o valor resultante for menor que zero, soma-se 27.

Este algoritmo é um algoritmos simétrico, pois K (ou seja, a chave) é a mesma para cifrar e para

decifrar a mensagem.

O método de Caeser é, obviamente, muito fraco, pois bastam 27 tentativas para identificar a chave de

Prof. Angelo Passaro

página4

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

codificação. Mesmo que a tabela seja substancialmente maior, o tempo necessário para decifrar a chave (e portanto decifrar a mensagem) aumenta linearmente com o tamanho da tabela.

Tabela de substituição

Neste método é criada uma tabela com valores embaralhados, e a codificação é obtida por substituição, conforme ilustrado a seguir.

0

 

1 2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

 

A B

 

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T U

 

V

W

X

Y

Z

 

C

H

A

T

O

G

F

E

D

B

N

M

L

K

J

Z

V

X

W

U V

 

S

R

P

Q

I

Mensagem original : A PROVA SERA DIFÍCIL Mensagem codificada : C ZXJSC WOXC TDGDADM

Em princípio, o método é mais forte que a codificação de Caeser. Existem 27! (vinte e sete fatorial) > 10 28 opções de tabela de substituição.

Contudo, pode-se utilizar alguns estratagemas para desvendar o código:

freqüência de ocorrências de letras na mensagem versus freqüência na linguagem de origem;

ocorrência de dígrafos (em português: lh, nh, oe, ao, qu, mp, mb o que reduz em muito as tentativas para decifrar a mensagem.

)

Codificação de Viginere

A codificação de Viginere é um método simétrico. Neste método uma chave pequena é usada repetidamente determinando diferentes valores de K para cada letra da mensagem.

K

14

15

20

1

14

15

20

 

1 14

15

20

1 14

15

20

1

14

15

20

1

CHAVE

N

O

T

A

N

O

T

 

A N

O

T

A N

O

T

A

N

O

T

A

MENSAGEM

A

 

P

R

O

V

A

 

S

E

R

A D

 

I

F

I

C

I

L

TEXTO

O

O

I

S

B

J

U

A F

 

T

K

B N

S

B

G

W

R

B

M

CIFRADO

O algoritmo é apresentado a seguir. Neste algoritmo, pressupõe-se que o vetor de mensagem original permanece inalterado e que o número de elementos na tabela de conversão, denominado n_tabela, é conhecido. Neste algoritmo supomos a tabela de conversão apresentada no algoritmo de Caeser com um total de 27 elementos, incluíndo o espaço em branco.

Dados de entrada:

Mensagem, Chave : Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

nm, nc : inteiros (* número de caracteres da mensagem e da chave, respectivamente *) (* VAL e STR são funções que transformam caractere em número e vice-versa, utilizando a tabela de conversão *)

Viginere (Mensagem, Chave: String, nm, nc : inteiro) : String declaração de variáveis i, índice_chave : inteiro n_tabela : inteiro

chave_num [1

mens_cifrada : String

val_car : inteiro

nc]:inteiro { chave transformada em número inteiro, caractere a caractere }

{ carctere convertido em inteiro }

início

 

n_tabela = 27; para i = 1 até nc faça

chave_num[i] = VAL(Chave[i]);

indice_chave = 1;

para i = 1 até nm faça inicio para val_car = VAL(Mensagem[i]); val_car = val_car + chave_num[indice_chave];

se val_car > n_tabela então val_car = val_car – n_tabela;

mens_cifrada[i] = STR(val_car)

se indice_chave >= nc então senão

indice_chave = 1; indice_chave = indice_chave + 1;

fim para

retorna mens_cifrada;

fim

Ordem do algoritmo:

As funções STR e VAL envolvem busca em uma tabela. Isto significa que a ordem depende do

algoritmo de busca escolhido. Se a busca é binária o algoritmo é O(log (n_tabela)).

A chamada às funções é realizada no interior de uma instrução de repetição de nm iterações. Desta

forma, o algoritmo apresentado é O(nm * log(n_tabela)).

No caso apresentado acima, a tabela de conversão apresenta 27 elementos, o que significa que log

(n_tabela) é, aproximadamente, 6. Portanto, o algoritmo é O(N).

Codificação em binário

A codificação em binário é um método muito simples e, também, muito utilizado. A mensagem e a

chave são codificados em binário e a codificação é obtida a partir da realização de uma operação ou-

exclusivo, ou XOR, bit a bit. Este também é um método de criptografia simétrica. Conhecida a chave,

a mesma operação XOR é utilizada para decifrar a mensagem.

Prof. Angelo Passaro

página6

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Exemplo para a codificação de uma única letra:

 

Codificação em binário

 

A

01000001

Mensagem original

Chave

01110011

Chave de oito bits

XOR

00110010

Texto codificado

Chave

01110011

 

XOR

01000001

Mensagem decodificada

As demais letras da mensagem seguem o mesmo esquema. Note que a chave não precisa ser de 8

bits.

Exercício: Codifique (codificação binária) a mensagem de exemplo, considerando a chave binária apresentada na tabela acima.

Codificação DES (Data Encryption Standard – Padrão de Criptografia de Dados)

Trata-se de um método muito popular de criptografia simétrica de bloco. Este código processa os dados em seções de tamanho pré-determinado (bloco de 64 bits). Se a quantidade de dados não é múltiplo de 64 bits deve-se utilizar apoio de aplicação específica.

Funcionamento:

O

DES é baseado no princípio da confusão e difusão. O bloco de mensagem é criptografado a partir

da

execução de uma série de 16 (dezesseis) permutações e substituições no texto. As permutações e

substituições afetam o

texto original por meio de 16 subchaves ,

K 15 , K 16 , que

K 0 (fornecida pelo usuário ou sistema). Para codificar o texto, cada

K 1 , K 2 , K 3

derivam de uma chave inicial

subchave é aplicada aos dados na ordem K 1 , K 2 , K 3

dessas chaves é denominada “rodada” (round). Para decifrar um bloco de texto cifrado utililza-se o

K 15 , K 16 . A aplicação de cada uma

mesmo processo, porém com as chaves aplicadas no sentido oposto: K 16 , K 15

K 3 , K 2 , K 1 .

Obtenção das sub-chaves:

O

DES utiliza uma chave de 56 bits e não de 64. A chave de 64 bits inicialmente fornecida inclui 8 bits

de

verificação de paridade (um bit em cada oito é utilizado para essa verificação). Os bits de paridade

são utilizados quando o DES é implementado em hardware, porém, de maneira geral, essa verificação não é efetuada quando o DES é implementado em software e os bits de paridade são simplesmente ignorados.

O primeiro passo para obter a chave de 56 bits é realizar uma transformação de chave. Essa

transformação pode ser feita via uma tabela, que relaciona os bits da chave original com os da chave transformada. Um exemplo desse procedimento é apresentado na tabela 1.

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Tabela 1: Um exemplo de transformação de chave em DES. O conteúdo deve ser lido da esquerda para a

direita e de cima para baixo. Os bits são numerados a partir de 1.

57

49

41

33

25

17

9

1

58

50

42

34

26

18

10

2

59

51

43

35

27

19

11

3

60

52

44

36

63

55

47

39

31

23

15

7

62

54

46

38

30

22

14

6

61

53

45

37

29

21

13

5

28

20

12

4

A interpretação da tabela é a seguinte: cada posição p da tabela contém o número do bit da chave

original. Desta forma, o número 57 na posição um da tabela, indica que nesta posição fica o bit 57 da chave original; na posição 2 da chave transformada fica o bit 49, na posição 14 da chave

transformada fica o bit 18 da chave original, na posição 15 fica o bit 10, e assim por diante. A chave

) não aparecem na tabela, pois

correspondem aos bits de paridade que foram ignorados. Uma vez obitda a chave de 56 bits, computam-se as subchaves. Para tal, segue-se o procedimento apresentado na figura 1.

A chave de 56 bits é dividida em dois blocos de 28 bits cada. Para a construção de cada subchave,

transformada é de 56 bits. Note que os bits múltiplos de 8 (8, 16, 24,

gira-se cada bloco de 28 bits um certo número de bits para a esquerda. Esse número de bits depende da rodada de construção da subchave, e pode ser definido a partir de uma tabela, como a apresentada na tabela 2.

Tabela 2 : Número de rotações de bits por rodada (round) para a construção de subchaves DES.

Rodada

1

3

2 4

5

6

7

8

9

10

11

12

13

14

15

16

Rotação de bits

1

2

1 2

2

2

2

2

1

2

2

2

2

2

2

1

Uma vez realizada a rotação para cada rodada, os campos de 28 bits são novamente reunidos, e destes são escolhidos 48 bits para formar as subchaves (os outros oito são descartados). Esta operação é denominada opção, ou escolha, de permuta. Sua implementação também pode ser feita a

a partir de uma tabela, a qual indicará quais bits da subchave de 56 bits formada pela reunião dos blocos de 28 serão utilizados para montar a subchave de 48 bits. Um exemplo é apresentado na tabela 3.

Tabela 3: Escolha permutada para a criação de uma subchave DES de 48 bits.

14

17

11

24

1

5

3

28

15

6

21

10

23

19

12

4

26

8

16

7

27

20

13

2

41

52

31

37

47

55

30

40

51

45

33

48

44

49

39

56

34

53

46

42

50

36

29

32

O processo é repetido para cada uma das subchaves, de forma a assegurar que, em cada rodada, os

dados sejam codificados com subchaves que apresentam bits diferentes dos da chave original.

Prof. Angelo Passaro

página8

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

K 0 (64 bits)

Transformação de chave
Transformação de chave

K 0 (56 bits)

(28 bits)
(28 bits)
(28 bits)
(28 bits)
Reunir
Reunir
Escolha permutada
Escolha permutada

K 1 (48 bits)

Girar bits para a esquerda

Girar bits para a esquerda

Subchave para a primeira rodada (round 1)

(28 bits)
(28 bits)
(28 bits)
(28 bits)
Reunir
Reunir

Girar bits para a esquerda

Girar bits para a esquerda

Escolha permutada
Escolha permutada

K 8 (48 bits)

Subchave para a oitava rodada (round 8)

(28 bits)
(28 bits)
(28 bits)
(28 bits)
Reunir
Reunir

Girar bits para a esquerda

Girar bits para a esquerda

Escolha permutada
Escolha permutada

K 16 (48 bits)

Subchave para a decima-sexta rodada (round 16)

Figura 1 - Esquema de criação de suchaves DES

Prof. Angelo Passaro

página9

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Codificando e decodificando mensagens (blocos de dados) Uma vez obtidas as subchaves, pode-se codificar ou decodificar blocos de dados. Novamente, o processo envolve um conjunto de permutações, Figura 2. O passo inicial envolve a permutação de um bloco de 64 bits de dados, conforme uma tabela pré-definida, Tabela 4. Esta permutação, denominada permutação inicial, não aumenta a segurança da codificação DES. Trata-se de uma herança dos primórdios da definição do padrão, e deve ser executada. Completada a permutação inicial, o bloco de dados é submetido ao conjunto de 16 rodadas, passando por um conjunto de operações repetitivas.

Tabela 4: Permutação inicial para blocos de dados no padrão DES.

58

50

42

34

26

18

10

2

60

52

44

36

28

20

12

4

62

54

46

38

30

22

14

6

64

56

48

40

32

24

16

8

57

49

41

33

25

17

9

1

59

51

43

35

27

19

11

3

61

53

45

37

29

21

13

5

63

55

47

39

31

23

15

7

Inicialmente, o bloco de dados permutado é dividido em dois blocos de 32 bits, denominados L 0 e R 0 . Para cada rodada i, computa-se L i e R i , partindo de L i-1 e R i-1 . L i e R i são então utilizados pela rodada seguinte, até se conseguir o bloco de dados R 16 L 16 . R i-1 é expandido de 32 para 48 bits, utilizando-se uma tabela de permutação de expansão (efeito de difusão – 1 bit no bloco de dados afeta mais bits no procedimento seguinte). Observem o efeito na Tabela 5 (prestem atenção nas casas em destaque),

Tabela 5 – Permutação de Expansão para blocos de dados em DES.

32

1

2

3

4

5

4

5

6

7

8

9

8

9

10

11

12

13

12

13

14

15

16

17

16

17

18

19

20

21

20

21

22

23

24

25

24

25

26

27

28

29

28

29

30

31

32

1

Completada a permutação de expansão em R i-1 , a qual denotaremos por E(R i-1 ), realiza-se uma

operação XOR, a qual será denotada por , entre esta e a subchave K i de 48 bits. Esta operação

produz um resultado intermediário que denominaremos R int . Matematicamente, estas operações podem ser expressas pela seguinte equação:

R int = E(R i-1 )

K i .

Em seguida, R int passa por oito substituições executadas com oito caixas-S (S-boxes) separadas. Cada caixa-S j recebe um bloco de seis bits, da posição 6j para 6j+6 em R int e busca um valor de 4 bits numa tabela (na verdade um conjunto de tabelas). O valor encontrado é gravado em um buffer na posição 4j. A tabela 6 apresenta as substituições referentes a algumas das caixas-S.

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings
Mensagem ou texto cifrado Permutação inicial
Mensagem
ou
texto cifrado
Permutação inicial

L 0 (32 bits)

R 0 (32 bits)

Codificação K = K 1

Permutação de expansão
Permutação de expansão
⊕ Substituições S-box
Substituições S-box
Permutações P-box
Permutações P-box
⊕ L 1 = R 0 R 1 = L 0 ⊕
L 1 = R 0
R 1 = L 0 ⊕

Primeira rodada

Codificação

K = K 2

Permutação de expansão
Permutação de expansão
⊕ Substituições S-box
Substituições S-box
Permutações P-box
Permutações P-box
⊕ L 2 = R 1 Segunda rodada R 2 = L 1 ⊕
L 2 = R 1
Segunda rodada
R 2 = L 1 ⊕

ou decodificação K = K 16

f(R 0 ,K)

ou

decodificação

K = K 15

f(R 1 ,K)

Codificação

K = K 16

Permutação de expansão
Permutação de expansão
⊕ Substituições S-box Permutações P-box
Substituições S-box
Permutações P-box

⊕ Substituições S-box Permutações P-box ⊕ f(R 15 ,K) L 16 = R 15 R 16
f(R 15 ,K) L 16 = R 15 R 16 = L 15 ⊕ Decima
f(R 15 ,K)
L 16 = R 15
R 16 = L 15 ⊕
Decima sexta rodada
Permutação final

Texto cifrado ou Mensagem

Figura 2: Esquema de codificação e decodificação DES

ou

decodificação

K = K 1

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Tabela 6: Substituições de Caixa-S.

Caixa-S 1

14

4

13

1

2

15

11

8

3

10

6

12

5

9

0

7

0

15

7

4

14

2

13

1

10

6

12

11

9

5

3

8

4

1

14

8

13

6

2

11

15

12

9

7

3

10

5

0

15

12

8

2

4

9

1

7

5

11

3

14

10

0

6

13

Caixa-S 2

 

15

1

8

14

6

11

3

4

9

7

2

13

12

0

5

10

3

13

4

7

15

2

8

14

12

0

1

10

6

9

11

5

0

14

7

11

10

4

13

1

5

8

12

6

9

3

2

15

13

8

10

1

3

15

4

2

11

6

7

12

0

5

14

9

Caixa-S 3

 

10

0

9

14

6

3

15

5

1

13

12

7

11

4

2

8

13

7

0

9

3

4

6

10

2

8

5

14

12

11

15

1

13

6

4

9

8

15

3

0

11

1

2

12

5

10

14

7

1

10

13

0

6

9

8

7

4

15

14

3

11

5

2

12

Caixa-S 4

 

7

13

14

3

0

6

9

10

1

2

8

5

11

12

4

15

13

8

11

5

6

15

0

3

4

7

2

12

1

10

14

9

10

6

9

0

12

11

7

13

15

1

3

14

5

2

8

4

3

15

0

6

10

1

13

8

9

4

5

11

12

7

2

14

Caixa-S 5

 

2

12

4

1

7

10

11

6

8

5

3

15

13

0

14

9

14

11

2

12

4

7

13

1

5

0

15

10

3

9

8

6

4

2

1

11

10

13

7

8

15

9

12

5

6

3

0

14

11

8

12

7

1

14

2

13

6

15

0

9

10

4

5

3

Caixa-S 6

 

12

1

10

15

9

2

6

8

0

13

3

4

14

7

5

11

10

15

4

2

7

12

9

5

6

1

13

14

0

11

3

8

9

14

15

5

2

8

12

3

7

0

4

10

1

13

11

6

4

3

2

12

9

5

15

10

11

14

1

7

6

0

8

13

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Caixa-S 7

4

11

2

14

15

0

8

13

3

12

9

7

5

10

6

1

13

0

11

7

4

9

1

10

14

3

5

12

2

15

8

6

1

4

11

13

12

3

7

14

10

15

6

8

0

5

9

2

6

11

13

8

1

4

10

7

9

5

0

15

14

2

3

12

Caixa-S 8

 

13

2

8

4

6

15

11

1

10

9

3

14

5

0

12

7

1

15

13

8

10

3

7

4

12

5

6

11

0

14

9

2

7

11

4

1

9

12

14

2

0

6

10

13

15

3

5

8

2

1

14

7

4

10

8

13

15

12

9

0

3

5

6

11

As tabelas das caixas-S são utilizadas como segue:

1. Procure a caixa-S j

2. Procure o número da fileira correspondente aos dois bits formados a partir do primeiro e do último bit do bloco de seis bits (a fileira começa a ser contada do índice zero);

3. Procure a coluna correspondente ao valor de quatro bits formado a partir dos bits do meio do bloco de seis bits (a coluna começa a ser contada a partir do índice zero).

4. O valor codificado corresponde aos valor localizado na fileira e coluna identificadas nos dois passos anteriores, no formato binário.

Por exemplo, seja um conjunto de seis bits de R int com os valores 101011, e vamos assumir que este conjunto esteja associado à caixa-S 3. O primeiro e o sexto bits formam o valor 11 em binário (11 2 ), o que corresponde ao valor decimal 3. Desta forma, estamos interessados na fileira 3, contada a partir de zero. Os quato bits do meio, 0101 2 , corresponde ao valor decimal 5. Ou seja estamos interessados na quinta coluna, contada a partir de zero. Consultando a tabela, encontramos o valor 9, que em binário corresponde a 1001 2 .

As caixas-S confundem os dados e são as principais responsáveis pela segurança do DES.

Completadas as substituições das caixas-S, o resultado é um valor de 32 bits que deve ainda ser permutado utilizando uma caixa-P, Tabela 7.

Tabela 7: Permutação de caixa-P.

16

7 20

21

29

12

28

17

1

15

23

26

5

18

31

10

2

8 24

14

32

27

3

9

19

13

30

6

22

11

4

25

A permutação final, representada pela Tabela 8, desfaz o efeito da permutação inicial.

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Tabela 8: Permutação final

40

8

48

16

56

24

64

32

39

7

47

15

55

23

63

31

38

6

46

14

54

22

62

30

37

5

45

13

53

21

61

29

36

4

44

12

52

20

60

28

35

3

43

11

51

19

59

27

34

2

42

10

50

18

58

26

33

1

41

9

49

17

57

25

Comentários finais sobre o procedimento DES

Com DES dados são codificados ou decodificados executando uma série de permutações e substituições. A forma como essas operações afetam os dados é dependente das 16 subchaves derivadas da chave inicial fornecida pelo usuário ou pelo sistema. A segurança do DES é tanto maior quanto mais subchaves diferentes umas das outras forem obtidas. Contudo, certas chaves iniciais levam a situações nas quais todas as subchaves são iguais. Estas chaves iniciais são denominadas chaves fracas. As chaves fracas são decorrência do processo de subdivisão da chave inicial de 56 bits em dois blocos de 28. As quatro chaves fracas do DES e o que produzem são apresentadas na tabela 9.

Tabela 9 : Chaves fracas de DES

Chaves

Transformação

0101 0101 0101 0101

0000000

0000000

1F1F 1F1F 1F1F 1F1F

0000000

FFFFFFF

E0E0 E0E0 F1F1 F1F1

FFFFFFF 0000000

FEFE FEFE FEFE FEFE

FFFFFFF FFFFFFF

Evitar chaves fracas é uma questão de segurança no DES. Apesar da ocorrência dessas chaves em geração de chaves aleatória ser rara, mecanismos adequados devem ser utilizados para evitá-las.

Outro problema são as denominadas chaves semi-fracas. Chaves semi-fracas existem em pares. Duas chaves são semi-fracas se as subchaves produzidas estão em ordem oposta. Isto significa dizer que se codificarmos um texto com uma chave do par, podemos decodificar os dados utilizando a outra chave, obtendo novamente a mensagem original. DES apresenta seis chaves sei-fracas, Tabela

10.

Tabela 10: Lista das chaves-semifracas de DES

Chave 1

Chave 2

01FE 01FE 01FE 01FE

FE01 FE01 FE01 FE01

1FE0 1FE0 0EF1 0EF1

E01F E01F F10E 1FE0

01E0 01E0 01F1 01F1

E001 E001 F101 F101

1EFE 1EFE 0EFE 0EFE

FE1F FE1F FE0E FE0E

011F 011F 010E 010E

1F01 1F01 0E01 0E01

E0FE E0FE F1FE F1FE

FEE0 FEE0 FEF1 FEF1

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Exercício: Codifique, e em seguida decodifique, um bloco de 64 bits da mensagem de exemplo, aplicando as tabelas de conversão e permutação DES apresentadas nesta seção.

Criptosistemas de Chave Pública

Criptosistemas de chave pública seguem o esquema resumido a seguir. Um usuário tem uma chave pública (P) e uma chave privada (S), a qual deve ser mantida secreta.

Cria-se um livro de chaves públicas:

Chave pública (P)

Nome

ABC

Cassio

CBA

Rupert

Cria-se a chave privada S para cada uma das chaves públicas P constantes do livro de chaves públicas. Para cada chave P, existe uma chave S específica.

A chave P é fornecida aos correspondentes, ou seja às pessoas que transmitirão a mensagem para o

receptor, o qual a decodificará utilizando a chave S. Nenhuma chave precisa ser transmitida anexa à mensagem, o que reduz a possibilidade de comprometimento da chave.

.

A mensagem M é criptografada com a aplicação da chave pública, o que é denotado por P(M) e enviada ao destino. O receptor da mensagem deve aplicar a chave privada S para decodificar a mensagem, o que é denotado por S(C).

Mensagem M

a mensagem, o que é denotado por S(C). Mensagem M M e n s a g

Mensagem cifrada C = P(M)

S(C). Mensagem M M e n s a g e m cifrada C = P(M) Trans-

Trans- C

missor

M M e n s a g e m cifrada C = P(M) Trans- C missor

Recep-

tor

s a g e m cifrada C = P(M) Trans- C missor Recep- tor Decodificação da

Decodificação da mensagem M = S(C)

Para a criação de um algoritmo de criptografia de chave pública, as seguintes condições devem ser satisfeitas:

i. S(C) = S(P(M)) = M , qualquer que seja M;

ii. Todos os pares (SP) são distintos

iii. Derivar S a partir de P é tão dificil quanto ler M.

iv. Tanto S como P são fáceis de obter por computação.

Criptosistemas com chave pública, que respeitam as condições de i a iv passaram a ser realidade com o “algoritmo” RSA (criado por R. Rivest, A. Shamir e L. Adleman). Trata-se de um método de

Prof. Angelo Passaro

página15

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

criptografia assimétrica de bloco muito popular. Contudo, diferente do DES, o tamanho do bloco não é

fixo em 64 bits, mas sim varia conforme o tamanho das chaves. Como no DES, algoritmos adicionais

devem ser considerados se o tamanho da mensagem não é multiplo do tamanho do bloco.

A base do método repousa em algoritmos de aritmética modular, mas especificamente, a operação de

exponenciação modular, aplicados a inteiros muito grandes. A exponenciação modular é o processo

de computação de obtenção do resto da divisão de um número inteiro A por um outro inteiro n, o que

costuma ser representado por (A mod n).

Neste algoritmo, a chave pública P é um par de inteiros (N,p) e a chave secreta também (N,s). O

inteiro s é mantido secreto. Tipicamente, para que as chaves sejam consideradas seguras, N é um

inteiro com aproximadamente 400 dígitos e p e s são inteiros com 200 digitos cada,

aproximadamente.

A mensagem M é separada em elementos menores do que N (por exemplo, logN bits da string

binária por vez).

Os números obtidos são, independentemente, elevados a uma potência N

Para codificar uma mensagem, ou pedaço dela, M : C = P(M) = M p mod N

Para decodificar uma mensagem cifrada M = S(C) = C s mod N

Criando chaves públicas e privadas

Para assegurar o casamento das chaves P e S (condição i), utiliza-se o procedimento apresentado a

seguir.

Selecionam-se dois números primos entre sí, p1 e p2, de aproximadamente 200 digitos cada.

Faz-se N = p1 * p2

O número inteiro p, que fará parte da chave pública, é escolhido como sendo o menor inteiro que seja

primo relativo de (p1 – 1) * (p2 -1)

Exemplo:

Se p1 = 11 e p2 = 19, então N = 11 * 19 = 209. Neste caso, (p1 - 1) * (p2 - 1) = 180; o menor inteiro que é primo relativo de 180 (ou seja, não tem fatores comuns com este) é o número 17, o qual será escolhido para p

Na prática, escolhas comuns para o valor de p são 3, 17 e 65537.

Tendo escolhido o valor de p, computa-se o valor correspondente para s, o qual é parte da a chave

privada, conforme a expressão:

1= spmod  p11∗ p21

Uma variação do algoritmo de Euclides é utilizada para o cálculo de multiplicativos modulares

inversos.

Projeto e Análise de Algoritmos Algoritmos com Strings

Projeto e Análise de Algoritmos Algoritmos com Strings

Exemplo:

Considerando p1 = 11 e p2 = 19, obteve-se p = 17 (ver exemplo anterior). Aplicando a expressão acima, obtem-se o valor s = 53, como uma das solução possíveis. Observe que a igualdade é satisfeita. Este, contudo, não é o único valor possível para s. Outras possibilidades são 233, 413, 593, etc. É o fato de não ser possível derivar um valor único para s que torna o algoritmo RSA seguro. Imagine o tamanho do problema para se obter o valor de s se p e s têm em torno de 200 algarismos!!!!!

Desempenho:

Uma mensagem pode ser codificada em tempo linear (O(N)).

Elevar qualquer número a uma potência é operação de tempo constante, pois a representaçãao do

número é de comprimento constante.

IX.1. Bibliografia

[1] Robert Sedgewick, Algorithms in C, Addison Wesley Publishing Co., 1990

[2] Kyle Loudon, Dominando algoritmos com C, Editora Ciência Moderna Ltda, 2000, Parte II, cap.15.

[4] A. M. Tenenbaum, Y. Langsam, M. J., Augenstein, Estruturas de dados usando C, São Paulo, Makron Books, 1995