Aulas de PHP Criptografia com Cifra de César Paulo Marcos Trentin paulo@paulotrentin.com.br 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 e decodificar. Existem vários exemplos de seu funcionamento na internet, porém aqui estudaremos com suporte ao padrão de codificação ISO-8859-1 para que assim possamos 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 decé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 HTML Podemos 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 n acima). 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 32vezes. 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 PHP O 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 if anterior, 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