Advertisement
Guest User

SegCrypt

a guest
Feb 5th, 2011
884
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.32 KB | None | 0 0
  1. //@author Andriy Chaika 2011
  2. class SegCrypt
  3. {
  4.     var $key; //Длина 12 символов
  5.    
  6.     public function __construct($key='')
  7.     {
  8.         //Запись текущего ключа
  9.         if(strlen($key)==12)
  10.             $this->key=$key;
  11.     }
  12.    
  13.     //Генерирует ключ 12 символов
  14.     public function seg_word()
  15.     {
  16.         $text='';
  17.         $ar=array();
  18.         //Игнорируем символы 0123456789-.
  19.         for($i=45;$i<=57;$i++)
  20.         {
  21.             $ar[$i]=true;
  22.         }
  23.         //Генерируем сам ключ, используя случайные символы
  24.         for($i=0; $i<12; $i++)
  25.         {
  26.             do
  27.             {
  28.                 $num=rand(1,255);
  29.             }
  30.             while (isset($ar[$num]) and $ar[$num]);
  31.             $ar[$num]=true;
  32.             $text.=chr($num);
  33.         }
  34.         return $text;
  35.     }
  36.    
  37.     //Кодируем слово ключом
  38.     public function seg_encode($text)
  39.     {
  40.         if(isset($this->key))
  41.             return strtr($text, '0123456789.-', $this->key);
  42.         else
  43.             return '';
  44.     }
  45.    
  46.     //Раскодируем слово ключом
  47.     public function seg_decode($text)
  48.     {
  49.         if(isset($this->key))
  50.             return strtr($text, $this->key, '0123456789.-');
  51.         else
  52.             return '';
  53.     }
  54.    
  55.     //Создание хеша для проверки
  56.     private function makehash($ar)
  57.     {
  58.         //Здесь может быть заложен любой алгоритм для получения тестового хеша
  59.         $ckey=strrev($this->key);
  60.         return md5(implode($ckey, $ar),true);
  61.     }
  62.    
  63.     //Кодирование информации
  64.     public function encode($userid, $group, $ip)
  65.     {
  66.         //Будем кодировать ID пользователя, его группу и IP
  67.         $ar=array($userid,$group,$ip);
  68.         //Получаем хеш, кодируем в base64, убираем в конце ==, и разворачиваем задом на перед
  69.         $hash=strrev(substr(base64_encode($this->makehash($ar)),0,22));
  70.         //Кодируем нашу информацию своим ключом
  71.         $info=$this->seg_encode(implode('-', $ar));
  72.         //Теперь снова в base64, убираем в конце =, и разворачиваем задом на перед
  73.         $info=strrev(str_replace('=','',base64_encode($info)));
  74.         //Теперь разделим строку с информацией на 3 части (остаток от деления на 3 идет в
  75.         //первую часть)
  76.         $len=strlen($info);
  77.         $p1=$len%3;
  78.         $p1=$p1+(($len-$p1)/3);
  79.         $p2=$len-$p1;
  80.         $part1=substr($info,0,$p1);
  81.         $part2=substr($info,$p1,$p2);
  82.         //Возвращаем нашу зашифрованую строку
  83.         return $part1.$hash.$part2;
  84.     }
  85.     //Декодирование информации
  86.     public function decode($sumhash, $ip=null)
  87.     {
  88.         //Рассчитываем длину частей строки
  89.         $len=strlen($sumhash);
  90.         $parts=$len-22;
  91.         $p1=$parts%3;
  92.         $p1=$p1+(($parts-$p1)/3);
  93.         $p2=$parts-$p1;
  94.         //Получаем левую часть
  95.         $left=substr($sumhash,0,$p1);
  96.         //Получаем хеш, разворачиваем его назад, дописываем ==
  97.         $hash=strrev(substr($sumhash,$p1,22)).'==';
  98.         //Правую часть
  99.         $right=substr($sumhash,$p1+22,$p2);
  100.         //Склеиваем часть с информацией и разворачиваем назад
  101.         $info=strrev($left.$right);
  102.         //Дописываем недостающие =
  103.         while (strlen($info)%4>0)
  104.             $info.='=';
  105.         //Декодируем хеш
  106.         $newhash=base64_decode($hash);
  107.         //Декодируем информация
  108.         $newinfo=$this->seg_decode(base64_decode($info));
  109.         $ar=explode('-',$newinfo);
  110.         //Получаем контрольный хеш
  111.         $checkhash=$this->makehash($ar);
  112.         if($checkhash!=$newhash)
  113.         {//Хеш подделан
  114.             return 0;
  115.         }
  116.         else
  117.         {
  118.             if(isset($ip) and $ip!=$ar[2])
  119.                 $ar[]=-1; //Хеш подлинный не совпал IP
  120.             else
  121.                 $ar[]=1; //Хеш подлинный IP совпадает
  122.             return $ar;
  123.         }
  124.     }
  125. }
  126.  
  127.  
  128. $crypt=new SegCrypt();
  129. //Можно использовать функцию для генерации ключа или использовать уже готовый ключ
  130. $crypt->key=$crypt->seg_word(); //$crypt->key=base64_decode('46vRKP0TiAEecock');
  131. //Кодируем
  132. $hash=$crypt->encode('911','1','123.11.23.11');
  133. //Декодируем и выводим
  134. print_r($crypt->decode($hash, $_SERVER['REMOTE_ADDR']));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement