Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar...

29
Aulas de PHP Criptografia com Cifra de César Paulo Marcos Trentin [email protected] http://www.paulotrentin.com.br

Transcript of Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar...

Page 1: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Aulas de PHP – Criptografia com Cifra de César

Paulo Marcos Trentin

[email protected]

http://www.paulotrentin.com.br

Page 2: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Cifra de César com ISO-8859-1

A cifra de Cesar existe há mais de 2000 anos. Émuito simples de entender, implementar edecodificar.

Existem vários exemplos de seu funcionamento nainternet, porém aqui estudaremos com suporte aopadrão de codificação ISO-8859-1 para que assimpossamos cifrar qualquer texto em português.

Codificação ISO-8859-1: http://pt.wikipedia.org/wiki/ISO_8859-1

11/8/2011 2

Page 3: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Cifra de César - funcionamento

Para usar a Cifra de César, basta substituirmos uma letra do alfabeto por n letras a frente. Para n = 3, temos A valendo D.

Vamos entender melhor.

Primeiro atribuímos valores aos caracteres de um alfabeto conhecido:

Cifra de César: http://pt.wikipedia.org/wiki/Cifra_de_César

11/8/2011 3

Page 4: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Cifra de César - criptografando

Depois, tendo definido a quantia de algarismos n que iremos deslocar, somamos ela ao valor de cada caractere do texto. O valor de Z é 25, portanto será 28.

Basta então fazer o valor resultante da soma, neste caso 28, pelo módulo da quantia de caracteres do alfabeto, neste caso 26 (0 ... 25) e teremos o código do próximo caractere.

Por último precisamos apenas encontrar o caractere pelo código e por fim exibí-lo. Teremos então a completa codificação seguindo a Cifra de César.

Veja na página a seguir o resultado gráfico da cifragem.11/8/2011 4

Page 5: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Cifra de César - criptografando

Percebemos que a palavra ZAIRA criptografada com 3 casas de afastamento é CDLUD.

11/8/2011 5

Page 6: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Cifra de César - descriptografando

Para descriptografar o texto, basta sabermos quantas casas devemos subtrair, o nosso n, que neste caso é 3. O valor de L é 11, portanto será 8.

Basta então obter o valor resultante da subtração, neste caso 8 e teremos o código do próximo caractere. Caso esse valor seja menor que 0, precisamos subtrair a soma de caracteres do alfabeto, neste caso 26, pelo valor resultante do cálculo feito (letra C da tela seguinte).

Por último precisamos apenas encontrar o caractere pelo código e por fim exibí-lo. Teremos então a completa decodificação seguindo a Cifra de César.

Veja na página a seguir o resultado gráfico do que foi visto acima.

11/8/2011 6

Page 7: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Cifra de César - descriptografando

Percebemos que a palavra CDLUD descriptografada com 3 casas de afastamento é ZAIRA.

11/8/2011 7

Page 8: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Cifra de César - completa

O alfabeto visto anteriormente, contém apenas caracteres maiúsculos e sem acentuação, portanto é bastante incompleto caso queremos cifrar uma mensagem completa.

Para termos um sistema completo, precisamos aumentar nosso alfabeto conhecido, adicionando à ele os caracteres que faltam. O problema é que faltam todos os acentos, caracteres especiais e em caixa baixa, portanto passaríamos muito tempo fazendo nosso alfabeto!

A solução simples é usar a codificação da tabela de códigos HTML que já possui valores numéricos para cada caractere conhecido:

11/8/2011 8

Page 9: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Cifra de César – tabela de códigos HTML usada pelo PHP

A tabela completa pode ser obtida em: http://www.lookuptables.com/

11/8/2011 9

Page 10: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Tabela HTML com PHP – obtendo código de um caractere

Para obter o código de um caractere com PHP, precisamos usar a função ord padrão do PHP, passando por parâmetro o caractere que se deseja obter o código:

11/8/2011 10

Page 11: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Tabela HTML com PHP – obtendo caractere a partir de um código

Para obter o caractere de um código com PHP, precisamos usar a função chr padrão do PHP, passando por parâmetro o código que se deseja obter o caractere:

11/8/2011 11

Page 12: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Cifra de César – Novo Alfabeto

Agora que temos em mãos todos os códigos da tabela HTML que o PHP usa, temos um alfabeto conhecido de quase 256 caracteres!

Isso nos permite codificar qualquer frase, com quaisquer códigos e exibí-la codificada para o usuário. Com a exibição codificada, poderemos então decodificá-la sem problemas.

Existe, porém, uma limitação nesta tabela que veremos agora e então aprenderemos como contornar esta limitação.

11/8/2011 12

Page 13: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Limitação Tabela de códigos HTMLPodemos ver que até o trigésimo segundo caractere (espaço) não temos uma definição correta do que será exibido de acordo com o código passado. Por exemplo, qual é o caractere do código 15?

Se testar com a função chr vista anteriormente, verá que nada é retornado para o navegador.

Vemos então, que do código 0 ao 31, não podemos atribuir nenhum símbolo, pois ele não aparecerá em nosso browser.

11/8/2011 13

Page 14: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Limitação Tabela de códigos HTML –contornando o problema

Para resolver esse problema, iremos deixar de fora de nosso alfabeto qualquer caractere com código entre 0 e 31, ou seja, um total de 32 caracteres. Veja a ilustração abaixo:

11/8/2011 14

Page 15: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando César de Cesar com PHP

Crie um projeto no NetBeans e insira o seguinte código nele:

11/8/2011 15

Page 16: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

Agora vamos definir as variáveis responsáveis por armazenar a frase a ser criptografada, armazenar o código criptografado e armazenar o código descriptografado. Seguem respectivamente:

11/8/2011 16

Page 17: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

O próximo passo é percorrer pela variável que contém a frase a ser criptografada, e acessar cada caractere individualmente.

Uma string é um conjunto de caracteres em um vetor, logo acessamos cada caractere a partir do índice 0 até o tamanho do vetor – 1.

A função strlen do PHP nos retorna o tamanho do vetor de caracteres. Portanto o valor de i varia de 0 até tamanho_do_vetor – 1:

11/8/2011 17

Page 18: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

Para cada caractere, $aCriptografar[$i], obtemos seu código da tabela HTML através da função nativa do PHP, ord.

Suponhamos que estamos na segunda iteração do laço for, o valor de $i será 1, portanto $aCriptografar[1], retornará para nós o caractere r.

Seguindo em frente, o caractere r será passado por parâmetro para a função ord que retornará seu código, neste caso 114.

11/8/2011 18

Page 19: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

Tendo o valor do caractere em inteiro, agora podemos somar ao valor de casas a avançar, que neste exemplo foi 4 (definido na variável nacima).

Teremos então um novo código: 114 + 4 = 118 que corresponde ao caractere v da tabela de códigos HTML.

11/8/2011 19

Page 20: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

Calculamos então o módulo entre o novo código e o tamanho do alfabeto conhecido, tendo:

118 MOD 256

Se o dividendo (118) for menor que o divisor (256), então o módulo (%) irá retornar o valor do dividendo.

Operadores Aritméticos em php: http://www.php.net/manual/pt_BR/language.operators.arithmetic.php

11/8/2011 20

Page 21: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

Devemos assegurar que o valor convertido não esteja na faixa de valores inválidos: 0 – 31. Caso o novo código esteja nesta faixa, precisamos somar a quantia de valores necessários para tirá-lo desta faixa, neste caso o valor da variável $fora que é 32:

O valor de exemplo 118 está fora dessa faixa.

11/8/2011 21

Page 22: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

Mas e se estivéssemos o valor do novo cálculo sendo o número 3? O código visto anteriormente iria deslocá-lo $fora vezes para “frente”, neste exemplo são 32 vezes.

Isso irá fazer com que em vez de pegarmos o caractere de código 3 na tabela HTML, iremos pegar o de código 35:

11/8/2011 22

Page 23: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

Basta convertermos em caractere o valor referente ao novo código usando a função, vista anteriormente, chr.

Por fim, precisamos concatenar este caractere à variável $criptografada, que conterá toda a frase criptografada.

Veja na linha 32 que fechamos o nosso for, criado na linha 14.

11/8/2011 23

Page 24: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

Se exibirmos os valores das variáveis $aCriptografar e $criptografada, respectivamente, obteremos a seguinte saída em nosso navegador:

11/8/2011 24

Page 25: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHPO processo reverso à criptografia, é muito semelhante, portanto darei ênfase em apenas algumas partes.

Veja na linha 45, que em vez de somarmos, estamos subtraindo valores, caso o novo código esteja na faixa de exclusão:

11/8/2011 25

Page 26: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

Aqui temos a maior diferença. Um código ($novoCodigo) de caractere jamais pode ter valores negativos. Devido ao retrocesso causado no ifanterior, isso pode ocorrer.

Nestes casos precisamos então subtrair o tamanho do alfabeto pelo valor do código. Desta forma teremos então um valor positivo, correspondente ao código correto e fora da faixa de exclusão!

11/8/2011 26

Page 27: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Implementando Cifra de César com PHP

Da mesma forma do loop que criptografa, iremos concatenar os caracteres na variável correspondente, neste caso $desCriptografada.

Repare o fechamento do for na linha 56:

11/8/2011 27

Page 28: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Resultado final

Por fim, podemos então exibir todos os valores, e veremos o resultado de nosso programa no navegador:

11/8/2011 28

Page 29: Aulas de PHP Criptografia com Cifra de César · Cifra de César com ISO-8859-1 A cifra de Cesar existe há mais de 2000 anos. É muito simples de entender, implementar e decodificar.

Conclusão

Conhecer a Cifra de César é o básico para quem deseja se aventurar no mundo da criptografia, afinal, como podemos ver ela é muito simples de se entender e aplicar.

Porém, devido sua simplicidade, temos também sua insegurança. Um indivíduo com experiência em criptografia iria perceber em pouco tempo os padrões e então descobrir o código “secreto” de sua aplicação.

Portanto, use esse tutorial apenas para testes e aprendizagem, jamais confie que uma informação está segura com a técnica vista aqui. Para melhorar a segurança de informações que irão usar meios públicos para transmissão, pesquise por criptografia assimétrica.

11/8/2011 29