Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //@author Andriy Chaika 2011
- class SegCrypt
- {
- var $key; //Длина 12 символов
- public function __construct($key='')
- {
- //Запись текущего ключа
- if(strlen($key)==12)
- $this->key=$key;
- }
- //Генерирует ключ 12 символов
- public function seg_word()
- {
- $text='';
- $ar=array();
- //Игнорируем символы 0123456789-.
- for($i=45;$i<=57;$i++)
- {
- $ar[$i]=true;
- }
- //Генерируем сам ключ, используя случайные символы
- for($i=0; $i<12; $i++)
- {
- do
- {
- $num=rand(1,255);
- }
- while (isset($ar[$num]) and $ar[$num]);
- $ar[$num]=true;
- $text.=chr($num);
- }
- return $text;
- }
- //Кодируем слово ключом
- public function seg_encode($text)
- {
- if(isset($this->key))
- return strtr($text, '0123456789.-', $this->key);
- else
- return '';
- }
- //Раскодируем слово ключом
- public function seg_decode($text)
- {
- if(isset($this->key))
- return strtr($text, $this->key, '0123456789.-');
- else
- return '';
- }
- //Создание хеша для проверки
- private function makehash($ar)
- {
- //Здесь может быть заложен любой алгоритм для получения тестового хеша
- $ckey=strrev($this->key);
- return md5(implode($ckey, $ar),true);
- }
- //Кодирование информации
- public function encode($userid, $group, $ip)
- {
- //Будем кодировать ID пользователя, его группу и IP
- $ar=array($userid,$group,$ip);
- //Получаем хеш, кодируем в base64, убираем в конце ==, и разворачиваем задом на перед
- $hash=strrev(substr(base64_encode($this->makehash($ar)),0,22));
- //Кодируем нашу информацию своим ключом
- $info=$this->seg_encode(implode('-', $ar));
- //Теперь снова в base64, убираем в конце =, и разворачиваем задом на перед
- $info=strrev(str_replace('=','',base64_encode($info)));
- //Теперь разделим строку с информацией на 3 части (остаток от деления на 3 идет в
- //первую часть)
- $len=strlen($info);
- $p1=$len%3;
- $p1=$p1+(($len-$p1)/3);
- $p2=$len-$p1;
- $part1=substr($info,0,$p1);
- $part2=substr($info,$p1,$p2);
- //Возвращаем нашу зашифрованую строку
- return $part1.$hash.$part2;
- }
- //Декодирование информации
- public function decode($sumhash, $ip=null)
- {
- //Рассчитываем длину частей строки
- $len=strlen($sumhash);
- $parts=$len-22;
- $p1=$parts%3;
- $p1=$p1+(($parts-$p1)/3);
- $p2=$parts-$p1;
- //Получаем левую часть
- $left=substr($sumhash,0,$p1);
- //Получаем хеш, разворачиваем его назад, дописываем ==
- $hash=strrev(substr($sumhash,$p1,22)).'==';
- //Правую часть
- $right=substr($sumhash,$p1+22,$p2);
- //Склеиваем часть с информацией и разворачиваем назад
- $info=strrev($left.$right);
- //Дописываем недостающие =
- while (strlen($info)%4>0)
- $info.='=';
- //Декодируем хеш
- $newhash=base64_decode($hash);
- //Декодируем информация
- $newinfo=$this->seg_decode(base64_decode($info));
- $ar=explode('-',$newinfo);
- //Получаем контрольный хеш
- $checkhash=$this->makehash($ar);
- if($checkhash!=$newhash)
- {//Хеш подделан
- return 0;
- }
- else
- {
- if(isset($ip) and $ip!=$ar[2])
- $ar[]=-1; //Хеш подлинный не совпал IP
- else
- $ar[]=1; //Хеш подлинный IP совпадает
- return $ar;
- }
- }
- }
- $crypt=new SegCrypt();
- //Можно использовать функцию для генерации ключа или использовать уже готовый ключ
- $crypt->key=$crypt->seg_word(); //$crypt->key=base64_decode('46vRKP0TiAEecock');
- //Кодируем
- $hash=$crypt->encode('911','1','123.11.23.11');
- //Декодируем и выводим
- print_r($crypt->decode($hash, $_SERVER['REMOTE_ADDR']));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement