Cryptage décryptage sans mcrypt

Petit nouveau ! | 1 Messages

16 nov. 2011, 23:51

J'avais besoin d'un cryptage d'url court et sans caractères spéciaux.
J'utilisais mcrypt avant mais je ne sais pas pourquoi malgrès l'utilisation d'url_encode j'avais vertains problèmes (sans doute à cause de l'utilisation de UTF-8). j'ai donc créé ma propre fonction d'encryptage / décryptage qui sort une chaine contenant uniquement des lettres et des chiffres :

function unfucked_base_convert ($numstring, $frombase, $tobase) {

   $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
   $tostring = substr($chars, 0, $tobase);
   $length = strlen($numstring);
   $result = '';
   for ($i = 0; $i < $length; $i++)
       $number[$i] = strpos($chars, $numstring{$i});
   do {
       $divide = 0;
       $newlen = 0;
       for ($i = 0; $i < $length; $i++) {
           $divide = $divide * $frombase + $number[$i];
           if ($divide >= $tobase) {
               $number[$newlen++] = (int)($divide / $tobase);
               $divide = $divide % $tobase;}
               elseif ($newlen > 0)
               $number[$newlen++] = 0;}
       $length = $newlen;
       $result = $tostring{$divide} . $result;}
   while ($newlen != 0);
   return $result;
}

function crypte($input){   
    $encode_key="key";
    $key_size=strlen($encode_key);
    $size=  strlen($input);
    $key_pointer=0;
    $table_key=array();
    for($i=0;$i<$size;$i++){
        $table_key[]=ord($encode_key[$key_pointer])-33;
        if($table_key[$i]<0 || $table_key[$i]>99) die();
        if($key_pointer==$key_size-1) $key_pointer=0;
        else $key_pointer++;}    
    $current_table=array();
    $temp_input=$input;
    $encoded="1";
    for($i=0;$i<$size;$i++){
        $puissance = pow(10,$size-$i-1);
        $nombre=floor($temp_input/$puissance);
        $temp_input-=$nombre*$puissance;
        $temp="";
        $temp.=$nombre;
        $temp2="";
        $temp2.=unfucked_base_convert($temp, 10, 4)+$table_key[$i];
        $temp2=unfucked_base_convert($temp2, 10, 11);
        $current_table[]=$temp2;
        if(unfucked_base_convert($temp2,11,10)<11) $encoded.="0";
        $encoded.=$temp2;} 
    return unfucked_base_convert($encoded, 11, 62);}


function decrypte($input)
{
    $encode_key="key";
    $current_number=unfucked_base_convert($input,62,11);
    $current_table=array();
    for($i=1;$i<(strlen($current_number)-1);$i=$i+2)
        $current_table[]=unfucked_base_convert($current_number[$i].$current_number[$i+1], 11, 10);
    $size=sizeof($current_table);
    $key_size=strlen($encode_key);
    $key_pointer=0;
    $table_key=array();
    for($i=0;$i<$size;$i++){
        $table_key[]=ord($encode_key[$key_pointer])-33;
        if($table_key[$i]<0 || $table_key[$i]>99) die();
        if($key_pointer==$key_size-1) $key_pointer=0;
        else $key_pointer++;}
    $decoded="";
    for($i=0;$i<$size;$i++){
        $temp="";
        $temp.=$current_table[$i]-=$table_key[$i];
        $decoded.=unfucked_base_convert($temp, 4, 10);}
    return $decoded;  
}

la clé est bien évidemment modifiable et sa taille est quelquonque bien que le code ascii de chacuns des caractères qui la composent doivent être compris entre 33 et 126.
L'execution est très rapide : moins d'un seconde pour 1000 cryptages suivis de décryptages. (soit une moyenne d'1 ms par cryptage+décryptage)

En espèrant que ca serve un jour à quelqu'un

DARK_DUCK