<?

/*
* wf-crypt
* Autor: Wender Fernandes de Almeida
* Email: wender@navesa.com.br
*
* A classe abaixo possui dois métodos, um para codificar uma mensagem e outra para decodificar.
* Aqui tentarei explicar como a mensagem é codificada e depois decodificada.
*
* Como a mensagem é codificada?
* O funcionamento é bem simples:
* suponhamos que você queira codificar a letra "A" usando uma chave 15 por exemplo,
* note que a letra "A" será convertida para o numero 0 (observe que no array do alfabeto A=0)
* Após convertido para numero será somado à chave (nesse caso 15) que resultará em 15 (0+15=15).
* Posteriormente o numero 15, utilizando o alfabeto inverso co-relacionado, o numero 15 será trocado por
* seu caractere correspondente nesse caso "P" (note que no alfabeto inverso 15 equivale a "P".
* então o que era um A agora é P isso torna mais dificil a leitura por alguem que nao saiba como chegamos no P e nem que chave usamos.
*
* Como a mensagem é decodificada?
* Também é simples:
* O caractere "P" será convertido para seu numero correspondente dentro do array voltando a valer 15
* depois será adicionada a chave inversa que é o resultado da quantidade de elementos do array menos a chave (27-15)
* nesse caso a chave inversa será 12 somado a 15 que valerá 27. No entanto, so podemos utilizar os caracteres para associá-los ao array
* quando forem menores que a quantidade total de elementos do array. Caso sejam maiores ou igual, fazemos a divisão do numero pela ordem
* (quantidade de elementos do array do alfabeto). Nesse caso 27/27 tem resto 0 e é esse resto que utilizaremos para associar ao alfabeto.
* Como 0 equivale a "A" voltamos à nossa mensagem original.
* Suponhamos que o valor fosse 10. Nesse caso seria utilizado para a conversão, pois é menor que o módulo e a letra seria "K".
* Suponhamos que fosse 30. O resultado seria o resto da divisão ou seja 3 (3 é congruente a 30 na base 27) e a letra seria "D".
*
*
* No exemplo abaixo instanciamos o objeto $crypt
* depois atribuímos valores à chave (essa é a chave de encriptação
* a chave de encriptação é responsável pela reorganização do texto trocando seus caracteres.
* ex: se você encriptar uma mensagem ou senha com uma chave 2, o caminho de volta somente poderá
* ser possível utilizando a mesma chave.
* Caso voce queira decodificar siga exatamente os passos acima alterando codificar para decodificar
* e vc voltará ao valor original
* $crypt = new Encriptor;
* $crypt->chave=2;
* $crypt->mensagem="YGPFGTBQBDQO";
* echo $crypt->decodificar(); a mensagem voltará para wender o bom.
*
* Por que utilizar isso?
* Simples. Suponhamos que seu visitante cadastre-se no seu site e você tenha uma senha encriptada e o mesmo a esqueceu.
* entao vc disponibilizou a ele uma ferramenta de recuperação de senha, a qual a enviará ao e-mail do visitante. Você enviaria a senha
* encriptada? Não teria muita utilidade não é mesmo? Se você utilizar uma criptografia de via única, terá que gerar uma nova senha e solicitar
* ao usuário que a troque.
* Com a criptografia reversa você pode decodificar a senha e envia-la como foi originalmente escrita por ele.
* Caso o alfabeto nao o satisfaça, basta acrescentar caracteres de sua preferencia nos arrays alfabeto e falfavedo_inverso, mas lembre-se
* de obedecer a ordem estabelecendo a co-relação entre os dois alfabetos, o original e o inverso.
*
*/

class Encriptor{
var 
$alfabeto = array("A"=>0,"B"=>1,"C"=>2,"D"=>3,"E"=>4,"F"=>5,"G"=>6,"H"=>7,"I"=>8,
"J"=>9,"K"=>10,"L"=>11,"M"=>12,"N"=>13,"O"=>14,"P"=>15,"Q"=>16,"R"=>17,"S"=>18,"T"=>19,
"U"=>20,"V"=>21,"W"=>22,"X"=>23,"Y"=>24,"Z"=>25," "=>26);

var 
$alfabeto_inverso = array("0"=>"A","1"=>"B","2"=>"C","3"=>"D","4"=>"E","5"=>"F","6"=>"G","7"=>"H","8"=>"I",
"9"=>"J","10"=>"K","11"=>"L","12"=>"M","13"=>"N","14"=>"O","15"=>"P","16"=>"Q","17"=>"R","18"=>"S","19"=>"T",
"20"=>"U","21"=>"V","22"=>"W","23"=>"X","24"=>"Y","25"=>"Z","26"=>" ");

var 
$chave;
var 
$mensagem;

    function 
decodificar(){
    
$n_mensagem="";
    
$ordem count($this->alfabeto);
    
$chave_inversa = ($ordem $this->chave);

    for(
$i=strlen($this->mensagem); $i >= 0$i--){
    
$x = -$i;
    
$letras substr(strtoupper($this->mensagem),$x,1);
    
$letra[]=array($letras);
    }
        for(
$i=0$i strlen($this->mensagem);$i++){
        
$l $letra[$i][0];
        
$lc = ($this->alfabeto[$l]+$chave_inversa); // converte para o codigo do alfabeto e soma à chave inversa
            
if($lc $ordem){ // encontra o resto e armazena
            
$resto $lc%$ordem;
            }elseif(
$ordem==$lc){
            
$resto=0;
            }
            else
            {
            
$resto $lc;
            }
            
$numeros[]=array($resto);
        }
        for(
$i=0$i <= strlen($this->mensagem); $i++){
        @
$decodificar $numeros[$i][0];
        
$n_mensagem .= @$this->alfabeto_inverso[$decodificar];
        }
    return 
$n_mensagem;
    }
    
    
// método para codificar
    
function codificar(){
    
$n_mensagem="";
    
$ordem count($this->alfabeto);
    
$chave_inversa = ($this->chave);

    for(
$i=strlen($this->mensagem); $i >= 0$i--){
    
$x = -$i;
    
$letras substr(strtoupper($this->mensagem),$x,1);
    
$letra[]=array($letras);
    }
        for(
$i=0$i strlen($this->mensagem);$i++){
        
$l $letra[$i][0];
        
$lc = ($this->alfabeto[$l]+$chave_inversa); // converte para o codigo do alfabeto e soma à chave inversa
            
if($lc $ordem){ // encontra o resto e armazena
            
$resto $lc%$ordem;
            }elseif(
$ordem==$lc){
            
$resto=0;
            }
            else
            {
            
$resto $lc;
            }
            
$numeros[]=array($resto);
        }
        for(
$i=0$i <= strlen($this->mensagem); $i++){
        @
$codificar $numeros[$i][0];
        
$n_mensagem .= @$this->alfabeto_inverso[$codificar];
        }
    return 
$n_mensagem;
    }
}

// exemplo:
$crypt = new Encriptor;
$crypt->chave=2;
$crypt->mensagem="wender o bom";
echo 
$crypt->codificar(); // nesse caso resultará em YGPFGTBQBDQO

?>