aulas de php criptografia com cifra de césar · queremos cifrar uma mensagem completa. para termos...
TRANSCRIPT
Aulas de PHP – Criptografia com Cifra de César
Paulo Marcos Trentin
http://www.paulotrentin.com.br
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
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
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
Cifra de César - criptografando
Percebemos que a palavra ZAIRA criptografada com 3 casas de afastamento é CDLUD.
11/8/2011 5
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
Cifra de César - descriptografando
Percebemos que a palavra CDLUD descriptografada com 3 casas de afastamento é ZAIRA.
11/8/2011 7
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
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
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
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
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
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
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
Implementando César de Cesar com PHP
Crie um projeto no NetBeans e insira o seguinte código nele:
11/8/2011 15
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
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
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
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
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
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
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
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
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
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
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
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
Resultado final
Por fim, podemos então exibir todos os valores, e veremos o resultado de nosso programa no navegador:
11/8/2011 28
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