316 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			316 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | /** | ||
|  |  * Crypt_RSA allows to do following operations: | ||
|  |  *     - key pair generation | ||
|  |  *     - encryption and decryption | ||
|  |  *     - signing and sign validation | ||
|  |  * | ||
|  |  * PHP versions 4 and 5 | ||
|  |  * | ||
|  |  * LICENSE: This source file is subject to version 3.0 of the PHP license | ||
|  |  * that is available through the world-wide-web at the following URI: | ||
|  |  * http://www.php.net/license/3_0.txt.  If you did not receive a copy of | ||
|  |  * the PHP License and are unable to obtain it through the web, please | ||
|  |  * send a note to license@php.net so we can mail you a copy immediately. | ||
|  |  * | ||
|  |  * @category  Encryption | ||
|  |  * @package   Crypt_RSA | ||
|  |  * @author    Alexander Valyalkin <valyala@gmail.com> | ||
|  |  * @copyright 2005 Alexander Valyalkin | ||
|  |  * @license   http://www.php.net/license/3_0.txt  PHP License 3.0 | ||
|  |  * @version   CVS: $Id: Key.php,v 1.6 2009/01/05 08:30:29 clockwerx Exp $ | ||
|  |  * @link      http://pear.php.net/package/Crypt_RSA | ||
|  |  */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * RSA error handling facilities | ||
|  |  */ | ||
|  | require_once 'Crypt/RSA/ErrorHandler.php'; | ||
|  | 
 | ||
|  | /** | ||
|  |  * loader for RSA math wrappers | ||
|  |  */ | ||
|  | require_once 'Crypt/RSA/MathLoader.php'; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Crypt_RSA_Key class, derived from Crypt_RSA_ErrorHandler | ||
|  |  * | ||
|  |  * Provides the following functions: | ||
|  |  *  - getKeyLength() - returns bit key length | ||
|  |  *  - getExponent() - returns key exponent as binary string | ||
|  |  *  - getModulus() - returns key modulus as binary string | ||
|  |  *  - getKeyType() - returns type of the key (public or private) | ||
|  |  *  - toString() - returns serialized key as string | ||
|  |  *  - fromString($key_str) - static function; returns key, unserialized from string | ||
|  |  *  - isValid($key) - static function for validating of $key | ||
|  |  * | ||
|  |  * Example usage: | ||
|  |  *    // create new 1024-bit key pair
 | ||
|  |  *    $key_pair = new Crypt_RSA_KeyPair(1024); | ||
|  |  *  | ||
|  |  *    // get public key (its class is Crypt_RSA_Key)
 | ||
|  |  *    $key = $key_pair->getPublicKey(); | ||
|  |  * | ||
|  |  *    // get key length
 | ||
|  |  *    $len = $key->getKeyLength(); | ||
|  |  * | ||
|  |  *    // get modulus as string
 | ||
|  |  *    $modulus = $key->getModulus(); | ||
|  |  * | ||
|  |  *    // get exponent as string
 | ||
|  |  *    $exponent = $key->getExponent(); | ||
|  |  * | ||
|  |  *    // get string represenation of key (use it instead of serialization of Crypt_RSA_Key object)
 | ||
|  |  *    $key_in_str = $key->toString(); | ||
|  |  * | ||
|  |  *    // restore key object from string using 'BigInt' math wrapper
 | ||
|  |  *    $key = Crypt_RSA_Key::fromString($key_in_str, 'BigInt'); | ||
|  |  * | ||
|  |  *    // error check
 | ||
|  |  *    if ($key->isError()) { | ||
|  |  *        echo "error while unserializing key object:\n"; | ||
|  |  *        $erorr = $key->getLastError(); | ||
|  |  *        echo $error->getMessage(), "\n"; | ||
|  |  *    } | ||
|  |  * | ||
|  |  *    // validate key
 | ||
|  |  *    if (Crypt_RSA_Key::isValid($key)) echo 'valid key'; | ||
|  |  *    else echo 'invalid key'; | ||
|  |  * | ||
|  |  *    // using factory() method instead of constructor (it returns PEAR_Error object on failure)
 | ||
|  |  *    $rsa_obj = &Crypt_RSA_Key::factory($modulus, $exp, $key_type); | ||
|  |  *    if (PEAR::isError($rsa_obj)) { | ||
|  |  *        echo "error: ", $rsa_obj->getMessage(), "\n"; | ||
|  |  *    } | ||
|  |  * | ||
|  |  * @category  Encryption | ||
|  |  * @package   Crypt_RSA | ||
|  |  * @author    Alexander Valyalkin <valyala@gmail.com> | ||
|  |  * @copyright 2005 Alexander Valyalkin | ||
|  |  * @license   http://www.php.net/license/3_0.txt  PHP License 3.0 | ||
|  |  * @version   Release: @package_version@ | ||
|  |  * @link      http://pear.php.net/package/Crypt_RSA | ||
|  |  * @access    public | ||
|  |  */ | ||
|  | class Crypt_RSA_Key extends Crypt_RSA_ErrorHandler | ||
|  | { | ||
|  |     /** | ||
|  |      * Reference to math wrapper object, which is used to | ||
|  |      * manipulate large integers in RSA algorithm. | ||
|  |      * | ||
|  |      * @var object of Crypt_RSA_Math_* class | ||
|  |      * @access private | ||
|  |      */ | ||
|  |     var $_math_obj; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * shared modulus | ||
|  |      * | ||
|  |      * @var string | ||
|  |      * @access private | ||
|  |      */ | ||
|  |     var $_modulus; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * exponent | ||
|  |      * | ||
|  |      * @var string | ||
|  |      * @access private | ||
|  |      */ | ||
|  |     var $_exp; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * key type (private or public) | ||
|  |      * | ||
|  |      * @var string | ||
|  |      * @access private | ||
|  |      */ | ||
|  |     var $_key_type; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * key length in bits | ||
|  |      * | ||
|  |      * @var int | ||
|  |      * @access private | ||
|  |      */ | ||
|  |     var $_key_len; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Crypt_RSA_Key constructor. | ||
|  |      * | ||
|  |      * You should pass in the name of math wrapper, which will be used to | ||
|  |      *        perform different operations with big integers. | ||
|  |      *        See contents of Crypt/RSA/Math folder for examples of wrappers. | ||
|  |      *        Read docs/Crypt_RSA/docs/math_wrappers.txt for details. | ||
|  |      * | ||
|  |      * @param string $modulus       key modulus | ||
|  |      * @param string $exp           key exponent | ||
|  |      * @param string $key_type      type of the key (public or private) | ||
|  |      * @param string $wrapper_name  wrapper to use | ||
|  |      * @param string $error_handler name of error handler function
 | ||
|  |      * | ||
|  |      * @access public | ||
|  |      */ | ||
|  |     function Crypt_RSA_Key($modulus, $exp, $key_type, $wrapper_name = 'default', $error_handler = '') | ||
|  |     { | ||
|  |         // set error handler
 | ||
|  |         $this->setErrorHandler($error_handler); | ||
|  |         // try to load math wrapper $wrapper_name
 | ||
|  |         $obj = &Crypt_RSA_MathLoader::loadWrapper($wrapper_name); | ||
|  |         if ($this->isError($obj)) { | ||
|  |             // error during loading of math wrapper
 | ||
|  |             $this->pushError($obj); // push error object into error list
 | ||
|  |             return; | ||
|  |         } | ||
|  |         $this->_math_obj = &$obj; | ||
|  | 
 | ||
|  |         $this->_modulus = $modulus; | ||
|  |         $this->_exp = $exp; | ||
|  | 
 | ||
|  |         if (!in_array($key_type, array('private', 'public'))) { | ||
|  |             $this->pushError('invalid key type. It must be private or public', CRYPT_RSA_ERROR_WRONG_KEY_TYPE); | ||
|  |             return; | ||
|  |         } | ||
|  |         $this->_key_type = $key_type; | ||
|  | 
 | ||
|  |         /* check length of modulus & exponent ( abs(modulus) > abs(exp) ) */ | ||
|  |         $mod_num = $this->_math_obj->bin2int($this->_modulus); | ||
|  |         $exp_num = $this->_math_obj->bin2int($this->_exp); | ||
|  | 
 | ||
|  |         if ($this->_math_obj->cmpAbs($mod_num, $exp_num) <= 0) { | ||
|  |             $this->pushError('modulus must be greater than exponent', CRYPT_RSA_ERROR_EXP_GE_MOD); | ||
|  |             return; | ||
|  |         } | ||
|  | 
 | ||
|  |         // determine key length
 | ||
|  |         $this->_key_len = $this->_math_obj->bitLen($mod_num); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Crypt_RSA_Key factory. | ||
|  |      * | ||
|  |      * @param string $modulus       key modulus | ||
|  |      * @param string $exp           key exponent | ||
|  |      * @param string $key_type      type of the key (public or private) | ||
|  |      * @param string $wrapper_name  wrapper to use | ||
|  |      * @param string $error_handler name of error handler function
 | ||
|  |      * | ||
|  |      * @return object   new Crypt_RSA_Key object on success or PEAR_Error object on failure | ||
|  |      * @access public | ||
|  |      */ | ||
|  |     function factory($modulus, $exp, $key_type, $wrapper_name = 'default', $error_handler = '') | ||
|  |     { | ||
|  |         $obj = new Crypt_RSA_Key($modulus, $exp, $key_type, $wrapper_name, $error_handler); | ||
|  |         if ($obj->isError()) { | ||
|  |             // error during creating a new object. Retrurn PEAR_Error object
 | ||
|  |             return $obj->getLastError(); | ||
|  |         } | ||
|  |         // object created successfully. Return it
 | ||
|  |         return $obj; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Calculates bit length of the key | ||
|  |      * | ||
|  |      * @return int    bit length of key | ||
|  |      * @access public | ||
|  |      */ | ||
|  |     function getKeyLength() | ||
|  |     { | ||
|  |         return $this->_key_len; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Returns modulus part of the key as binary string, | ||
|  |      * which can be used to construct new Crypt_RSA_Key object. | ||
|  |      * | ||
|  |      * @return string  modulus as binary string | ||
|  |      * @access public | ||
|  |      */ | ||
|  |     function getModulus() | ||
|  |     { | ||
|  |         return $this->_modulus; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Returns exponent part of the key as binary string, | ||
|  |      * which can be used to construct new Crypt_RSA_Key object. | ||
|  |      * | ||
|  |      * @return string  exponent as binary string | ||
|  |      * @access public | ||
|  |      */ | ||
|  |     function getExponent() | ||
|  |     { | ||
|  |         return $this->_exp; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Returns key type (public, private) | ||
|  |      * | ||
|  |      * @return string  key type (public, private) | ||
|  |      * @access public | ||
|  |      */ | ||
|  |     function getKeyType() | ||
|  |     { | ||
|  |         return $this->_key_type; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Returns string representation of key | ||
|  |      * | ||
|  |      * @return string  key, serialized to string | ||
|  |      * @access public | ||
|  |      */ | ||
|  |     function toString() | ||
|  |     { | ||
|  |         return base64_encode( | ||
|  |             serialize( | ||
|  |                 array($this->_modulus, $this->_exp, $this->_key_type) | ||
|  |             ) | ||
|  |         ); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Returns Crypt_RSA_Key object, unserialized from | ||
|  |      * string representation of key. | ||
|  |      * | ||
|  |      * optional parameter $wrapper_name - is the name of math wrapper, | ||
|  |      * which will be used during unserialization of this object. | ||
|  |      * | ||
|  |      * This function can be called statically: | ||
|  |      *     $key = Crypt_RSA_Key::fromString($key_in_string, 'BigInt'); | ||
|  |      * | ||
|  |      * @param string $key_str      RSA key, serialized into string | ||
|  |      * @param string $wrapper_name optional math wrapper name | ||
|  |      * | ||
|  |      * @return object        key as Crypt_RSA_Key object | ||
|  |      * @access public | ||
|  |      * @static | ||
|  |      */ | ||
|  |     function fromString($key_str, $wrapper_name = 'default') | ||
|  |     { | ||
|  |         list($modulus, $exponent, $key_type) = unserialize(base64_decode($key_str)); | ||
|  |         $obj = new Crypt_RSA_Key($modulus, $exponent, $key_type, $wrapper_name); | ||
|  |         return $obj; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Validates key | ||
|  |      * This function can be called statically: | ||
|  |      *    $is_valid = Crypt_RSA_Key::isValid($key) | ||
|  |      * | ||
|  |      * Returns true, if $key is valid Crypt_RSA key, else returns false | ||
|  |      * | ||
|  |      * @param object $key Crypt_RSA_Key object for validating | ||
|  |      * | ||
|  |      * @return bool        true if $key is valid, else false | ||
|  |      * @access public | ||
|  |      */ | ||
|  |     function isValid($key) | ||
|  |     { | ||
|  |         return (is_object($key) && strtolower(get_class($key)) === strtolower(__CLASS__)); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | ?>
 |