segunda-feira, 31 de maio de 2010

Criptografia e descriptografia com PHP

Recentemente estava precisando enviar uns dados sigilosos via POST de um formulário para outro. Acontece que isto não pode simplesmente ser feito via um campo escondido, como <input type="hidden"> por exemplo, pois se o usuário mandar o browser mostrar o código fonte da página lá estarão meus dados expostos.
A solução encontrada era encryptar os dados... O problema é que para cryptografia, o PHP só tem funções tipo HASH, cujo conteúdo original é impossível de se recuperar (one-way).
Diante disto tive que implementar minha própria função de criptografia e descriptografia... Sendo assim, me baseei na mais forte delas e, acredite, a mais simples de ser implementada: a criptografia "One-time pad".


Obs: Apesar de ter me baseado na "One-time pad", minha função não exige que a chave tenha o mesmo tamanho que o texto a ser criptografado e nem que seja utilizada uma única vez. Cabe a você, programador, definir seu uso para a mesma.

A função e exemplo de uso vão abaixo:

/* encrypt criptografa e/ou descriptografa uma string qualquer, fornecida no parametro "frase" com uma chave qualquer executando um
    XOR entre cada caractere, invertendo a sequencia e codificando em hexadecimal.
    Se $crypt = true, a função criptografa a frase fornecida. Caso false ela a descriptografa.
     Exemplo de uso:
     $chave = "q6w43a2sc1d6e98r6d5f6dasdfa313d525a35dsf";//Chave a ser utilizada na criptografia/descriptografia
   $frase = "Teste de encriptação de frases!!!";
   $crypt = encrypt($frase, $chave, true);
   $decrypt = encrypt($crypt, $chave, false);
   echo "Frase = ".$frase."<br>";
   echo "Cript = ".$crypt."<br>";
   echo "Decript = ".$decrypt."<br>";
*/
function encrypt($frase, $chave, $crypt)
{
  $retorno = "";

  if ($frase=='') return '';

  if($crypt)
  {
    $string = $frase;
    $i = strlen($string)-1;
    $j = strlen($chave);
     do
    {
      $retorno .= ($string{$i} ^ $chave{$i % $j});
    }while ($i--);

    $retorno = strrev($retorno);
    $retorno = base64_encode($retorno);
  }
  else
  {
    $string = base64_decode($frase);
    $i = strlen($string)-1;
    $j = strlen($chave);

    do
    {
      $retorno .= ($string{$i} ^ $chave{$i % $j});
    }while ($i--);

    $retorno = strrev($retorno);
  }
  return $retorno;
}

Um comentário:

  1. Muito boa função
    Gostei

    Parabéns e obrigado por compartilhar.

    ResponderExcluir