<?
 
    /**
 
    * Simple and easy secure encrypted unique signature
 
    *
 
    * Basically this algorithm provides a unique signature for a specific visitor
 
    *
 
    * @requirements  PHP 5.x 
 
    *                PEAR Crypt HMAC2    <http://pear.php.net/package/Crypt_HMAC2>
 
    *                PEAR Net User Agent <http://pear.php.net/package/Net_UserAgent_Detect/>
 
    * @usage         
 
    *                require_once 'class.signature.php';    
 
    *                $sign = new signature();
 
    *                $signature = $sign->create();
 
    *
 
    * @category    Cryptography
 
    * @package     Safe_Signature
 
    * @author      Lopo Lencastre de Almeida, iPublicis - Internet Agency, Portugal <http://www.ipublicis.com>
 
    * @license     http://opensource.org/licenses/lgpl-3.0.html GNU Lesser General Public License v3
 
    * @version     $Id: class.signature.php,v 1.0 2008/11/25 12:12:09 humaneasy Exp $
 
    * @link        http://www.phpclasses.org/safe_signature
 
    * @donations   http://smsh.me/7kit
 
    **/
 
 
    class signature {
 
 
       /**
 
        * Convert hexadecimal value to a Base64 string
 
        *
 
        * This method converts any given hexadecimal string to the corresponding Base64 string
 
        *
 
        * @access    private
 
        * @param     string    Hexadecimal string
 
        * @return    string    Base64 string
 
        **/
 
        protected function _hex2b64 ($str)
 
        {
 
            $raw = '';
 
            for ($i=0; $i < strlen($str); $i+=2)
 
            {
 
                $raw .= chr(hexdec(substr($str, $i, 2)));
 
            }
 
            return base64_encode($raw);
 
    }
 
 
       /**
 
        * Create CRC16 value
 
        *
 
        * Returns CRC16 of a string as int value. Used internaly.
 
        *
 
        * @access    private
 
        * @param     string    Input string
 
        * @return    string    CRC16 int
 
        **/
 
        protected function _crc16($string) {
 
            $crc = 0xFFFF;
 
          for ($x = 0; $x < strlen ($string); $x++) {
 
               $crc = $crc ^ ord($string[$x]);
 
               for ($y = 0; $y < 8; $y++) {
 
                     if (($crc & 0x0001) == 0x0001) {
 
                           $crc = (($crc >> 1) ^ 0xA001);
 
                     } else { 
 
                    $crc = $crc >> 1; 
 
                }
 
            }
 
          }
 
          return $crc;
 
    } 
 
 
       /**
 
        * Create the signature
 
        * 
 
        * Method used for signature generation
 
        * 
 
        * @access   public
 
        * @param    none
 
        * @return   string    Encoded encrypted signature
 
        */
 
        public function create() 
 
    {
 
            $ip_address = $_SERVER['REMOTE_ADDR'];
 
            $browser = serialize(array('browser'           => Net_UserAgent_Detect::_getStaticProperty('browser'),
 
                                   'features'          => Net_UserAgent_Detect::_getStaticProperty('features'),
 
                                   'leadingIdentifier' => Net_UserAgent_Detect::_getStaticProperty('leadingIdentifier'),
 
                                   'majorVersion'      => Net_UserAgent_Detect::_getStaticProperty('majorVersion'),
 
                                   'options'           => Net_UserAgent_Detect::_getStaticProperty('options'),
 
                                   'os'                => Net_UserAgent_Detect::_getStaticProperty('os'),
 
                                   'quirks'            => Net_UserAgent_Detect::_getStaticProperty('quirks'),
 
                                   'subVersion'        => Net_UserAgent_Detect::_getStaticProperty('subVersion'),
 
                                   'userAgent'         => Net_UserAgent_Detect::_getStaticProperty('userAgent'),
 
                                   'version'           => Net_UserAgent_Detect::_getStaticProperty('version'),
 
                                    ));
 
 
            $nonce = $this->_crc16($browser);
 
            $secretKey = md5($this->_crc16($ip_address));   
 
 
            $strToSign = $ip_address . "\n" . $browser . "\n" . $nonce;
 
            $hasher = new Crypt_HMAC2($secretKey, "sha256");
 
 
            return urlencode ($this->_hex2b64($hasher->hash($strToSign)));
 
    }
 
    }
 
?>
 
 
 |